安装

趁着这波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),在安装过程中遇到了以下一些问题

  1. 提示Cannot locate TCMalloc,但是该问题不影响后续安装,这是google的一个优化,为了完美,我们解决一下这个问题,额外安一个包:github.com/AUTOMATIC1111/stable-diffusion-webui/issues/10117

     apt install --no-install-recommends google-perftools
  2. 脚本用pip安完各种依赖后,最后遇到了报错:Torch is not able to use GPU

    • 查issue发现各种环境下多种原因均可导致该问题,且类似的issue时间长、讨论多,且长期未关闭。
    • 大多数讨论是围绕pytorch+cuda的安装匹配问题,推测可能是自动脚本对显卡等环境的兼容性还是不够完美?

docker部署

上面的问题感觉不好搞定,于是准备换基于docker的项目试一下。同样找到一个很热门的项目:Setup · AbdBarho/stable-diffusion-webui-docker Wiki (github.com)。按照以下流程开始部署。

  1. 由于项目的wiki里对安装的描述很简单,主要就是两行docker-compose,于是顺理成章先准备docker-compose。

  2. 在OS中安装docker(24.0.7)。安完后发现新版本的docker已经自带docker-compose(docker compose v2将docker-compose整合进了docker,开箱即用),并且使用方式改成了`docker compose子命令的方式

  3. 完成后,立即尝试wiki里的两条compose命令。

  4. 第一个compose命令主要是下载模型文件。第一次跑,遇到了TLS被中断的问题,重新启动下载后完成。看日志,由于用了aria2下载,可以断点续传,所以不用太担心网络中断问题。

  5. 接下来就是启动stable diffusion ui了。这一步就遇到了看起来比较麻烦,但解决起来没那么麻烦的问题了。

    1. 问题:could not select device driver "nvidia" with capabilities。看到这个报错,突然想起来以前看过一些k8s使用GPU的文档,使用GPU的容器是需要使用nvidia的特殊容器运行时的。于是搜一下issue,发现这个问题已经被整理进了FAQ里:FAQ · AbdBarho/stable-diffusion-webui-docker Wiki (github.com)

    2. 按照FAQ里的引导,来到Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.14.3 documentation,这是nvidia容器运行时SDK的安装文档,在ubuntu安装也很简单,几行命令的事。

    3. 安装完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
    4. 经过爬issue,同样由于出现该问题的原因多种多样,未能找到很直接解决问题的办法。看这个报错,缺库,推测可能是少安什么东西了。询问做视觉的同学,在linux下nvidia的显卡是需要安驱动+CUDA的。

    5. 回到nvidia container toolkit的安装指引页面,看到最后提到,安装完后是需要继续安装驱动的:Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.14.3 documentation

    6. 按照NVIDIA Driver Installation Quickstart Guide :: NVIDIA Tesla Documentation的文档,安装cuda驱动

    7. 根据Running a Sample Workload — NVIDIA Container Toolkit 1.14.3 documentation,可以通过nvidia-smi或者容器里包装的该命令,确认显卡各种驱动是否工作正常的。安完cuda驱动后,该命令返回的结果是No devices were found

    8. 估计是还需要安显卡驱动,搜索一下,随便找一篇尝试下:Ubuntu下的NVIDIA显卡【驱动&CUDA 安装与卸载】 - Kin_Zhang - 博客园 (cnblogs.com)

      1. 根据这篇文章里说的,ubuntu下安装显卡驱动非常简单,只需要执行ubuntu-drivers autoinstall即可。

      2. 执行后遇到python报错

         UnboundLocalError: local variable 'version' referenced before assignment
      3. 继续google,找到解决办法:ubuntu-drivers "UnboundLocalError: local variable 'version' referenced before assignment" when installing nvidia drivers - Ask Ubuntu

    9. 显卡驱动安装完毕后,激动人心的时刻终于到了。是时候看看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
    10. 尝试跳过nvidia-smi,直接启动stable diffusion webui,容器里会抛出大量异常:"LayerNormKernelImpl" not implemented for 'Half'

    11. 为了看看出现该问题时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                                                 |
        +-----------------------------------------------------------------------------+
    12. 至此,终于可以再次尝试docker compose启动stable diffusion web ui了。这次启动,果然容器运行正常了,web ui也可以正常画图了。

    13. 再回看一开始直接在ubuntu部署的问题,应该也是显卡驱动没装导致的。

参考

文章目录