由於 SDXL 的模型訓練的硬體需求實在很高,所以多半得靠第三方服務,或是自己去弄一台雲端的 GPU 來幫我們訓練。我在本地端用比較低的設定來跑,勉強還能夠訓練比較小型的 SDXL Lora,更高的需求就真的只能靠第三方。
所以這次就記錄一下各組訓練的數據,跟產出的對比。
TensorArt
我在上一篇文章 [TensorArt] Lora 訓練筆記 中,已經有介紹過。詳細的設定我就不在這邊贅述了。然後,官方已經把 Prodigy 優化器修好了,所以這次就用 Prodigy 來訓練。以下是本次訓練的相關參數,
Use Base Model: Juggernaut XL
Repeat: 8
Epochs: 10
Save Every N Epochs: 1
Text Encoder learning rate: 1
Unet learning rate: 1
LR Scheduler: cosine_with_restart
LR Scheduler Num Cycles: 3
num_warmup_steps: 0
Optimizer: Prodigy
Network Dim: 64
Network Alpha: 1
Shuffle caption: Yes
Keep n tokens: 0
Noise offset: 0.1
Multires noise discount: 0.3
Multires noise iterations: 6
conv_dim: 32
conv_alpha: 1
附帶一提,由於 Prodigy 在 TensorArt 的限制,所以他的 Network Dim 最高就是 64,再高上去就會出現 CUDA out of memory 的問題。我的訓練資料集總共有 150 張圖片,且每張圖片最長邊都是 2048,沒有特意裁切成 SDXL 訓練最高解析度的 1024x1024 正方形。這樣做的原因是要看看 TensorArt 在這個訓練中會不會採用分桶設定。
CivitAI
CivitAI 所提供的訓練服務比較單純,他並沒有像是 TensorArt 有比較精細的參數可以調整,甚至連優化器(Optimizer)都是固定的。本次在 CivitAI 的訓練參數如下,
Repeat: 10
Epochs: 16
Total Batch Size: 4
Learning Rate: 0.0005
Text Encoder Learning Rate: 0.00005
Optimizer: AdamW8Bit
Optimizer Args: weight_decay=0.1
Network Dim: 256
Network Alpha: 1
LR Scheduler: cosine_with_restarts
LR Scheduler Num Cycles: 3
Min SNR Gamma: 5
Flip Augmentation: Yes
Shuffle Caption: Yes
由於在 CivitAI 裡面完全不知道他是使用哪一個基底模型來訓練你的資料,所以這邊也無法測試相關的提示詞。我在這邊所使用的訓練資料與 TensorArt 完全一樣,且也沒有特意裁切成 SDXL 訓練最高解析度的 1024x1024 正方形,同樣是要看看 CivitAI 在這個訓練中會不會採用分桶設定。
不過,他可以將 Total Batch Size 設定為 4,且 Network Dim(Rank) 最高可以設定為 256,這個真的挺香的。
Kohya
自己本機訓練的部分,由於機器沒辦法負荷 SDXL 過高參數的訓練,所以我只能降低部分訓練參數,讓我的機器可以跑得動。以下是本次訓練的相關參數,
Use Base Model: 9527 Detail Realistic XL v3.0
Repeat: 8
Epochs: 10
Total Batch Size: 1
Text Encoder learning rate: 1
Unet learning rate: 1
LR Scheduler: cosine_with_restart
LR Scheduler Num Cycles: 1
num_warmup_steps: 10%
Optimizer: DAdaptAdamPreprint
Optimizer Args: decouple=True,weight_decay=0.2,betas=(0.9, 0.99),growth_rate=1.02
Network Dim: 64
Network Alpha: 1
Shuffle caption: Yes
Keep n tokens: 0
Noise offset: 0.0357
Adaptive Noise Scale: 0.00357
Rank Dropout: 0.25
Module Dropout: 0.05
Dropout: 0.25
訓練資料集於 TensorArt, CivitAI 使用相同一組資料。
訓練結果
說在前面的,我知道這樣的比較並沒有太大意義,畢竟每個訓練的模型跟參數都不一樣,但是我只是想看看這三個服務的訓練結果會有多大的差異。我所使用的生成提示詞為,
(masterpiece, best-quality), 8k, ultra-detailed, photography, ultra-realistic, adult girl, long hair, sweater, sweater hat, snowing, tokyo street
負面提示詞為,
(worst quality, low quality, normal quality), disabled body, (ugly), sketches, (manicure:1.2), lowres, watermark, monochrome, censor, anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, disfigured, illustration, 3d, sepia, deformed, disfigured, bad anatomy, extra limb, floating limbs, disconnected limbs, ugly, blurry, tattoo, bad anatomy, text, missing fingers, fewer digits, signature, username, censorship, old, deformed, bad hands, peoplenegSDXL, unaestheticXLv31
使用的採樣器為 DPM++ 2M Karras,採樣步數 30,CFG 為 5,輸出尺寸為 896x1152,沒有啟用高解析度修復(Hires fix),Lora 所使用的權重均為 0.76。
我挑了三個模型,分別是 SDXL base 1.0,Juggernaut XL V6+RunDiffusion,9527 Detail Realistic XL v3.0,以下是這三種訓練出來,所生成的對比圖片,

單就結果論來說,
- CivitAI 版本的 Lora 在
SDXL base 1.0模型中反應最好,其他次之。 - TensorArt 的結果在三個模型反應都很不錯,有特徵鎖定現象。
- Kohya 的結果在
9527 Detail Realistic XL v3.0模型中反應最好,其他污染相對嚴重。
由於每個訓練參數都不同,所以這邊的結果僅供參考而已,無法代表任何的指標意義。
訓練參數細節
多次測試三組 Lora 的產出結果,對於我所使用的優化器來說,目前觀察到的幾個現象,對於想使用相關優化器做訓練的人,可以參考一下。
Prodigy
相較於 D-Adaptation 是比較新的優化器,但他對於硬體的要求實在很高,所以你的 VRAM 要是有 40GB 以上,在本地端應該可以跑起來。由於他與 D-Adaptation, Adafactor 系列優化器雷同,學習率可以設定為 1.0 讓他去自主學習。
D-Adaptation 的部分我之前的 訓練記錄 有約略提過,如果對這個部分有興趣的人,可以參考以下文章,
- LAZY DADAPTATION GUIDE
- 【Update SDXL Script】bdsqlsz LoRA training Advanced Tutorial(2):Prodigy is ALL YOU NEED!
我不得不說,這文章的作者有一張 H100 80G 到底是什麼概念!
由於在 TensorArt 上面無法設定 Total Batch Sizes,所以我根據已經訓練完的 Lora 模型訓練參數,推算他的 Total Batch Sizes 是 1,且參數中也有分桶設定。但老實說,由於 Total Batch Sizes 是 1 的關係,所以分桶設定對這個訓練來說,應該是沒有太大意義。泛化程度不好,在實際測試中 TensorArt 所訓練出來的 Lora 會有部分特徵鎖定的情況,也就是說,無論如何強調提示詞,某些特徵會直接被鎖定在與訓練資料集雷同的特徵上(甚至幾乎是一模一樣的特徵)。這個問題在 CivitAI 與 Kohya 上面並沒有出現。
從 TensorArt 訓練完的 Lora 模型訓練參數來看,他大概有這些設定,
Gradient Checkpointing: True
Max Token Length: None
Face Crop Aug Range: None
Adaptive Noise Scale: None
Caption Tag Dropout Rate: 0.0
Gradient Accumulation Steps: 1
他的訓練器把 Max Token Length 設定為 None 讓我懷疑他是否只有訓練 U-Net,但在 Lora 訓練結果的參數記錄中,並沒有特別看到僅訓練 U-Net 的設定,所以也不太確定狀況。
DAdaptAdamPreprint
這個優化器是我在 Kohya 上面所使用的,他是 D-Adaptation 的一個分支,但是他的硬體需求比 Prodigy 略低,我在本地端的訓練大概需要 14GB VRAM。而且這也是在 Total Batch Sizes 為 1 且 Network Dim(Rank) 為 64 的情況下。相較於 Prodigy 的優化器來說,雖然 Total Batch Sizes 與 Network Dim(Rank) 的設定相同,但由於我在 Kohya 上面有使用 Dropout 的相關設定,所以特徵被鎖定的情況會比 Prodigy 少很多,但這不代表他的泛化能力很好,利用 Dropout 與調整 Total Batch Sizes 這是兩件事情。
這個超參數的設定是我在 Kohya 上面所使用的,如果有興趣的人可以自己試試看,
decouple=True,weight_decay=0.2,betas=(0.9, 0.99),growth_rate=1.02
由於是訓練 SDXL,所以對於硬體需求自然就偏高,但無論是 Prodigy 還是 DAdaptAdamPreprint,如果你是訓練 SD1.5 的話,或許可以在比較高的 Total Batch Sizes 下可以運作。以我目前的硬體來說,單純訓練 SD1.5 的話,這兩者的 Total Batch Sizes 可以設定在 4。
AdamW8Bit
這個訓練器算是老牌萬用,而且 CivitAI 上面也不讓你改,甚至連超參數(weight_decay=0.1)都幫你固定好不能改。在這樣的情況下,我只能說在 CivitAI 上面訓練真的很吃運氣。首先不知道基底模型是誰,其次不知道他其他超參數是怎麼設定的,最後優化器還不讓你改,其實就很難去評估他最終訓練的結果是好是壞。
但根據我在 CivitAI 上面跑了大概 4 次訓練的結果來看,他在 SDXL 的基底模型應該是使用 SDXL base 1.0,畢竟他訓練出來的結果在 SDXL base 1.0 反應最好。之後會不會有所調整,我就不得而知了。根據 CivitAI 所訓練出來的 Lora,我們從其中的參數可以看到他的訓練器大概會有哪些設定,
Noise Offset: None
Gradient Checkpointing: True
Multires Noise Iterations: 6
Max Token Length: 255
Face Crop Aug Range: None
Adaptive Noise Scale: None
Caption Tag Dropout Rate: 0.0
Multires Noise Discount: 0.3
Gradient Accumulation Steps: 1
在 CivitAI 上面唯一的好處是 Total Batch Sizes 可以設定最高為 4,如果訓練風格或是服裝等多樣性的需求,使用 CivitAI 應該會是比較好的選擇,但由於優化器只有 AdamW8Bit 可以選,參數又超級少,所以我們只能從資料集的多樣性來評估他的訓練結果,這個部分就必需要不斷的嘗試了。
小結
總結來說,如果你的硬體不高,或是想要訓練比較大型的模型,我目前還是比較推薦 TensorArt 來跑訓練,加上他現在可以使用 Prodigy 這個優化器,我覺得是個不錯的選擇。至於我上述所提到的特徵鎖定問題,這個其實可以靠資料集與標籤的修飾來解決,並不是太困難的問題。
至於 CivitAI 目前來說還是有點太賭運氣(或人品),但 Total Batch Sizes 可以設定成 4 真的很香,如果對於多樣性訓練有需求的人,可以考慮使用 CivitAI 來訓練。
最後跑一個模型比對來當作結束吧。

最後的最後,推一下我自己的 TensorArt 跟 C 站,
最後的最後的最後,有的人會問 Network Dim(Rank) 設定成 32, 64, 128 甚至更高(256)到底差異在哪裡?其實坊間應該也有不少資料,可以先問問看 Google 怎麼說。
不過,由於 SDXL 的關係,這個數字多少會影響到產出的結果,或許下次我再找時間測試給大家看看(畢竟訓練一個 SDXL Lora 隨便都 5 小時起跳)。