Stable Diffusion Lora locon loha訓練參數設置
一、部署
1. 環(huán)境構建
部署可以使用國內的整合包,也可以自己git pull,環(huán)境方面可參考。
https://zhuanlan.zhihu.com/p/612317907
我在使用bmaltais/kohya_ss訓練時出現(xiàn)問題(https://github.com/KohakuBlueleaf/LyCORIS/issues/40),更換了derrian-distro/LoRA_Easy_Training_Scripts一切正常。https://zhuanlan.zhihu.com/p/612317907
derrian-distro/LoRA_Easy_Training_Scripts
Linaqruf/kohya-trainer
bmaltais/kohya_ss
hollowstrawberry/kohya-colab
https://github.com/kohya-ss/sd-scripts
github.com/kohya-ss/sd-scripts
2. pytorch 版本
多種版本都是被支持的,下面的一鍵Windows一鍵安裝依賴包中,提供了對應的版本與pytorch版本,2.1 版本會更快一些,但似乎顯存占用更多……
Release installers v6 · derrian-distro/LoRA_Easy_Training_Scripts
github.com/derrian-distro/LoRA_Easy_Training_Scripts/releases/tag/installers-v6
3. 環(huán)境遷移
當你在云服務器上訓練時,可以使用一鍵安裝腳本,也可以打包本地環(huán)境進行環(huán)境遷移,我使用的是conda-pack。
-> winows 方法:conda-pack > spec-list.txt
-> linux 方法:conda-pack > environment_name.yml
Conda-Pack 打包環(huán)境方式在目標計算機無法聯(lián)網或者網絡不暢時很好用,而Conda導出 environment.yml 的方式非常適合在不同平臺和操作系統(tǒng)之間重新創(chuàng)建環(huán)境。
此處不再贅述具體操作,感興趣的自己搜索方法即可。
二、Lora 訓練參數
1. batch_size
只要顯存不大,能多大就多大(迫真)
Batch_size 代表了同時送進去訓練的數據量,理論上是應該第一個被確定的超參數。當數量為1時,等同于隨機梯度下降法(SGD)。
較大的batch size往往會導致訓練速度更快(每個epoch的iteration數?。瑑却嬲加酶?strong>大,但收斂得慢(需要更多epoch數)。
較小的batch size往往會導致訓練速度更慢(每個epoch的iteration數大),內存占用更小,但收斂得快(需要更少epoch數)。[1]
實際訓練時,能多大就多大往往就能取得不錯效果(那種batch_size幾千時性能下降的情況只有在超恐怖的gpu/tpu上才會發(fā)生,誰讓我們顯存?。mist手寫數字訓練集可能3090 24G可能才能達到1024。所以……
下面是一些參考:
1024*768 分辨率下,24 GB VRAM 最大 batch_size = 4
1024*1024 分辨率下,24 GB VRAM 最大 batch_size = 3(推薦為2)
512*512 分辨率 12GB VRAM 最大 batch_size = 6
理論上,batch_size = 時計算速度更快。
2. base_model
底模型。一種不錯的選擇是,二次元選擇novelai,訓練三次元選擇sd1.5,訓練人物服裝chilloutmix。也可以選擇其他模型。使用 SD2.x based model 時,需要勾選 v2 參數。
3. clip_skip
跳過某些層的輸出,起與 CFG 類似的作用。但通常三次元選1,二次元選2。
指定“2”使用文本編碼器 (CLIP) 的倒數第二層的輸出。 如果省略 1 或選項,則使用最后一層。
? ? *SD2.0默認使用倒數第二層,學習SD2.0時請不要指定。
? ? 如果被訓練的模型最初被訓練為使用第二層,則 2 是一個很好的值。
? ? 如果您使用的是最后一層,那么整個模型都會根據該假設進行訓練。 因此,如果再次使用第二層進行訓練,可能需要一定數量的teacher數據和更長時間的學習才能得到想要的學習結果。
4. network_dimension
特征維度,當需要學習的內容復雜時,維度應當更高。模型文件的大小 當 network_dimension = 128 時,輸出文件大小為 144 MB。
該參數不是越高越好。維度提升時有助于學會更多細節(jié),但模型收斂速度變慢,需要的訓練時間更長,也更容易過擬合。高分辨率訓練集通常需要更高的維度。
訓練人物通常設置network_dimension = 32,也可設置16或64,畫風可以考慮128。通常訓練人物不超過2000 steps 即可完成訓練。
我嘗試使用了 192 dim 訓練分辨率為1024*1024的人物圖像,學會了低 dim 下無法學會的復雜特征,但訓練步數超過了15000 步。
我嘗試使用了 192 dim 訓練分辨率為1024*1024的人物圖像,學會了低 dim 下無法學會的復雜特征,但訓練步數超過了15000步。
Kasukanra 使用 200 dim 訓練畫風,他的測試結論是在更高 dim 下( 如 256 ),訓練效果不佳。
https://www.youtube.com/watch?v=7m522D01mh0&t=1714s
你應該謹慎選擇 dim 值,一個合適的 dim 能有效減少過擬合與欠擬合發(fā)生的概率。我傾向于設置成128這樣的整數,再不急也使用192這樣的數湊整。
5. alpha
指定 ``alpha`` 值以防止下溢并穩(wěn)定學習。 默認值為 1。 如果您指定與 ``network_dim`` 相同的值,它的行為與以前的版本相同。
alpha 被推薦設置為 network_dimension 的一半,一些封裝的訓練腳本也默認這么設置。為了弄明白這個參數的作用,我翻開了源代碼文件 lora.py 關于alpha 的部分。
其中有
可見,當alpha設置為一半dim時,scale為0.5,可以放縮網絡的權重。從名字也可得知,這是一個縮放因子。但是這還不夠,我打開了merge_lora.py,其中在合并到sd模型的文件中有
可見,該參數將模型權重放縮防止下溢,在半精度訓練中很有意義。
6. learning_rate
學習率,在未設置 unet 學習率 和 text_encoder 學習率時生效。
7. steps
這不是一個可以設置的參數,但是必須要提,true_step = epochs * num_img / batch_size。
比如,你訓練 8個 epochs,圖片文件夾 10_dogs,里面有 50 張狗的圖片。意味著重復10次,每個epoch 訓練 500 steps。如果你的 batch_size = 4,還要除以 4,實際每個 epochs 只有 125steps。8 個 epochs 后 steps 是 1000。
還記得我們前面說的嗎?更大的batch_size需要更多epochs。batch_size = 4 并不是意味著更新四次梯度,而意味著一次計算4張圖片的梯度。業(yè)界常見的做法是讓學習率隨batch_size線性增加,不過我并不確定在這里是否使用。
8. unet_lr
unet 的學習率,默認值是1e-4,你也可以寫 0.0001。使用不同學習率時有所調整,當你的 network_dimension較大時,需要更多的 steps 與更低的學習率。
9. text_encoder_lr
為與 ext 編碼器關聯(lián)的 LoRA 模塊使用不同于正常學習率(使用 --learning_rate 選項指定)的學習率時指定。 有人說最好將Text Encoder設置為稍微低一點的學習率(比如5e-5)。
text_encoder 的學習率,常取定值5e-5,也有許多人將他調成 unet_lr 的 10-15分之一,調整到 unet_lr 1/8 附近也是常見的做法。有人說調低該參數有助于更多學習文本編碼器(對 tag 更敏感)。
10. scheduler
學習率調度器,有以下幾種
["cosine_with_restarts", "cosine", "polynomial", "constant", "constant_with_warmup", "linear"]
不妨搜索學習率調整策略。推薦使用 cosine_with_restarts,它會使學習率從高到低下降,變化速度先慢后快再慢。restarts 表示余弦退火的熱重啟次數,有助于逃脫平坦區(qū)域。
11. cycle
決定了重啟次數,4-8 都是常見數值。不要太大,重啟太多意義不大。
12. optimizer_type
["AdamW", "AdamW8bit", "Lion", "SGDNesterov", "SGDNesterov8bit", "DAdaptation", "AdaFactor"]
關于優(yōu)化器的原理可以自行查詢,Lion 是很新的一種優(yōu)化器。如果你不了解優(yōu)化器,使用 AdamW、AdamW8bit、Lion 、 DAdaptation 即可。AdamW8bit 對于顯存小的用戶更友好。Lion 優(yōu)化器的使用率也很高,學習率需要設置得很?。ㄈ鏏damW優(yōu)化器下的 1/3,或者更?。?/p>
使用 DAdaptation 時,應當將學習率設置在1附近,text_encoder_lr 可以設置成1,或者小一點,0.5之類。使用DAdaptation 時,推薦將學習率調整策略調整為 constant 。
### 關于指定優(yōu)化器
使用 --optimizer_args 選項指定優(yōu)化器選項參數。 可以以key=value的格式指定多個值。 此外,您可以指定多個值,以逗號分隔。 例如,要指定 AdamW 優(yōu)化器的參數,``--optimizer_args weight_decay=0.01 betas=.9,.999``。
指定可選參數時,請檢查每個優(yōu)化器的規(guī)格。
一些優(yōu)化器有一個必需的參數,如果省略它會自動添加(例如 SGDNesterov 的動量)。 檢查控制臺輸出。
D-Adaptation 優(yōu)化器自動調整學習率。 學習率選項指定的值不是學習率本身,而是D-Adaptation決定的學習率的應用率,所以通常指定1.0。 如果您希望 Text Encoder 的學習率是 U-Net 的一半,請指定 ``--text_encoder_lr=0.5 --unet_lr=1.0``。
如果指定 relative_step=True,AdaFactor 優(yōu)化器可以自動調整學習率(如果省略,將默認添加)。 自動調整時,學習率調度器被迫使用 adafactor_scheduler。 此外,指定 scale_parameter 和 warmup_init 似乎也不錯。
自動調整的選項類似于``--optimizer_args "relative_step=True" "scale_parameter=True" "warmup_init=True"``。
如果您不想自動調整學習率,請?zhí)砑涌蛇x參數 ``relative_step=False``。 在那種情況下,似乎建議將 constant_with_warmup 用于學習率調度程序,而不要為梯度剪裁范數。 所以參數就像``--optimizer_type=adafactor --optimizer_args "relative_step=False" --lr_scheduler="constant_with_warmup" --max_grad_norm=0.0``。
13. shuffle_captions
打亂 tag,開啟后能夠提高模型的泛化性,但是使用不當會欠擬合,使用時最好 keep_tokens。
14. keep_tokens
保證最前面的幾個 tag 不被打亂,默認為1??梢远嘁稽c,保證打亂后仍然滿足 asdweasf, 1girl, full body, outdoors 這種。
15. unet_only / text_only
unet_only 有時有用,只訓練unet,顯存嚴重不足時使用。
16. noise_offset
有助于生成特別暗或特別亮的圖像,通常設置為 0.1,見 https://www.crosslabs.org//blog/diffusion-with-offset-noise
17. persistent_data_loader_workers
建議開啟
在 Windows 環(huán)境中指定它可以顯著減少時期之間的延遲。
18. max_data_loader_n_workers`
如果cpu很爛,設置成1或2
指定數據加載的進程數。 大量的進程會更快地加載數據并更有效地使用 GPU,但會消耗更多的主內存。 默認是"`8`或者`CPU并發(fā)執(zhí)行線程數 - 1`,取小者",所以如果主存沒有空間或者GPU使用率大概在90%以上,就看那些數字和 `2` 或將其降低到大約 `1`。
19. mixed_precision
混合精度,推薦bf16,保存精度請與它一致。
20. prior_loss_weight
使用正則化時使用,該權重控制先驗知識強度,默認為1。使用100張以上訓練集有人推薦是5%-10%,不要設置更低了,那等于沒有正則化,使用正則化權重1時模型收斂會非常困難。我在設置為1時多次炸爐,推薦訓練畫風時使用正則化。
21. gradient_checkpointing
通過逐步計算權重而不是在訓練期間一次計算所有權重來減少訓練所需的 GPU 內存量。 關閉它不會影響準確性,但打開它允許更大的批量大小,所以那里有影響。
? ? ?另外,打開它通常會減慢速度,但可以增加批量大小,因此總的學習時間實際上可能會更快。
一個節(jié)約顯存的設置,然而我看見有的訓練腳本里內容是pass(根本不起作用)推薦關閉,除非你顯存嚴重不足。
22. --xformers` / `--mem_eff_attn`
當指定 xformers 選項時,使用 xformers 的 CrossAttention。如果未安裝 xformers 或發(fā)生錯誤(取決于環(huán)境,例如 `mixed_precision="no"`),請指定 `mem_eff_attn` 選項而不是使用 CrossAttention 的內存節(jié)省版本(比 xformers 慢)。
都不開啟的情況,24GB顯存也非常容易炸。通常開啟xformers,不要開啟 mem_eff_attn,速度感人。除非你是16系顯卡……
23. cache_latents
緩存潛變量,通常開啟,提高速度,與 random_crop 互斥。
此外,在學習過程中執(zhí)行 `random_crop` 或 `color_aug` 時,無法提前獲取 latents(因為每次學習時圖像都會改變)。如果你不預取,你可以從到目前為止的元數據中學習。事先獲取圖像的潛在表示并將其保存到磁盤。這允許快速學習。同時進行bucketing(根據縱橫比對訓練數據進行分類)
24. enable_bucket
開啟后會進行分桶,如果你的訓練集有不同分辨率圖像則開啟,會略微多消耗顯存。
25. flip_aug
如果指定 --flip_aug 選項,它將執(zhí)行水平翻轉擴充(數據擴充)。你可以人為的將數據量加倍,但是如果在數據不對稱的時候指定(比如人物外貌、發(fā)型等),學習就不會很順利。
可選項,如果學習畫風可以開啟,人物也可以考慮,但是要是人物劉海有方向這種,就會出事。默認關閉。
26. lr_warmup_steps
可開可不開的東西,默認10%。預熱階段,不要聽信別人說什么開始需要學習率大,那是穩(wěn)定了才需要的,開始的梯度本身就很大,開啟有助于減少神經元失活問題。
說得好,我決定設置為 0(X)
三、Locon 訓練參數
1. 如何理解 locon (Conventional LoRA)
通過矩陣乘法降階矩陣來降低參數的量。如 W = AB
W: (m,n)
A: (m,p)
B: (p, n)
https://zhuanlan.zhihu.com/p/612133434
2. 作者推薦參數
作者的推薦:
Include Conv layer implementation from LoCon
recommended settings
dim <= 64
alpha = 1 (or lower, like 0.3)
3. 實驗參數
有的人 卷積 40 alpha 40 線性 40 alpha 40 仍然有不錯效果(玄學調參)我沒怎么練,不知道。
四、Loha 訓練參數
1. 如何理解 loha
通過哈達馬積進一步降低參數的量.

Use network_dim=0 or conv_dim=0 to disable linear/conv layer
LoHa doesn't support dropout yet.
2. 調參
recommended settings
dim <= 32
alpha = 1 (or lower)
WARNING: You are not supposed to use dim>64 in LoHa, which is over sqrt(original_dim) for almost all layer in SD
High dim with LoHa may cause unstable loss or just goes to NaN. If you want to use high dim LoHa, please use lower lr
WARNING-AGAIN: Use parameter-efficient algorithim in parameter-unefficient way is not a good idea
經過實驗,效果不佳,可能是LOHA不適合訓練特征不太明確的畫風(很容易出現(xiàn)解剖結構崩壞的情況)。但是LOGA在特征較為明顯的畫風上表現(xiàn)比LOCON更好。推薦卷積層與線性層alpha都為1,線性層dim 32,64,16,8,卷積層dim 16,8,4,這也是目前比較成功的模型普遍采用的參數。
此外,loha 模型較難收斂,訓練 Loha 畫風普遍在 20000 - 30000 步……(所以說為了一點模型大小值得嗎,不過在一些訓練集上確實表現(xiàn)更好,另一些則是災難)一些撲克之類構圖訓練也在 8000 步以上,只看到一兩個模型2800 左右步數。