本帖最后由 nicho 于 2024-1-2 18:39 编辑

虽然Raspberry Pi的性能限制了Stable Diffusion的运行效率,但对于在普通 SBC 上能运行 Stable Diffusion还是非常的酷,这个过程对于学习和实验来说是非常有价值的。
实验条件- 系统 :确保Raspberry Pi 5运行的是最新的 Raspberry Pi OS x64
- 硬件:这里是用的是树莓派5的8GB版本,配官方主动散热器,5V4A 电源适配器
- 网络:所需下载的模型较大,约16GB,需要非常稳定的网络连接
实验Stable Diffusion XL 1.0
1. 克隆Stable Diffusion模型:从H站克隆Stable Diffusion XL 1.0模型。
使用命令:
//树莓派默认git 不支持 lfs,需要先额外安装依赖 https://git-lfs.com/
//添加仓库
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
//安装
sudo apt-get install git-lfs
//激活
git lfs install
//拉取模型
git clone --depth=1 https://huggingface.co/vitoplantamura/stable-diffusion-xl-base-1.0-onnxstream
这一步非常耗时,确保下载速度是正常之后,可以去玩一会再回来看了,这一步建议直接在树莓派里面(or VNC)打开 terminal,防止电脑的 ssh 断了就全功尽弃了。。。

2. 编译XNNPACK工具
# 没有 Cmake 的需要先安装
sudo apt install cmake
# 下载仓库
git clone https://github.com/google/XNNPACK.gitcd XNNPACK
# 找回兼容本项目的
commitgit rev-list -n 1 --before="2023-06-27 00:00" master
# 这里可以得到一串字符串(Commit id),将其粘贴到下个命令中
git checkout <上一步得到的COMMIT_ID>
# 编译
mkdir buildcd buildcmake -DXNNPACK_BUILD_TESTS=OFF -DXNNPACK_BUILD_BENCHMARKS=OFF ..
cmake --build . --config Release
make
# 检查,在当前目录应该要有libXNNPACK.a的文件
ls
3. 编译Stable Diffusion exmaple
# 下载仓库
git clone https://github.com/vitoplantamura/OnnxStream.gitcd OnnxStreamcd srcmkdir buildcd build
# 编译,这里因为使用树莓派5,所以这里使用-DMAX_SPEED=ON,-DXNNPACK_DIR则附上在上一步XNNPACK位置,这里自行修改
cmake -DMAX_SPEED=ON -DXNNPACK_DIR=/home/pi/xxx/XNNPACK ..
cmake --build . --config Release
# 检查,在当前目录应该要有名叫 sd 的文件
ls
4. 开始 diffusion,在这里先试试 SD XL 1.0
# 切换到上一步有sd文件的目录
# 命令说明
# --xl 运行stable-diffusion XL 1.0
# --turbo 运行stable-diffusion Turbo 1.0
# --models-path 设置包含stable-diffusion模型的文件夹
# --ops-printf 在推理过程中,将当前操作写入标准输出
# --output 设置输出的 PNG 文件路径
# --decode-latents 跳过扩散过程,直接解码指定的潜变量文件
# --prompt 设置正向prompt
# --neg-prompt 设置负向prompt
# --steps 设置扩散步骤的数量
# --seed 设置seed
# --save-latents 在扩散过程后,将潜变量保存在指定的文件中
# --decoder-calibrate (仅限 SD 1.5)校准量化版本的 VAE 解码器
# --not-tiled (仅限 SDXL 1.0)不使用分块 VAE 解码器
# --ram 使用 RAM WeightsProvider(实验性功能),允许使用大内存
# --rpi 配置模型在普通树莓派上运行,如树莓派 3、4、5
# --rpi-lowmem 配置模型在小内存的树莓派上运行,如Zero2
# 这里使用这部分参数
# --xl 运行stable-diffusion XL 1.0
# --models-path 设置包含stable-diffusion模型的文件夹
# --output 设置输出的 PNG 文件路径
# --prompt 设置正向prompt
# --steps 设置扩散步骤的数量
# --ram 使用RAM WeightsProvider,允许使用大内存,经实验最高 5.3G 内存占用
# --rpi 配置模型在普通树莓派上运行,如树莓派 3、4、5
# 运行
./sd --xl --models-path /home/pi/xxxx/stable-diffusion-xl-base-1.0-onnxstream --output result.png --prompt "A photo of an astronaut riding a horse" --steps 3 --ram --rpi
5. 进程启动后的资源占用(btop)
6. 输出
7. 结果(steps=3),大约耗时25分钟 
可以基本满足 prompt 的元素,但是还不够完美,接下来继续尝试,尝试修改 steps 或者使用 XL1.5,TBD
8. 实验Stable Diffusion 1.5
跑下来Stable Diffusion 1.5的模型尺寸、内存占用、生成速度都要比 XL1.0 要好
1. 克隆Stable Diffusion模型:从H站克隆Stable Diffusion 1.5模型。使用命令:
# 下载模型,并解压到树莓派,1.5 的模型比较小,只有 2G 左右
https://github.com/vitoplantamura/OnnxStream/releases/tag/v0.1
2. 开始 diffusion1.5
# 这次我们调整下参数,切换到 1.5 的模型目录
# 运行./sd --models-path /home/pi/xxx/SD1.5 --output result.png --prompt "A photo of an astronaut riding a horse" --steps 3 --ram --rpi
3. 输出

4. 结果(steps=3),大约耗时4分钟,快了非常多

可以基本满足 prompt 的元素,但是还不够完美,接下来继续尝试,尝试修改 --steps 5
5. 结果(steps=5),大约耗时6分钟

可以看得到宇航员的样子了,接下来继续尝试,尝试修改 --steps 12
6. 结果(steps=12),大约耗时15分钟

继续尝试,TBD
|