目錄
前言
說到訓練 Stable Diffusion 的 LoRA 模型,我其實是偏純 sd-scripts 派的,雖然早就有 kohya_ss 這種 GUI,不過太圖形化介面我反而看不懂…XD
但隨著 Civitai 跟 Liblib 等平台都開放線上訓練,
以及開源社區還甚至推出 fluxgym 這種阿罵都會 train 的界面後,
我就發現未來主流趨勢其實是 No Code 的,而且 kohya_ss 的更新也陷入了低潮,
適逢 OneTrainer 誕生,於是我決定這次改使用 OneTrainer 並寫成教學!
前置準備 – OneTrainer
-
把 OneTrainer 的 repo 拉下來
git clone https://github.com/Nerogar/OneTrainer.git
-
執行
install.bat
並讓安裝程式完成其工作。
(手動點兩下或是在 powershell 裡面.\install.bat
都可以) -
完成所有操作後,執行
start-ui.bat
開啟 OneTrainer 的 UI。
(同樣,手動點兩下或是在 powershell 裡面.\start-ui.bat
都可以)
前置準備 – Flux 模型
請參考我的文章: [開發筆記] 如何發行 HuggingFace token 並自動拉取 repo (LLaMA, Flux 等適用)
要餵給 OneTrainer 的 Flux 的底模不能只給單一個 flux1-dev.safetensors
的檔案,不然你就會跟我一樣獲得類似這樣的錯誤:
Exception: could not load model: D:/OneTrainer_workspace/sd_models/flux-dev-fp8.safetensors
根據 這篇 Reddit 的討論,
請選擇乖乖手動下載所有 black-forest-labs/FLUX.1-dev 的產物,包括資料夾跟 README 等等的。
因為我們實際上要指定的位置是 model_index.json
,這點跟 SD 系列相當不同,還請注意。
Stable Diffusion 訓練 LoRA 模型實作
我這次想要 train 的是 Flux 的 LoRA。
General 頁籤設定
上方的選擇 #flux LoRA config
,在右上角選擇 Flux Dev
跟 LoRA
,
然後 Workspace Directory
是選擇要拿來存放訓練備份用的資料夾。
除了 LoRA
之外他也支援 Fine Tune
跟 Embedding
的訓練,
雖說我是不覺得有資源跑全參數 Fine Tune
的人還會需要用圖形化界面啦…😂
當然,OneTrainer 支援幾乎所有的 Diffusion model 的訓練,
Stable Diffusion 的 1.5、2.0、SDXL、…甚至到 3.5 都不在話下。
Model 頁籤設定
Base Model
可以指定要根據哪個模型來訓練。
注意,如果你也是要訓練 Flux 的話,
請先確保你已經下載了所有 black-forest-labs/FLUX.1-dev 的產物,
再將 Base Model 指定為 model_index.json
,不是 flux1-dev.safetensor
!!!
如果是想要訓練 SD 1.5 跟 SDXL 的話,
其實可以多看看有沒有甚麼好底模可以拿來訓練,真實系的選真實,動漫系的選動漫,
啊如果都沒選的話她就會從 HuggingFace 上面自己抓原始的模型來訓練。
除了 Base Model
要注意之外也可以指定一下 Model Output Destination
,這邊會關乎你的 LoRA 輸出的檔名。其他參數基本上不用再動。
Data 頁籤設定
我自己是把 Clear cache before training
拿掉啦,其他不用動。
像是 Aspect ratio bucketing
就是讓你 dataset 的解析度可以比較多樣化不會被硬要裁成正方形或特定比例 (原始論文),
Latent caching
就是說他在計算 Latent Space 的時候把那些常用的 latent representation 給 cache 住,
說人話的話就是把 Latent caching
跟 Clear cache before training
拿掉,跑的會比較快 🚀
Concept 頁籤設定
這邊是重點唷 ~
點進 Add concept
,會出現一個新的球球
點進去出現這個頁面:
這邊的 Name 設為 training
,Path 的話就是 dataset 的圖片跟 caption 的路徑,手動打標的話品質理論上會比較好,但是你也可以使用 AI 來打標。
獲得 caption,或說反推圖的 prompt 的最簡單方式是 SD WebUI train 頁籤的 Use BLIP for caption
跟 Use DeepBooru for caption
,當然你也可以使用像是 stable-diffusion-webui-dataset-tag-editor 的擴充功能或甚至 Kosmos、ChatGPT 的方式來反推 prompt。
假設現在已經反推好提詞了,打開文字檔就可以看到類似這種的輸出。
autumn, autumn_leaves, charmander, fire, flame, forest, leaf, maple_leaf, molten_rock, nature, no_humans, ocean, orange_theme, outdoors, ripples, river, scenery, sunset, tree, water
我希望我的 LoRA 的觸發詞 (trigger word) 是 monet
,因此在這些圖片的 caption 的最前面我會加上 monet
的詞。
monet, autumn, autumn_leaves, ...
將圖片跟相對應的 prompt 整理如下並在 Prompt Source 的部分選擇 From text file per sample
。
Balancing 是 repeats 的次數,以我 SD 1.5 的 LoRA 訓練經驗來說,train 個 2000
到 3000
步就已經是能夠 train 的差不多了,所以假設訓練集有 100 張圖片,每張給他看 20 次,如果訓練集只有 20 張圖片 (其實這是大部分情況),理論上就要給他看 100 次。
當然,以上這些是以 batch_size
為 1
的情況下說的,如果你 GPU 很強,同時給他看兩張圖片的話那你的 batch_size
就是 2
,這時候,你的 repeats 次數就應該砍半,否則你的 steps 會增加一倍。
為什麼叫做 Balancing?
因為其實你可以在同 LoRA 裡面訓練不同的概念,
就假設說我今天是要訓練印象派的 LoRA,
除了莫內之外我還可以拿雷諾瓦、竇加之類的知名印象派畫家作品來訓練,
這時候的 concept 就會有三個人,所以我們也應該拆成三個資料夾來歸類他們的作品,
這樣,在 LoRA 訓練完成後,我們就可以透過輸入 trigger word 來觸發特定畫家的畫風了。
Image Augmentation (資料增強)
這邊的話則是可以做 Image Augmentation (資料增強) 的設定,開啟 Random Filp 的話理論上模型的泛化性會更強,以人物來說可能就是能夠畫左臉跟畫右臉而不會偏廢其中之一的感覺,接著按下 Update Preview
就可以更新預覽圖了。
Text Augmentation (文字增強)
我沒有額外做設定。
Training
快樂的調參時間…
官方推薦 – PRODIGY
根據官方關於優化器 (Optimizer) 的 文件、Lazy LoRA Training Guide 等文件的建議,我們將優化器設為 PRODIGY
,然後學習率 (Learning Rate) 請務必設成 1
。PRODIGY 是 ADAMW 的聰明版(?),他可以自己決定 Learning Rate。
這邊我們的設定就直接照搬 這篇 的建議,雖然他是針對 SDXL,不過我們還是可以加減用。
- 選擇 PRODIGY 優化器
- 啟用兩個文字編碼器 (Text Encoders) 的訓練
- 將 Learning Rate, Text Encoder 1 Learning Rate, Text Encoder 2 Learning Rate and Transformer (UNet) Learning Rate to 1 都設為 1(PRODIGY 會在訓練期間自行決定學習率)。
- 選擇 Learning Rate Scheduler 下的 COSINE 選項,並將預熱步驟設為 0。(PRODIGY was designed to work with this schedule).
- 將 Batch size 設為 1。(PRODIGY 需要更長的時間才能計算出 batch size 較大的 learning rate).
- 將 SDXL 的 Resolution 設為 1024
- 註:SD 1.5 請設為 576 或 768,SDXL 跟 Flux 的話可以是 1024 以上
- 設定適當數量的 Epochs
紅色代表必改,橘色代表看個人情況改。
我的推薦 – ADAMW
PRODIGY
雖好,可以無腦直接無視 learning rate,但是實在是要跑太久了,
我的 4090 筆電用 PRODIGY
這個優化器來訓練,Flux 的要跑 100 多個小時,SDXL 的要跑 16 小時以上,真的久到懷疑人生。
相較之下 ADAMW
跑 3150 steps 只需要 5 小時多,所以我個人建議還是先試試傳統的 ADAMW
。
訓練完的 log 大概長得像這樣:
epoch: 40%|████████████████████████████ | 4/10 [4:32:31<4:20:30, 2605.09s/it]Creating Backup D:/OneTrainer_workspace\backup\2024-12-27_10-33-00-backup-1260-4-0 | 0/315 [00:00<?, ?it/s]
step: 100%|██████████████████████████████████████████| 315/315 [14:17<00:00, 2.72s/it, loss=0.0859, smooth loss=0.157]
step: 100%|███████████████████████████████████████████| 315/315 [13:43<00:00, 2.61s/it, loss=0.119, smooth loss=0.162]
step: 100%|██████████████████████████████████████████| 315/315 [13:43<00:00, 2.61s/it, loss=0.0633, smooth loss=0.145]
step: 100%|███████████████████████████████████████████| 315/315 [13:43<00:00, 2.61s/it, loss=0.244, smooth loss=0.124]
epoch: 80%|█████████████████████████████████████████████████████████▌ | 8/10 [5:28:00<39:04, 1172.44s/it]Creating Backup D:/OneTrainer_workspace\backup\2024-12-27_11-28-29-backup-2520-8-0 | 0/315 [00:00<?, ?it/s]
step: 100%|███████████████████████████████████████████| 315/315 [13:51<00:00, 2.64s/it, loss=0.065, smooth loss=0.113]
step: 100%|█████████████████████████████████████████| 315/315 [13:42<00:00, 2.61s/it, loss=0.0867, smooth loss=0.0985]
epoch: 100%|███████████████████████████████████████████████████████████████████████| 10/10 [5:55:35<00:00, 2133.56s/it]
Creating Backup D:/OneTrainer_workspace\backup\2024-12-27_11-56-02-backup-3150-10-0
Saving models/lora.safetensors
結語
由於時間因素,之後會再繼續嘗試在 local 端 train Flux 的 LoRA,
不過我相信這篇文能夠讓大家了解多一點 OneTrainer 的使用方法 🥹。
希望深入了解上面這串操作到底做了啥的朋友,推薦閱讀 這篇,可做為入門。
- [推薦工具] 讓程式碼截圖變的美美的吧!VScode CodeSnap 與 3 種同功能線上工具介紹 - 2025-01-05
- [AI 繪圖初級教學] 用 X/Y/Z Plot 比較 Stable Diffusion 的 prompt 與 LoRA 效果 - 2024-12-27
- [AI 繪圖中級篇教學] Stable Diffusion WebUI WD14 Tagger 介紹 - 2024-12-26