人工智慧,丹青聖手,全平臺(原生/Docker)構建Stable-Diffusion-Webui的AI繪畫庫教程(Python3.10/Pytorch1.13.0)

劉悅的技術部落格發表於2023-03-03

世間無限丹青手,遇上AI畫不成。最近一段時間,可能所有人類畫師都得發出一句“既生瑜,何生亮”的感嘆,因為AI 繪畫通用演算法Stable Diffusion已然超神,無需美術基礎,也不用經年累月的刻苦練習,只需要一臺電腦,人人都可以是丹青聖手。

本次我們全平臺構建基於Stable-Diffusion演算法的Webui視覺化圖形介面服務,基於本地模型來進行AI繪畫操作。

本地安裝Stable-Diffusion-Webui

如果系統之前安裝過Python3.10或者使用過Pytorch深度學習框架,那麼推薦直接本地安裝Stable-Diffusion-Webui,因為Stable-Diffusion的核心依賴庫也是Pytorch。

首先拉取官方的專案:

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

隨後進入專案的目錄:

cd stable-diffusion-webui

官方文件建議直接在目錄中執行shell指令碼:

./webui.sh

但事實上,shell指令碼很容易在過程中報錯,該專案的核心程式碼其實是launch.py,所以理論上,我們只需要正常執行launch.py檔案即可。

首先確保本機的Python版本號大於等於3.10.9

關於Python3.10的安裝,請移玉步至:一網成擒全端涵蓋,在不同架構(Intel x86/Apple m1 silicon)不同開發平臺(Win10/Win11/Mac/Ubuntu)上安裝配置Python3.10開發環境 ,這裡不再贅述。

另外確保Pytorch的版本號大於等於13.1.0,關於Pytorch,請移步:聞其聲而知雅意,M1 Mac基於PyTorch(mps/cpu/cuda)的人工智慧AI本地語音識別庫Whisper(Python3.10)

隨後安裝相關的依賴庫:

pip3 install -r requirements.txt  
pip3 install -r requirements_versions.txt

依賴檔案中,有一個庫可能會出問題,就是GFPGAN,它是騰訊開源的人臉識別模組,這裡推薦使用GFPGAN官方網站(https://github.com/TencentARC/GFPGAN)的安裝方式:

# Install basicsr - https://github.com/xinntao/BasicSR  
# We use BasicSR for both training and inference  
pip install basicsr  
  
# Install facexlib - https://github.com/xinntao/facexlib  
# We use face detection and face restoration helper in the facexlib package  
pip install facexlib  
  
pip install -r requirements.txt  
python setup.py develop  
  
# If you want to enhance the background (non-face) regions with Real-ESRGAN,  
# you also need to install the realesrgan package  
pip install realesrgan

安裝成功後,最好驗證一下:

➜  ~ python3  
Python 3.10.9 (main, Dec 15 2022, 17:11:09) [Clang 14.0.0 (clang-1400.0.29.202)] on darwin  
Type "help", "copyright", "credits" or "license" for more information.  
>>> import gfpgan  
>>>

所有依賴安裝成功後,就可以直接執行launch.py檔案即可:

python3 launch.py

程式返回:

Python 3.10.9 (main, Dec 15 2022, 17:11:09) [Clang 14.0.0 (clang-1400.0.29.202)]  
Commit hash: 0cc0ee1bcb4c24a8c9715f66cede06601bfc00c8  
Installing requirements for Web UI  
Launching Web UI with arguments: --upcast-sampling --use-cpu interrogate  
Warning: caught exception 'Torch not compiled with CUDA enabled', memory monitor disabled  
No module 'xformers'. Proceeding without it.  
==============================================================================  
You are running torch 1.13.0.  
The program is tested to work with torch 1.13.1.  
To reinstall the desired version, run with commandline flag --reinstall-torch.  
Beware that this will cause a lot of large files to be downloaded, as well as  
there are reports of issues with training tab on the latest version.  
  
Use --skip-version-check commandline argument to disable this check.  
==============================================================================  
Loading weights [6ce0161689] from /Users/liuyue/wodfan/work/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors  
Creating model from config: /Users/liuyue/wodfan/work/stable-diffusion-webui/configs/v1-inference.yaml  
LatentDiffusion: Running in eps-prediction mode  
DiffusionWrapper has 859.52 M params.  
Applying cross attention optimization (InvokeAI).  
Textual inversion embeddings loaded(0):   
Model loaded in 8.2s (create model: 0.6s, apply weights to model: 5.0s, apply half(): 1.9s, move model to device: 0.5s).  
Running on local URL:  http://127.0.0.1:7860

Stable-Diffusion-Webui服務會執行在系統的7860埠上。

需要注意的是,如果本地系統不支援cuda模式,需要修改執行命令:

python3 launch.py --skip-torch-cuda-test --upcast-sampling --use-cpu interrogate

這裡使用CPU來進行模型訓練。

另外如果是M系列的Mac,其實是支援MPS模式的,但Stable Diffusion目前的最新版並不支援MPS,所以需要單獨設定環境變數,關閉MPS模式:

export PYTORCH_ENABLE_MPS_FALLBACK=1

最後訪問http://127.0.0.1:7860即可,本地構建Stable-Diffusion-Webui服務就完成了。

Docker構建Stable-Diffusion-Webui

如果不想太折騰,也可以使用Docker容器來構建Stable-Diffusion-Webui,同樣地,需要拉取線上的Docker配置檔案專案:

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

隨後進入專案的目錄:

stable-diffusion-webui-docker

接著執行命令下載相關的依賴映象:

docker compose --profile download up --build

下載完成後,執行命令構建容器:

docker compose --profile auto up --build

這裡需要注意的是,模型資料和輸出資料夾會以/data和/output的形式掛載到容器中,如果想在宿主機往容器內傳入模型或者其他圖片,需要寫入專案中的data目錄。

過程中,可能會報錯:

Found no NVIDIA driver on your system

這是因為容器內找不到NVIDIA的顯示卡驅動。

這裡需要單獨再啟動一個容器服務:

docker run -ti --runtime=nvidia -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all allennlp/allennlp

總的來說,安裝過程簡單,但是除錯比較費勁,一旦啟動出問題,就得進入容器內部修改程式碼,或者反覆修改Dockerfile檔案,所以Docker比較適合封裝業務改動頻繁的容器,而不是依賴環境繁多並且版本需要反覆調整的場景。

Stable-Diffusion-Webui影像繪製

配置好Stable-Diffusion-Webui環境之後,訪問http://127.0.0.1:7860:

在Prompt文字框中填入引導詞:

Tall buildings, people bustling, heavy traffic, staggered light and shadow, the beauty of the city is conspicuous before.

隨後點選右側Generate生成按鈕即可,這裡引導詞的意思是:高樓林立,人群熙熙攘攘,車水馬龍,光影交錯,城市之美盡顯眼前。

注意引導詞需要使用逗號分隔。

後端開始進行訓練:

To create a public link, set `share=True` in `launch()`.  
100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:24<00:00,  1.25s/it]  
Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:19<00:00,  1.00it/s]  
100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:34<00:00,  1.72s/it]  
Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:22<00:00,  1.11s/it]  
100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:22<00:00,  1.10s/it]  
Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:20<00:00,  1.00s/it]  
100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:22<00:00,  1.10s/it]  
Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:22<00:00,  1.13s/it]  
100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:22<00:00,  1.12s/it]  
Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:21<00:00,  1.07s/it]  
100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:21<00:00,  1.09s/it]  
Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:19<00:00,  1.03it/s]  
100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:20<00:00,  1.01s/it]  
Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:19<00:00,  1.03it/s]  
100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:20<00:00,  1.01s/it]  
Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:19<00:00,  1.02it/s]  
100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:22<00:00,  1.15s/it]  
Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:21<00:00,  1.07s/it]  
100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:21<00:00,  1.06s/it]  
Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:20<00:00,  1.00s/it]

片刻之間,揮毫落紙如雲煙。

遺憾的是,引導詞不支援中文,但可以配置權重,數值從0.1~100,預設狀態是1,低於1就是減弱,大於1就是加強:



(Tall buildings:1.1), people bustling(1.61),(heavy traffic:0.3),(staggered light and shadow:1.3)


Stable-Diffusion-Webui也支援Negative prompt(反向引導詞)。

就是用文字描述你不想在影像中出現的東西:

對圖片進行去噪處理,使其看起來更像你的提示詞;同樣使其看起來更像你的反向提示詞。

同時觀察正方向兩者之間的差異,並利用它來產生一組對噪聲圖片的改變,將最終結果移向前者而遠離後者。

預設通用反向引導詞:

lowres,bad anatomy,bad hands,text,error,missing fingers,  
extra digit,fewer digits,cropped,worst quality,  
low quality,normal quality,jpeg artifacts,signature,  
watermark,username,blurry,missing arms,long neck,  
Humpbacked,missing limb,too many fingers,  
mutated,poorly drawn,out of frame,bad hands,  
owres,unclear eyes,poorly drawn,cloned face,bad face

除了引導詞,還可以調整取樣迭代步數 (Sampling Steps)。

系統先隨機生成一個基礎的圖片,然後一步步的調整圖片,向引導詞 Prompt 靠攏

Sampling Steps引數就是告訴人工智慧,這樣的步驟應該進行多少次。

次數越多,每一步訓練也就越小越精確。當然了,成本也會越高,同時每一次訓練的時間也會成同比增長。

除了迭代步數,也可以自由地選擇取樣方法(Sampling method)

也就是讓Stable-Diffusion-Webui具體使用用什麼演算法來訓練圖片模型。

預設演算法是Euler a :富有創造力,不同步數可以生產出不同的圖片。 但是超過30步左右基本就沒有實質化的增益效果。

Euler演算法:最簡單的演算法,訓練速度也是最快的。

LMS演算法:Euler的延伸演算法,相對更穩定一點,30步就比較穩定了

PLMS:最佳化過的LMS演算法

其他的一些引數:

生成批次Batch count/n_iter:同樣的配置,迴圈跑幾次

每批數量 Batch size:同時生成多少個影像,增加這個值可以並行執行,但也需要更多的顯示卡視訊記憶體。

提示詞相關性 CFG Scale:影像與引導詞匹配程度。增加這個值將導致影像更接近引導詞,但過高會讓影像色彩過於飽和。一般在5~15之間為好,7,9,12是3個常見的設定值。

寬度 X 高度 Width X Height:單位是畫素,適當增加尺寸,後臺會試圖填充更多的細節進來。

Stable-Diffusion-Webui定製化模型

Stable-Diffusion-Webui預設下載的基礎模型在專案目錄的models/Stable-diffusion資料夾中:

/stable-diffusion-webui/models/Stable-diffusion

模型名稱是v1-5-pruned-emaonly.safetensors,體積是4.27GB。

如果需要一些比較有個性定製化模型,可以在civitai.com平臺進行挑選和下載,需要注意的是,該平臺上的模型魚龍混雜,良莠不齊,不能說是蔚為大觀,但多多少少有點泥沙俱下的意思,所以最好不要在比較正式的公共(工作)環境開啟該平臺,否則結果可能會令人非常尷尬。

這裡我們選擇相對比較潮流的賽博朋克風格模型:synthwavepunk

將下載的模型放入models/Stable-diffusion目錄。

隨後重啟Stable-Diffusion-Webui服務:

python3 launch.py --skip-torch-cuda-test --upcast-sampling --use-cpu interrogate

在頁面表單中的Stable Diffusion checkpoint選項裡選擇對應的模型:

引導詞:

concept art, 4k, intricate, pinup, a woman, beautiful face, embroidery, lace, hyper-realistic, highly detailed, octane render, concept art, smooth, 8k, dancing princess, snthwve style, nvinkpunk, by jeremy mann, by sandra chevrier, by dave mckean and richard avedon and maciej kuciara

訓練結果:

好了,現在,你已經知曉那些網路上的漂亮小姐姐是怎麼生成的了。

結語

也許我們只是偶爾被網路上那些酷炫而獵奇的AI生成圖所吸引,但如果你真的動手去搭建、除錯、甚至開始訓練屬於自己的繪畫模型,相信我,你馬上就會深陷其中,不能自拔,AI仿若可以滿足你所有的幻想,慾望滿溢,又欲言又止,分寸把握之精確,妙入毫顛。什麼?你還在玩那些無聊的電子遊戲?相信我,Stable-Diffusion-Webui才是最高階的精神享受,沒有之一,也不可替代。

相關文章