本文发自 http://www.binss.me/blog/deploy-stable-diffusion-on-docker-of-windows/,转载请注明出处。

背景

近年来,机器学习在很多领域都取得了令人惊喜的应用,比如半年前开始火的绘图 stable diffusion ,再比如最近 openai 的 chatgpt 。我一直想尝试下这些有趣的应用,然而苦于手头上没有合适的硬件。因为这些应用基本都要求有较好的显卡,且一般运行于 Linux 平台。而我手头上唯一一台拥有显卡的设备,是装着 Windows11 的 PC,在去年将其升级到 4070ti 后,主要作为原神和崩3的专用机,其他时间基本处于闲置。最近突然奇想,能不能用这台机来跑机器学习应用呢?经过一番折腾,最终实现了在 Windows 上通过容器运行 stable diffusion 的目标。

实现

物理机安装 Windows11 ,通过 WSL2 完成虚拟化,运行 Ubuntu 20.04 作为 Guest OS 。为了部署的简化,Windows11 通过安装 Docker 来运行相关应用。

系统配置

  1. Windows 开启 WSL2

    管理员身份打开 PowerShell 并运行:

    Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
  2. WSL2 安装 Ubuntu-20.04

    wsl --set-default-version 2
    wsl --install -d Ubuntu-20.04

    安装完后重启 Windows,通过 wsl --list 可以查询到系统:

    适用于 Linux 的 Windows 子系统分发:
    Ubuntu-20.04 (默认)

    打开开始菜单中的 wsl 或者 ubuntu 20.04 都可以拿到 terminal 。

  3. (可选) 支持 ssh 连接到 wsl

    为了方便局域网内的其他设备能够通过 ssh 连接,要么将 ubuntu 通过桥接接到路由器上,要么在 Windows 上通过端口映射将 22 映射到 ubuntu 。我尝试过桥接方式,结果发现 Windows 网络不稳定,特别是 logitech flow 也跪了,无奈放弃,走端口转发:

    netsh interface portproxy add v4tov4 listenaddress=* listenport=22 connectaddress=172.25.179.90 connectport=22

    根据网上文章,建议重装 wsl 的 ssh server :

    sudo apt-get remove openssh-server
    sudo apt-get install openssh-server
    sudo service ssh restart

    Windows11 防火墙放开 22 端口:高级安全防火墙 - 入站规则 - 新建规则,新增 tcp 端口 22 的入站规则

  4. 安装 Docker

    Windows 11 安装 Docker for windows ,安装完后选择 WSL2 的 ubuntu 作为后端

    这里踩了一个坑,装了 4.17.1 发现调用不了 GPU ,无奈降级 4.17.0 ,见 https://github.com/docker/for-win/issues/13324 。据说 4.18.0 修复了这个问题。

  5. 启动容器

    docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu20.04 nvidia-smi

    若能够输出以下内容,表示 docker 调用 GPU 正常:

    Fri Apr  7 12:52:17 2023
    +---------------------------------------------------------------------------------------+
    | NVIDIA-SMI 530.30.02              Driver Version: 531.18       CUDA Version: 12.1     |
    |-----------------------------------------+----------------------+----------------------+
    | 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 RTX 4070 Ti      On | 00000000:01:00.0 Off |                  N/A |
    |  0%   30C    P8                2W / 285W|   3219MiB / 12282MiB |      0%      Default |
    |                                         |                      |                  N/A |
    +-----------------------------------------+----------------------+----------------------+
    
    +---------------------------------------------------------------------------------------+
    | Processes:                                                                            |
    |  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
    |        ID   ID                                                             Usage      |
    |=======================================================================================|
    |    0   N/A  N/A         1      C   /python3.10                               N/A      |
    |    0   N/A  N/A       141      G   /Xwayland                                 N/A      |
    |    0   N/A  N/A     10635      G   /Xwayland                                 N/A      |
    |    0   N/A  N/A     24057      G   /Xwayland                                 N/A      |
    +---------------------------------------------------------------------------------------+

安装 Stable Diffusion

我们配置好了带 GPU 的 docker 环境,接下来就通过 docker 运行 Stable Diffusion 。推荐使用项目 https://github.com/AbdBarho/stable-diffusion-webui-docker

clone 后进到目录,通过 docker compose 启动后:

下载模型:

docker compose --profile download up --build

启动服务:

docker compose --profile auto up

启动后会监听 7860 端口,通过浏览器访问即可:

随后就可以填入魔法咒语画画啦,试试朋友发给我的一组:

prompt:

(Realistic painting style:0.9), (faux traditional media:1.0), masterpiece, best quality, bokeh, depth of field, looking to the side, kamisato ayaka (springbloom missive), kamisato ayaka, official alternate hairstyle, official alternate costume, blunt bangs, butterfly hair ornament, hair flower, blue dress, 1girl, butterfly, grey eyes, flower, hair ornament, light yellow hair, outdoors, solo, hat, sky, blue nails, cloud, bangs, long sleeves, holding, looking at viewer, blue butterfly, blurry, braid, dress, day, blurry foreground, blue sky, breasts, medium breasts, cloudy sky, blush, index finger raised, blue flower, smile, closed mouth, holding fan

negative prompt:

(worst quality, low quality, extra digits, male:1.4)), bad_prompt, (loli, child:1.2), easynegative

开始运行后会有个进度条,生成速度取决于显卡硬件和左侧选择的参数,同等硬件下,生成分辨率越高、batch 越大,耗时越长:

此时 GPU 已经跑满:

加载新模型

自带的模型并不能画二次元小姐姐,我们可以下载模型来画,比如著名的 waifu :

https://huggingface.co/hakurei/waifu-diffusion-v1-4

下载文件目录中的 wd-1-4-anime_e1.ckpt 后,放到 stable-diffusion-webui-docker/data/StableDiffusion 目录下,重启容器,即可在页面左上角的 Stable Diffusion checkpoint 找到该模型,选中后就可以开始大炼小姐姐了。

非常 fancy ,至于画不好手的问题,已经是老生常谈了。