[Lora] TensorArt, CivitAI, Kohya-ss 訓練 SDXL Lora 記錄

AIGC from Custom SDXL Lora with Animagine XL 3.0

由於 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.0Juggernaut XL V6+RunDiffusion9527 Detail Realistic XL v3.0,以下是這三種訓練出來,所生成的對比圖片,

比對三組 Lora 在三個不同模型的結果

單就結果論來說,

  • 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 讓他去自主學習。

Prodigy: An Expeditiously Adaptive Parameter-Free Learner

D-Adaptation 的部分我之前的 訓練記錄 有約略提過,如果對這個部分有興趣的人,可以參考以下文章,

我不得不說,這文章的作者有一張 H100 80G 到底是什麼概念!

由於在 TensorArt 上面無法設定 Total Batch Sizes,所以我根據已經訓練完的 Lora 模型訓練參數,推算他的 Total Batch Sizes1,且參數中也有分桶設定。但老實說,由於 Total Batch Sizes1 的關係,所以分桶設定對這個訓練來說,應該是沒有太大意義。泛化程度不好,在實際測試中 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 Sizes1Network Dim(Rank)64 的情況下。相較於 Prodigy 的優化器來說,雖然 Total Batch SizesNetwork 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 來訓練。

最後跑一個模型比對來當作結束吧。

Lora 多模型比對

最後的最後,推一下我自己的 TensorArt 跟 C 站,

最後的最後的最後,有的人會問 Network Dim(Rank) 設定成 32, 64, 128 甚至更高(256)到底差異在哪裡?其實坊間應該也有不少資料,可以先問問看 Google 怎麼說。

不過,由於 SDXL 的關係,這個數字多少會影響到產出的結果,或許下次我再找時間測試給大家看看(畢竟訓練一個 SDXL Lora 隨便都 5 小時起跳)。

Hina Chen
偏執與強迫症的患者,算不上是無可救藥,只是我已經遇上我的良醫了。
Taipei