使用docker部署stable diffusion webui
安装
趁着这波AI浪潮,熟悉一下英伟达生态,把玩一下stable diffusion
硬件环境:unraid-workstation篇0-装机篇 - Lwabish Tech Index (wubw.fun)
物理机器安装了基于kvm的虚拟化平台unraid
在unraid建一台vm,全新安装ubuntu 22.04 LTS Server,把3060ti显卡直通给vm
ubuntu直接部署
首先从很有名气的一个项目开始:
AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI (github.com),在安装过程中遇到了以下一些问题
-
提示
Cannot locate TCMalloc
,但是该问题不影响后续安装,这是google的一个优化,为了完美,我们解决一下这个问题,额外安一个包:github.com/AUTOMATIC1111/stable-diffusion-webui/issues/10117apt install --no-install-recommends google-perftools
-
脚本用pip安完各种依赖后,最后遇到了报错:
Torch is not able to use GPU
。- 查issue发现各种环境下多种原因均可导致该问题,且类似的issue时间长、讨论多,且长期未关闭。
- 大多数讨论是围绕pytorch+cuda的安装匹配问题,推测可能是自动脚本对显卡等环境的兼容性还是不够完美?
docker部署
上面的问题感觉不好搞定,于是准备换基于docker的项目试一下。同样找到一个很热门的项目:Setup · AbdBarho/stable-diffusion-webui-docker Wiki (github.com)。按照以下流程开始部署。
-
由于项目的wiki里对安装的描述很简单,主要就是两行docker-compose,于是顺理成章先准备docker-compose。
-
在OS中安装docker(24.0.7)。安完后发现新版本的docker已经自带docker-compose(docker compose v2将docker-compose整合进了docker,开箱即用),并且使用方式改成了`
docker compose
子命令的方式 -
完成后,立即尝试wiki里的两条compose命令。
-
第一个compose命令主要是下载模型文件。第一次跑,遇到了TLS被中断的问题,重新启动下载后完成。看日志,由于用了aria2下载,可以断点续传,所以不用太担心网络中断问题。
-
接下来就是启动stable diffusion ui了。这一步就遇到了看起来比较麻烦,但解决起来没那么麻烦的问题了。
-
问题:
could not select device driver "nvidia" with capabilities
。看到这个报错,突然想起来以前看过一些k8s使用GPU的文档,使用GPU的容器是需要使用nvidia的特殊容器运行时的。于是搜一下issue,发现这个问题已经被整理进了FAQ里:FAQ · AbdBarho/stable-diffusion-webui-docker Wiki (github.com) -
按照FAQ里的引导,来到Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.14.3 documentation,这是nvidia容器运行时SDK的安装文档,在ubuntu安装也很简单,几行命令的事。
-
安装完toolkit后,再次运行docker compose启动web ui,出现了新的报错:
Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy' nvidia-container-cli: initialization error: load library failed: libnvidia-ml.so.1: cannot open shared object file: no such file or directory: unknown
-
经过爬issue,同样由于出现该问题的原因多种多样,未能找到很直接解决问题的办法。看这个报错,缺库,推测可能是少安什么东西了。询问做视觉的同学,在linux下nvidia的显卡是需要安驱动+CUDA的。
-
回到nvidia container toolkit的安装指引页面,看到最后提到,安装完后是需要继续安装驱动的:Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.14.3 documentation
-
按照NVIDIA Driver Installation Quickstart Guide :: NVIDIA Tesla Documentation的文档,安装cuda驱动
-
根据Running a Sample Workload — NVIDIA Container Toolkit 1.14.3 documentation,可以通过
nvidia-smi
或者容器里包装的该命令,确认显卡各种驱动是否工作正常的。安完cuda驱动后,该命令返回的结果是No devices were found
-
估计是还需要安显卡驱动,搜索一下,随便找一篇尝试下:Ubuntu下的NVIDIA显卡【驱动&CUDA 安装与卸载】 - Kin_Zhang - 博客园 (cnblogs.com)。
-
根据这篇文章里说的,ubuntu下安装显卡驱动非常简单,只需要执行
ubuntu-drivers autoinstall
即可。 -
执行后遇到python报错
UnboundLocalError: local variable 'version' referenced before assignment
-
继续google,找到解决办法:ubuntu-drivers "UnboundLocalError: local variable 'version' referenced before assignment" when installing nvidia drivers - Ask Ubuntu
-
-
显卡驱动安装完毕后,激动人心的时刻终于到了。是时候看看
nvidia-smi
的输出结果了。结果再次遇到问题,发现一旦执行该命令,ubuntu vm就会死机。登录虚拟化平台unraid,可以看到一旦执行该命令,vm就会由started状态变成pause,看vm的日志,可以看到报错:2023-10-30T07:59:52.796276Z qemu-system-x86_64: vfio_err_notifier_handler(0000:01:00.0) Unrecoverable error detected. Please collect any data possible and then kill the guest
-
尝试跳过
nvidia-smi
,直接启动stable diffusion webui,容器里会抛出大量异常:"LayerNormKernelImpl" not implemented for 'Half'
-
为了看看出现该问题时vm的终端是否有什么日志,我调整了下vm的xml,原本只有一块显卡,即3060ti,现在新加了一块虚拟显卡,使用vnc。重启后,再次执行
nvidia-smi
,发现正常输出了结果:root@ubuntu:~# nvidia-smi Mon Oct 30 08:01:43 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.199.02 Driver Version: 470.199.02 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... Off | 00000000:04:00.0 Off | N/A | | 0% 53C P0 1W / 240W | 0MiB / 7982MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
-
至此,终于可以再次尝试docker compose启动stable diffusion web ui了。这次启动,果然容器运行正常了,web ui也可以正常画图了。
-
再回看一开始直接在ubuntu部署的问题,应该也是显卡驱动没装导致的。
-
参考
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。