使用 stable-diffusion.cpp 实现本地文生图

之前在本站分享过使用 PyRotch 在 AMD ROCm 框架实现的 Stable Diffusion 文生图应用配置教程。这个方案需要安装特定版本 PyTorch 且涉及一系列复杂的依赖关系,运行起来也对系统的硬件配置有不小要求。近期又由于 AMD 在新版 ROCm 移除了对于移动版 Radeon 显卡的支持,促使笔者开始寻找替代解决方案,此时发现支持 Vulkan 后端的 stable-diffusion.cpp 是个颇有希望的替代品。

stable-diffusion.cpp 有如下特点:

  • 基于 ggml 的完全 C/C++ 实现,轻量且无过多外部依赖
  • 可直接读取 safetensor 类型的模型,无需预先转换成 gguf
  • 支持 SD 全系列、Flux 和 Photomaker 模型
  • 支援 CPU/AVX512、CUDA、ROCm、Metal、Vulkan 甚至 Intel SYCL 后端

其中对于 Vulkan 这一跨平台跨厂商的支持尤其值得一提,简化了在复杂多样环境下的部署难度。下面以 Fedora 40 为例说明如何安装和配置使用 Vulkan 后端的 stable-diffusion.cpp。

安装编译依赖

Vulkan 后端编译所需的全部依赖都可以在绝大多数发行版软件仓库找到,在 Fedora 40 上运行以下命令即可安装:

pkcon install git cmake ccache glslc glslang vulkan-headers vulkan-validation-layers vulkan-tools vulkan-loader-devel 

获取项目最新源代码

git clone --recursive https://github.com/leejet/stable-diffusion.cpp
cd stable-diffusion.cpp

代码整体很小,不过过程中依然注意需要保持网络环境稳定。

编译及安装

参照其项目首页,可知需要额外传入编译参数启用 Vulkan 后端支持

mkdir build && cd build
cmake .. -DSD_VULKAN=ON
cmake --build . --config Release

依赖关系没问题的话,编译过程在一般笔记本5分钟之内即可完成。

测试并安装

项目首页的各个例子参考了stable-diffusion-webui 的目录结构,均假设模型文件存放在固定目录下,类似的,我们亦可创建对应的输出文件存放路径。

mkdir ../models ../outputs

将下载的模型文件移动到刚才创建的 models 目录,这里以 SD3 Medium 为例,之后可以尝试如下命令验证下结果:

./bin/sd -m ../models/sd3_medium_incl_clips_t5xxlfp16.safetensors -W 1024 -H 1024 -s -1 --cfg-scale 7.0 --sampling-method euler --vae-on-cpu -o ../outputs/$(date +"%Y%m%dT%H%M%S").png -p 'a lovely penguin holding a sign saying \"LinuxTOY.org\", defocus, background of a server room'

关于参数有几点需要注意的:

  • --vae-on-cpu 几乎是必备的
  • 随机种子默认是固定的 42,使用任意负数代表随机
  • 可以使用 $(date +"%Y%m%dT%H%M%S").png 用作包含时间戳的输出文件名

在笔者配备了 AMD Radeon 7800XT 显卡的机器上,得出了如下的图片

gajim 1.4 main window

这个结果大约用时 1分20秒,和之前使用 PyTorch 方案的几乎无差别。

如果以上结果均未遇到问题的话,那么就可以将其安装到系统目录便于其他用户访问。

sudo make install

至此全部配置完成

总结

相比 PyTorch 版本的 stablde-diffusion 配置来说,这个 C++ 版本的实现在依赖关系和安装体积上要简练很多;而相比其他的跨平台跨厂商的实现,利用 Vulkan 后端能实现显卡的满负载运行,避免了算力的浪费。目前这个项目活跃度很高,值得对于本地文生图方案感兴趣的童鞋持续关注。

Read More: