快來玩AI畫圖!StableDiffusion模型搭建與使用入門~

程式設計實驗室發表於2023-03-31

前言

最近AI很火?,先是AI畫圖,然後就ChatGPT,後者我已經用了一段時間了,用來寫作文挺不錯的,但OpenAI遮蔽了中國IP,加上使用者太多啥的,用起來沒那麼爽,但沒辦法全球只此一家,只能捏著鼻子用。而AI畫圖就不一樣了,全是開源的,自己部署一下可以玩個爽~

正好我們這有臺2080Ti的工作站,之前用來訓練模型的,現在部署個畫圖應該輕輕鬆鬆,於是就開始了折騰之路~

效果

先看看我生成出來的一些圖片

漢服 COSER
image image
大海 2B小姐姐
image image

Stable Diffusion

AI畫圖有 Novel AIDisco DiffusionStable Diffusion 等模型,為了快速上手,我選擇了最簡單的 Stable Diffusion ~

Stable Diffusion 是一個「文字到影像」的人工智慧模型(AI 繪圖工具),開源且能部署在家用電腦(對硬體要求不高)上。使用 Stable Diffusion,你可以在擁有 6GB 視訊記憶體顯示卡,16GB 記憶體或只依賴 CPU 的電腦上生成影像,並且僅需幾秒鐘的時間,無需進行預處理或後處理。

GitHub上有個專案可以快速將 Stable Diffusion 用 docker 跑起來,還附帶了 UI 介面,方便得很,本文用的就是這個專案。

專案地址: https://github.com/AbdBarho/stable-diffusion-webui-docker

前置條件

  • Linux系統(煉丹繞不開的,推薦Ubuntu系;Windows可以藉助WSL,但折騰)
  • NVIDIA顯示卡,6G以上視訊記憶體(當然AMD顯示卡或者沒顯示卡用CPU跑也行,但不在本文討論範圍)
  • CUDA版本 11.6 以上
  • 通暢的網路(能夠正常訪問GitHub、下載模型)

配置docker網路

安裝這個 Stable Diffusion 模型,需要下載很多模型,單純基礎模型和資料就得十幾個GB,這些都是要從國外的伺服器下載,所以為了安裝順利,先來配置一下docker的代理。

Dockerd 代理

在執行docker pull時,是由守護程式dockerd來執行。因此,代理需要配在dockerd的環境中。而這個環境,則是受systemd所管控,因此實際是systemd的配置。

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/proxy.conf

在這個 proxy.conf 檔案(可以是任意 *.conf 的形式)中,新增以下內容:

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"

其中,proxy.example.com:8080 要換成可用的免密代理。

Container 代理

在容器執行階段,如果需要代理上網,則需要配置 ~/.docker/config.json。以下配置,只在Docker 17.07及以上版本生效。

{
  "proxies": {
    "default": {
      "httpProxy": "http://proxy.example.com:8080",
      "httpsProxy": "http://proxy.example.com:8080",
      "noProxy": "localhost,127.0.0.1,.example.com"
    }
  }
}

這個是使用者級的配置,除了 proxies,docker login 等相關資訊也會在其中。

Docker Build 代理

雖然 docker build 的本質,也是啟動一個容器,但是環境會略有不同,使用者級配置無效。在構建時,需要注入 http_proxy 等引數。

如果是透過 docker 命令啟動的容器,可以使用以下命令

docker build . \
    --build-arg "HTTP_PROXY=http://proxy.example.com:8080/" \
    --build-arg "HTTPS_PROXY=http://proxy.example.com:8080/" \
    --build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \
    -t your/image:tag

不過我們一般使用 docker compose 工具,所以接著看看 compose 的配置方式

version: '3.9'
services:
  app:
    build: ./services/AUTOMATIC1111
    image: sd-auto:49
    environment:
      - CLI_ARGS=--allow-code --medvram --xformers --enable-insecure-extension-access --api

改成

version: '3.9'
services:
  app:
    build:
      context: ./services/AUTOMATIC1111
      args:
        - HTTP_PROXY=http://proxy.example.com:8080/
        - HTTPS_PROXY=http://proxy.example.com:8080/
    image: sd-auto:49
    environment:
      - CLI_ARGS=--allow-code --medvram --xformers --enable-insecure-extension-access --api

這樣就搞定了~

Tips

配置完記得重啟 docker daemon

sudo systemctl daemon-reload
sudo systemctl restart docker

注意:無論是 docker run 還是 docker build,預設是網路隔絕的。如果代理使用的是 localhost:1234 這類,則會無效。

CUDA

推薦使用 LinuxMint/Ubuntu 系統自帶的驅動管理器安裝最新的顯示卡驅動。

系統方面之前用的是 LinuxMint18(基於Ubuntu16.04) ,看了下 NVIDIA 的官方網站,這系統太老了,已經沒辦法用上新版驅動和CUDA了,所以我又花了一下午時間把系統升級到 LinuxMint21(基於Ubuntu22.04),然後裝上驅動,Ubuntu系裝驅動真是方便,一鍵搞定,沒有任何波折?,而且驅動附帶的 CUDA 也裝上了,不用額外折騰,舒服了。

nvidia-smi 看看驅動資訊

Thu Mar 30 21:39:45 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.89.02    Driver Version: 525.89.02    CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| 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:C1:00.0 Off |                  N/A |
|  0%   30C    P8    26W / 300W |   1350MiB / 11264MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1394      G   /usr/lib/xorg/Xorg                114MiB |
|    0   N/A  N/A      3198      G   cinnamon                           38MiB |
|    0   N/A  N/A    508973      C   python                           1192MiB |
+-----------------------------------------------------------------------------+

CUDA版本是12,完美~?

搭建步驟

終於要開始搞了

先把程式碼 clone 下來

git clone https://github.com/AbdBarho/stable-diffusion-webui-docker.git

build step 1: 下載模型,需要十幾個G的模型

(只要網路通暢,一次搞定沒問題的)

cd stable-diffusion-webui-docker
docker compose --profile download up --build

build step 2: 執行本體

這裡是選擇一套 UI 來啟動,這個 auto 就是 UI 的名稱,除了這個,還有 auto-cpu (沒顯示卡用的)、 invokesygil 這幾個,我試了之後還是 auto 最好,功能最多。

invoke 的介面比較簡潔,似乎速度也比較快,但很多模型和LORA之類的都沒法用了~?

直接 auto 吧,不要糾結

docker compose --profile auto up --build

驅動、網路沒問題的話,等它構建完可以看到類似的資訊

stable-diffusion-webui-docker-auto-1  | Creating model from config: /stable-diffusion-webui/configs/v1-inference.yaml
stable-diffusion-webui-docker-auto-1  | LatentDiffusion: Running in eps-prediction mode
stable-diffusion-webui-docker-auto-1  | DiffusionWrapper has 859.52 M params.
stable-diffusion-webui-docker-auto-1  | Applying xformers cross attention optimization.
stable-diffusion-webui-docker-auto-1  | Textual inversion embeddings loaded(1): pureerosface_v1
stable-diffusion-webui-docker-auto-1  | Model loaded in 41.4s (calculate hash: 38.2s, load weights from disk: 1.6s, create model: 0.3s, apply weights to model: 0.3s, apply half(): 0.2s, load VAE: 0.8s).
stable-diffusion-webui-docker-auto-1  | Running on local URL:  http://0.0.0.0:7860

然後瀏覽器開啟 http://ip:7860 就可以看到這個介面

輸入 prompt 就可以畫圖了,這裡我用了一個風光圖的模型,畫一幅風景畫

如果跑不起來也沒事,可以看看後面的「疑難解答」部分。

如何使用

剛開始肯定一臉懵逼,咋畫不出高大上的效果啊?

  • prompt
  • 模型

首先,得學會使用 prompt,也就是生成圖片的描述,Stable Diffusion 透過英文文字內容來描述場景或物體,以此來決定生成的影像中會出現什麼。文字描述是決定影像生成質量的關鍵因素。具體如何寫 prompt 不在本文討論範圍,請自行搜尋相關文章,網上很多。

模型是個統稱,其中包含了Checkpoints、LORA、Texture之類的,不細說了,按照模型網站上的教程安裝使用就行。

這幾個網站可以按提示組合生成 prompt:

這幾個網站有很多人分享的成品圖和描述文案:

然後模型的話,可以去這幾個網站下載:

疑難解答

failed to solve: rpc error:

報錯資訊

failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to solve with frontend gateway.v0: rpc error: code = Unknown desc = dockerfile parse error on line 8: unknown instruction: cat (did you mean cmd?)

解決方案

https://github.com/AbdBarho/stable-diffusion-webui-docker/issues/190

修改 stable-diffusion-webui-docker/services/AUTOMATIC1111/Dockerfile

將第一行

# syntax=docker/dockerfile:1

改為

# syntax=docker/dockerfile:1.3-labs

然後加上 DOCKER_BUILDKIT=1 引數進行 build

DOCKER_BUILDKIT=1 docker compose --profile auto up --build

pip依賴安裝失敗

網路問題,雖然前面已經配置好了 docker 的代理,但 build 過程中不會走配置好的代理,需要新增 build args 再配置一次。

在 docker compose 配置中新增 build args 配置代理伺服器。

參考文件: https://docs.docker.com/compose/compose-file/compose-file-v3/

修改 docker-compose.yml 檔案

auto: &automatic
  <<: *base_service
  profiles: ["auto"]
  build: ./services/AUTOMATIC1111
  image: sd-auto:49
  environment:
    - CLI_ARGS=--allow-code --medvram --xformers --enable-insecure-extension-access --api

改為

auto: &automatic
  <<: *base_service
  profiles: ["auto"]
  build:
    context: ./services/AUTOMATIC1111
    args:
      - HTTP_PROXY=http://host:port/
      - HTTPS_PROXY=http://host:port/
  image: sd-auto:49
  environment:
    - CLI_ARGS=--allow-code --medvram --xformers --enable-insecure-extension-access --api

顯示卡驅動問題

報錯資訊

Error response from daemon: could not select device driver "nvidia" with capabilities: [[gpu]]

需要安裝 NVIDIA Container Toolkit

參考文件: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#setting-up-nvidia-container-toolkit

注意這個東西要求 cuda 版本 11.6 以上,如果沒有請先更新 cuda 版本。

新增軟體源

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

注意如果是使用 LinuxMint 之類的 Ubuntu 衍生版,請手動指定 distribution 環境變數為對應的 Ubuntu 發行版,比如我現在用的 Mint 21 相當於 Ubuntu 22.04,所以需要設定 distribution=ubuntu22.04

安裝

sudo apt install -y nvidia-container-toolkit

配置

sudo nvidia-ctk runtime configure --runtime=docker

重啟 docker daemon

sudo systemctl restart docker

參考資料

相關文章