前言
最近AI很火?,先是AI畫圖,然後就ChatGPT,後者我已經用了一段時間了,用來寫作文挺不錯的,但OpenAI遮蔽了中國IP,加上使用者太多啥的,用起來沒那麼爽,但沒辦法全球只此一家,只能捏著鼻子用。而AI畫圖就不一樣了,全是開源的,自己部署一下可以玩個爽~
正好我們這有臺2080Ti的工作站,之前用來訓練模型的,現在部署個畫圖應該輕輕鬆鬆,於是就開始了折騰之路~
效果
先看看我生成出來的一些圖片
漢服 | COSER |
---|---|
大海 | 2B小姐姐 |
Stable Diffusion
AI畫圖有 Novel AI 、Disco Diffusion、Stable 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
(沒顯示卡用的)、 invoke
、sygil
這幾個,我試了之後還是 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:
- https://promptomania.com/stable-diffusion-prompt-builder/
- https://weirdwonderfulai.art/resources/disco-diffusion-modifiers/
這幾個網站有很多人分享的成品圖和描述文案:
然後模型的話,可以去這幾個網站下載:
疑難解答
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
注意這個東西要求 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