本文Ivon將說明AI繪圖軟體Stable Diffusion WebUI模型的訓練方法(model training),包含Textual Inversion(Embedding)、HyperNetwork、LoRA,並給出實際例子與操作步驟。
以下是一個具體例子,透過使用自行訓練的HyperNetwork,便改善單靠Anything模型無法繪製出Hara老師畫風的缺點。在不使用HyperNetwork的情況下,風格永遠是左邊那樣;一使用HyperNetwork,右邊的風格就能輕鬆繪製出來了。
本文所討論的訓練模型僅為自用用途,若要分享訓練的模型也應遵照開源的原則分享。
0. 前言
為什麼要訓練自己的模型?訓練自己的模型可以在現有模型的基礎上,讓AI懂得如何更精確繪製特定的風格、概念、角色、姿勢、物件。
舉例來說,如果餵給AI十幾張我精挑細選的「Hara老師繪製的、不同角度、FGO的斯卡薩哈」做訓練,那麼就能讓AI更懂得如何繪製斯卡薩哈的臉部,風格也會比較固定。
訓練模型是複雜的議題,基於哪個現有模型,以及餵給AI學習的圖片品質,還有訓練時的參數,都會影響模型訓練結果。
本文提及的Embedding、HyperNetwork、LoRA都是「小模型」,這是相對於網路動輒好幾GB的checkpoint「大模型」而言。這些小模型訓練時間短,檔案約幾MB而已,訓練成本不高。主要是用於繪製特定人物/物件/畫風,並且訓練的模型可以多個混用。
如果硬體條件許可的話,蒐集大量圖片訓練特定領域的checkpoint大模型,再上傳到HuggingFace造福他人也是不錯的選項,只不過此任務過於龐大。要知道Stable Diffusion 1.5版的模型可是輸入了23億張圖片訓練出來的!網路上其他人訓練的模型至少也準備了幾萬張圖片。因此要繪製特定的人物/物件/畫風,訓練小模型對一般人來說比較划算。
各個模型的原理差異請參考下圖。技術原理以及訓練參數設定請參閱文末的「參考資料」,礙於篇幅無法一一細講,本文以操作過程為主。
就訓練時間與實用度而言,目前應是 LoRA > HyperNetwork > Embedding
訓練模型至少需要10GB的VRAM,也就是RTX3060等級以上的GPU。硬體不夠力的可以考慮用雲端來跑,下面會介紹免費雲端方案。
1. 環境建置
本文以ATOMATIC1111開發的Stable Diffusion WebUI為中心撰寫,因其圖形化且好操作。下面簡稱SD WebUI。
接著選擇部署在本機或是雲端?
如果你有Nvidia RTX3060以上等級的GPU,那就參考Windows或Linux教學部署在本機,想訓練多久就訓練多久。訓練資料不到50張圖片的小模型訓練時間約需要1~3個小時。
如果沒有強力的GPU,那就用雲端訓練,例如Google Colab。
2. 準備訓練資料
2.1. 取得高品質圖片
訓練用的圖片最少最少要準備10張。重質不重量。因為我要訓練的是單一人物且風格固定,圖片不宜有複雜背景以及其他無關人物。
網路圖片一張一張右鍵下載當然可以,不過要大量下載圖片的話我會使用Imgrd Grabber或Hydrus Network。
這裡我準備了33張Hara繪製的斯卡薩哈
2.2. 裁切圖片
下載圖片後,要將訓練圖片裁切成512x512像素。儘管SD WebUI可以自動批次裁切,但我們還是手動把圖片轉成512x512吧,免得重要的部分被裁掉。
安裝自由軟體GIMP,點選檔案→新增512x512像素的專案
點油漆桶將其漆成白色
將圖片拖曳進畫面,成為新的圖層
點選工具→變形工具→縮放,縮放圖片使其符合目前畫布大小,再按Enter。
點選檔案→Export,匯出成png。
為加快後面圖片的處理速度,按右下角刪除目前圖層,再拖新的圖片進來,重複操作。
將33張Hara繪製的斯卡薩哈裁切後,統一放到名為
raw
的目錄。
2.3. 預先給圖片上提示詞
接著要給圖片預先上提示詞,這樣AI才知道要學習哪些提示詞。
啟動SD WebUI,進入Train頁面。
進入Preprocess,
Source
輸入裁切圖片的路徑,Destination
填處理後圖片的路徑。接著勾選
Create Flipped Copies
,建立翻轉圖片提升訓練數量。然後用Stable Diffusion訓練真實圖片的勾選Use BLIP for caption
;訓練動漫人物改勾選Use DeepBooru for caption
。點選Preprocess,約幾分鐘後便會處理完成。輸出的目錄裡面會含有每張圖片對應的提示詞txt檔。至此訓練資料準備完成。
3. Textual Inversion(Embedding)訓練方法
Textual Inversion,又稱Embedding,適合讓AI學習一個新的概念/物體,或是單一角色的繪製。畫風相較於HyperNetwork學習能力較弱。
Anything這類基於NovelAI製作的模型不適合拿來練Embedding,成品會很詭異。從頭開始訓練的Waifu Diffusion或Stable Diffusion比較適合訓練Embedding,因此這裡使用的基礎模型為Waifu Diffusion 1.4。
3.1. 操作過程
啟動SD WebUI
切換至Train頁面,在
Create embedding
輸入名字。Number of vectors per token
設定7以上。點選Create embedding
。切換至Train頁面,選擇剛剛建立的embedding,於
Dataset directory
輸入訓練資料的路徑Prompt template file
選style_filewords.txt。Mx Step
設定訓練至10000步停止。當然你也可以調高一點,並看預覽圖決定品質差不多之後才按Interrupt中止訓練,究竟要多少步數不得而知。點選
Train Embedding
,開始訓練。SD WebUI應會顯示剩餘時間,通常是一小時起跳,每500步會在右邊顯示訓練該步數的成果。
你也可以到SD WenUI根目錄下的
texual_inversions
查看訓練成果。裡面image_embeddings
目錄會存放第幾步所訓練的成果。待訓練完成後,至SD WenUI根目錄下的
texual_inversions/embeddings
,對照image_embeddings
目錄的圖片挑選合適的成品。例如覺得9500步的不錯,那就將該pt檔從裡面挑出,將其放到SD WebUI程式目錄下的
embeddings
。
3.2. Embedding模型使用方式
於SD WebUI的繪圖界面,點選右上角
Show Extra Networks
接著選取要使用的embedding,點選將其加入提示詞欄位。Embedding只能配合訓練時使用的模型來算圖。
然後按照Embedding訓練時使用的提示詞下提示詞,這樣算出來的圖便會有該Embedding的人物了。
4. HyperNetwork訓練方法
比起學習單一角色的embedding,HyperNetworks更適合讓AI學習圖片整體畫風。
HyperNetwork我是使用Anything當基礎模型來訓練。
4.1. 操作過程
啟動SD WebUI
切換至Train頁面,在
Create hypernetwork
輸入名字。Number of vectors per token
設定7以上。點選Create hypernetwork
。切換至Train頁面,選擇剛剛建立的hypernetwork,於
Dataset directory
輸入訓練資料的路徑。Prompt template file
選hypernetwork.txt。Max Step
設定訓練至10000步停止。最後點選
Train HyperNetwork
,開始訓練。SD WebUI會顯示剩餘時間,HyperNetwork會比Embedding長一些。同樣可以到SD WebUI根目錄下的
texual_inversions/hypernetwork
查看訓練結果。裡面會有images
目錄存放第幾步所訓練的成果。待訓練完成後,至SD WeBUI根目錄下的
texual_Inversions/hypernetworks
,對照images
目錄下的圖片挑選合適的成品。例如覺得9500步的不錯,就將pt檔放到SD WebUI根目錄下的
models/hypernetwork
。
4.2. HyperNetwork模型使用方式
於SD WebUI的繪圖界面,點選右上角
Show Extra Networks
接著選取要使用的Hypernetwork,點選將其加入提示詞欄位
接著再使用訓練時候使用的提示詞,這樣算出來的圖便會有該HyperNetwork的人物了,並且畫風還原很佳。
5. LoRA訓練方法
LoRA (Low-rank adaptation)與Dreambooth所生成的模型相較而言檔案更小,訓練時間短。
LoRA較適合訓練畫風而非臉部。
DreamBooth內含LoRA,可作為SD WebUI的擴充功能安裝。然而該擴充功能的bug有點多,因此本機訓練請先用derrian-distro/LoRA_Easy_Training_Scripts,Windows圖形版則可以用Kohya’s GUI。
有用Google Colab的可以採用Linaqruf/kohya-trainer比較好上手。Reddit有一圖流教學。
5.1. 安裝環境
LoRA Easy Training Scripts這個Python程式Linux和Windows都可以用,下面以Linux為例。
- 用conda建立虛擬環境
|
|
- 複製儲存庫
|
|
- 設定加速選項
|
|
LoRA的訓練資料目錄結構不太一樣,需建立目錄結構如下。已經上好提示詞的訓練資料要放在
img_dir
下面,將目錄名稱取名為數字_概念
,目錄名稱前面加上數字代表要重複的步數。新增訓練設定檔
trainingconfig.json
|
|
- 填入以下內容(雙斜線的註解記得刪除) LoRA的總訓練步數計算公式為: 訓練圖片數量 × 重複次數 ÷ train_batch_size × epoch
|
|
5.2. 開始訓練
- 有些系統需要指定CUDA安裝路徑
|
|
- 輸入以下指令,載入json設定檔。
libnvinfer.so.7: cannot open shared object file
的警告可以暫時忽略。
|
|
- 之後會自動開始訓練。訓練好的模型位於訓練設定檔所寫的
output_dir
目錄。將.safetensors
檔移動至SD WebUI根目錄下的/models/Lora
。
5.3. LoRA模型使用方式
點選SD WebUI右上角,Show extra networks
點選要使用的LoRA,將其加入至提示詞欄位,
再加上訓練時使用的提示詞,即可繪製出使用LoRA風格的人物。
參考資料
訓練過程類
- Stable Diffusion web UI Wiki - GitHub
- Hypernetwork training for dummies - Rentry.co
- 【Novel AI】手把手教你Textual Inversion神经网络训练详细操作
- NovelAI hypernetwork 自训练教程 - 知乎专栏
- Basic Dreambooth Guide - Github
- LoRA Training Guide - Rentry.co
- Using LoRA for Efficient Stable Diffusion Fine-Tuning - HuggingFace
理論類
- 曾飞飞 - 零基础读懂Stable Diffusion
- Well-Researched Comparison of Training Techniques Lora, Inversion, Dreambooth, Hypernetworks
- 【AI绘画】当我们在训练AI的时候,究竟在训练什么?AI训练前置知识(一)
- Hu, E. J., Shen, Y., Wallis, P., Allen-Zhu, Z., Li, Y., Wang, S., … & Chen, W. (2021). Lora: Low-rank adaptation of large language models. arXiv preprint arXiv:2106.09685.