部署教程:如何在本地运行稳定的扩散以生成图像
我是纯菜鸡,所以这些都是一些基础的问题hhh
1.准备时遇到的问题
1.1 看 python 版本
一开始我用的是
python --version
然后终端提示我说我没有 python,于是我就想着装一个
sudo apt-get update
yes | sudo apt-get install python3.8
然后终端又提示我 python3.8 没有可安装候选
问了别人才知道应该是我已经下载好了一个 python 版本
所以用这个看 python 版本
python3 --version
2.原版 stable diffusion
2.1 报错 ModuleNotFoundError 'cv2' 或 'torch' 等
我看了一下,我已经配过环境了
conda env create -f environment.yaml
在终端里面搜索是可以搜到 opencv 的,很神奇
然后我也 conda activate ldm 了
但是之后根据我的多次试错,我发现只要是没进 ldm 就会这样
我关掉终端,在克隆的 stable-diffusion 文件夹里重新打开终端,再 conda activate ldm,再运行,就没有这个报错了,很神奇
2.2 报错 einsum():operands do not broadcast with remapped shaped
在网上看到这可能是和图片尺寸有关,我之前的图片尺寸是 256 256,我改成256 512 就没有这个问题了,神奇
结合报错的意思就是有些图片尺寸映射不了?好蠢
2.3 Bash 脚本报错 CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'
为了方便测试,可以使用脚本运行 stable-diffusion
在 stable-diffusion 文件夹里新建一个文件,随便命名为 run.sh
vim run.sh
按 i 进入插入模式,复制以下内容,再按 esc 退出插入模式,再输出 :wq 写入保存并退出 vim
#!/bin/bash
conda activate ldm
python scripts/txt2img.py \
--from-file prompts.txt \
--ckpt sd-v1-4.ckpt \
--outdir generated-images \
--skip_grid \
--ddim_steps 100 \
--n_iter 3 \
--H 512 \
--W 256 \
--n_samples 3 \
--scale 8.0 \
--seed 119
在 stable-diffusion 文件夹里新建一个 prompts.txt,里面放的是用于转图像的文本
如果直接运行的话会报错 shell 没有 conda init
./run.sh
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'. To initialize your shell, run
$ conda init <SHELL_NAME>Currently supported shells are:
- bash
- fish
- tcsh
- xonsh
- zsh
- powershell
See 'conda init --help' for more information and options.
IMPORTANT: You may need to close and restart your shell after running 'conda init'.
于是我按照这个报错说了,运行了 conda init bash,然后再 ./run.sh,或者是重启终端之后再 ./run.sh,都不行,还是同样的报错
上网搜索之后看到别人的回复是在脚本名称前加一个 source
Python - 通过 shell 脚本激活 conda env
source ./run.sh
这样子就可以正常运行了
原因应该是 “sourcing will run the lines in your script in the current shell, rather than enveloping them in a subshell”
就是说 bash 脚本运行在子 shell 中,而加一个 source 就运行在当前 shell 中
或许是子 shell 获取不到 conda 的环境吧
2.4 显卡内存不足 CUDA out of memory
我是 6g 的 2060
报错 RuntimeError: CUDA error: all CUDA-capable devices are busy or unavailable
在网上搜到遇到相同问题的帖子:
nvidia-smi --query | grep 'Compute Mode'
这个帖子说,是显卡的计算模式的问题
跟计算模式相关的帖子:
使用指令查看计算模式:
nvidia-smi --query | grep 'Compute Mode'
我这里看到的确实是默认模式
之后我再运行了两次,一共三次,每次报错都不同,但最后一次明确说是没内存,所以我觉得问题还是内存不足
RuntimeError: CUDA out of memory. Tried to allocate 512.00 MiB (GPU 0; 5.79 GiB total capacity; 4.04 GiB already allocated; 147.44 MiB free; 4.16 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
使用命令查看显卡状态:
nvidia-smi
我看到目前空间是 381MiB / 6144MiB
这个报错说分配了 4.04 GiB 之后就只剩下 147.44 MiB 空余了,说明当前内存碎片也挺多的?
我同学说可以在 tty 下尽可能关闭多余进程,整理内存
我在 tty 下看显卡空间占用确实就宽松了很多
有一次测试可以达到 1MiB / 6144MiB
但是还是会有报错
所以基本确定在 6g 显卡上是运行不了原版的 stable diffusion 了
3.优化版 stable diffusion
有大佬做过 stable diffusion 的优化版
在小于 10 Gb VRAM 的 GPU 上运行 Stable Diffusion
于是我开始尝试使用 github.com/basujindal/…
3.1 报错 ModuleNotFoundError 'ldm'
一开始我运行 conda activate ldm 的时候会报错 Python ModuleNotFoundError 'ldm',就很离谱
我就想是不是我之间的环境不能用在这个新的库
于是我搜了一下怎么删 conda 环境
用指令删除 conda 环境
conda env remove -n ldm
然后在库中运行一次 conda env create -f environment.yaml,之后就可以 conda activate ldm 了
3.2 运行
ckpt 改名为 model.ckpt 放到 data 文件夹
同样在目录新建 prompts.txt 里面放上联想文本
run.sh 作相应的修改
#!/bin/bash
conda activate ldm
python optimizedSD/optimized_txt2img.py \
--from-file prompts.txt \
--ckpt data/model.ckpt \
--outdir generated-images \
--skip_grid \
--ddim_steps 100 \
--n_iter 3 \
--H 512 \
--W 256 \
--n_samples 3 \
--scale 8.0 \
--seed 119
运行
source ./run.sh
终于跑通了,泪奔
其他应用比如图像转图像也是类似做法,就不必多说了
3.3 ModuleNotFoundError: No module named 'gradio'
启动 gradio 端时发生的错误
如果已经下载了 gradio
pip install gradio
但是仍然提示缺少,那么可以先 conda activate ldm 然后再 pip install gradio 一次
我就是这样解决的hhh很玄学
估计是因为这个仓库的环境名和原版的环境名都叫 ldm?
3.4 FileNotFoundError: [Errno 2] No such file or directory: 'models/ldm/stable-diffusion-v1/model.ckpt'
启动 gradio 端时发生的错误
这个就是把 ckpt 文件复制到相应的位置就行了
4.webui
因为 NovelAI 的事发现 AUTOMATIC1111 的 webui 广受欢迎
试了一下,真香
比单纯的 gradio 整合了好多功能
唯一的遗憾就是没有在 readme 里面说运行是运行 launch.py