[Stable Diffusion] Linux RTX2060 部署 Stable Diffusion 的坑

2,404 阅读5分钟

部署教程:如何在本地运行稳定的扩散以生成图像

我是纯菜鸡,所以这些都是一些基础的问题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

在网上搜到遇到相同问题的帖子:

所有支持 CUDA 的设备都忙或不可用

nvidia-smi  --query | grep 'Compute Mode'

这个帖子说,是显卡的计算模式的问题

跟计算模式相关的帖子:

将 cuda 计算模式切换到默认模式

使用指令查看计算模式:

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 环境

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

终于跑通了,泪奔

截图 2022-10-06 09-05-28.png

其他应用比如图像转图像也是类似做法,就不必多说了

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