《LORA模型訓(xùn)練超入門級(jí)教程》--人人都可以當(dāng)煉金術(shù)士


前言:
本教使用ChatGPT進(jìn)行輔助編寫,部分觀點(diǎn)根據(jù)ChatGPT提供的解釋進(jìn)行歸納總結(jié),如有描述不恰當(dāng)?shù)牡胤秸?qǐng)合理指出,我會(huì)回去教訓(xùn)那小子的。
部分觀點(diǎn)參考了UP主[秋葉aaaki][青龍圣者][Mr_日天]
注:
以下內(nèi)容是通過(guò)本人自身理解并總結(jié)編寫出的,同時(shí)也是初步接觸訓(xùn)練模型,因?yàn)楸救藦氖旅佬g(shù)行業(yè)主要還是會(huì)以美術(shù)視角出發(fā)來(lái)進(jìn)行講解,目的就是可以讓搞不懂代碼指令的小伙伴更容易上手Lora模型訓(xùn)練。
如有問(wèn)題歡迎大家在評(píng)論下方一起討論,知識(shí)探索的進(jìn)步腳步終將永不停止。

開始前請(qǐng)先下載以下內(nèi)容:
訓(xùn)練這里推薦秋葉大佬的訓(xùn)練腳本一鍵包:傳送門
還需要安裝批量打標(biāo)簽軟件:BooruDataset
鏈接:https://pan.baidu.com/s/16uFpMjWVLGRQDx-yUrhdiA?pwd=udbc?
提取碼:udbc?

正文:
為什么要訓(xùn)練Lora模型?
Lora模型作為一種微調(diào)模型具備的優(yōu)點(diǎn)如下:
節(jié)省訓(xùn)練時(shí)間:LORA模型的低層模型已經(jīng)在大規(guī)模的基準(zhǔn)數(shù)據(jù)集上訓(xùn)練過(guò)了,因此可以利用這些已經(jīng)學(xué)到的特征來(lái)加速新的訓(xùn)練過(guò)程。
提高準(zhǔn)確性:使用LORA模型微調(diào),可以在保持低層模型的特征提取能力的同時(shí),針對(duì)具體任務(wù)進(jìn)行優(yōu)化,從而提高模型在特定任務(wù)上的準(zhǔn)確性。
更小的數(shù)據(jù)集:訓(xùn)練LORA模型的訓(xùn)練素材不需要特別多,只用少量的即可訓(xùn)練出效果不錯(cuò)的模型。
可遷移性:可遷移性意味著可以在不同任務(wù)之間共享底層模型,從而減少重復(fù)訓(xùn)練,提高工作效率,使其能夠更快速地從一個(gè)任務(wù)轉(zhuǎn)移到另一個(gè)任務(wù)。
Lora模型訓(xùn)練流程:


01.訓(xùn)練環(huán)境搭建
Python安裝:

再點(diǎn)Install Now

沒(méi)有就不管。
Windows PowerShell設(shè)置:
1.右鍵Windows菜單圖標(biāo)打開Windows PowerShell.

2.復(fù)制Set-ExecutionPolicy -ExecutionPolicy RemoteSigned進(jìn)去回車?
3.出現(xiàn)下面選擇欄按A回車


02.訓(xùn)練模型相關(guān)知識(shí)點(diǎn)
*這一節(jié)只需要對(duì)訓(xùn)練模型的概念進(jìn)行一個(gè)簡(jiǎn)單的了解即可后面會(huì)講操作方法
在模型訓(xùn)練中需要關(guān)注的幾個(gè)方面:
1.全面充分的采集訓(xùn)練素材:列如在角色訓(xùn)練素材中,應(yīng)該有各種角度、表情、光線等情況下的素材,這樣才能確保模型具有較好的泛化性。
2.圖像預(yù)處理:對(duì)訓(xùn)練素材進(jìn)行分辨率調(diào)整、裁切操作,并對(duì)訓(xùn)練集進(jìn)行打標(biāo)簽處理。
3.參數(shù)調(diào)優(yōu):盡可能把訓(xùn)練時(shí)長(zhǎng)控制在半小時(shí)左右,通過(guò)調(diào)整等參數(shù)控制訓(xùn)練時(shí)長(zhǎng)。
4.觀察學(xué)習(xí)曲線:通過(guò)觀察學(xué)習(xí)曲線來(lái)對(duì)訓(xùn)練素材、訓(xùn)練參數(shù)進(jìn)行調(diào)整。
5.過(guò)擬合&欠擬合處理:測(cè)試訓(xùn)練好的模型觀察過(guò)擬合和欠擬合的問(wèn)題,再進(jìn)一步通過(guò)調(diào)整訓(xùn)練素材和正則化等手段來(lái)優(yōu)化。
(綜上所述,模型訓(xùn)練中需要關(guān)注的幾個(gè)重點(diǎn),需要結(jié)合具體的任務(wù)需求和數(shù)據(jù)特點(diǎn)來(lái)進(jìn)行調(diào)整和優(yōu)化,以達(dá)到最優(yōu)的訓(xùn)練效果。)
接下來(lái)需要簡(jiǎn)單了解一下訓(xùn)練模型中的幾個(gè)概念名詞:
1.過(guò)擬合&欠擬合? 2.泛化性? 3.正則化
過(guò)擬合&欠擬合:

在這個(gè)問(wèn)題上ChatGPT從美術(shù)角度給出的解釋:

總結(jié)下來(lái)就是:過(guò)擬合和欠擬合都是不好的現(xiàn)象,
我們需要加以控制,讓模型最終得到我們想要的效果。
解決方法:在模型訓(xùn)練中需要不斷對(duì)訓(xùn)練集、正則化、訓(xùn)練參數(shù)、進(jìn)行調(diào)整,(過(guò)擬合可以嘗試減少訓(xùn)練集的素材量,欠擬合就增加訓(xùn)練集的素材量。)
泛化性:
ChatGPT從美術(shù)角度給出的解釋:

總結(jié):泛化性不好的模型很難適應(yīng)其他風(fēng)格和多樣性的創(chuàng)作力??梢酝ㄟ^(guò)跑lora模型生圖測(cè)試來(lái)判斷泛化性是否良好。
解決辦法:跟解決過(guò)擬合欠擬合問(wèn)題一樣,從訓(xùn)練集、正則化、訓(xùn)練參數(shù)、進(jìn)行調(diào)整。
正則化:
ChatGPT從美術(shù)角度給出的解釋:

總結(jié):正則化是解決過(guò)擬合和欠擬合的情況,并提高泛化性的手段。
相當(dāng)于給模型加一些規(guī)則和約束,限制要優(yōu)化的參數(shù)有效防止過(guò)擬合,同時(shí)也可以讓模型更好適應(yīng)不同情況的表現(xiàn),提高泛化性。

03.訓(xùn)練模型相關(guān)知識(shí)點(diǎn)
訓(xùn)練素材處理:

如果是角色訓(xùn)練集控制在20-50張圖左右,太多會(huì)導(dǎo)致過(guò)擬合
如果是角色盡可能收集到頭像,正視圖,側(cè)視圖,背面等多角度的無(wú)背景素材,增加不同畫風(fēng)的素材可以提高模型應(yīng)對(duì)不同風(fēng)格的手段,畫風(fēng)訓(xùn)練可以提高到更多。
*素材可以少,但是質(zhì)量一定要高。

*角色背景最好是白底網(wǎng)站上面可以選擇換背景顏色
推薦一個(gè)自動(dòng)扣圖的網(wǎng)站:https://pickwant.com/home
圖片批量裁切:

https://www.birme.net/
之后利用工具網(wǎng)站把所有圖片批量進(jìn)行統(tǒng)一分辨率裁切
分辨率需要是64的倍數(shù)
分辨率預(yù)先處理好基本可以直接扔進(jìn)AI進(jìn)行訓(xùn)練不用再做分割處理了
(尺寸越大越吃顯存,可能會(huì)出現(xiàn)報(bào)錯(cuò)學(xué)習(xí)卡死等問(wèn)題)
圖像預(yù)處理:

把訓(xùn)練素材文件路徑扔到Stable Diffusion的訓(xùn)練模塊下圖像預(yù)處理功能,進(jìn)行生成tags標(biāo)簽。
打標(biāo)簽:

進(jìn)入批量打標(biāo)簽軟件點(diǎn)擊上方File的Load folder后選擇處理好的訓(xùn)練集路徑。
批量打標(biāo)簽軟件BooruDataset基本操作:

1.點(diǎn)擊上方的File--Load folde載入訓(xùn)練素材路徑
2.左邊一欄是單張編輯右邊一欄是批量編輯
3 .+是增加標(biāo)簽? x是刪除標(biāo)簽? ?是保存
4.最后修改完標(biāo)簽點(diǎn)擊File—Save all changes保存全部標(biāo)簽
關(guān)于打標(biāo)簽詳細(xì)解釋:

1.整合概念標(biāo)簽,列如你要訓(xùn)練這個(gè)角色,添加他的名稱后,
需要?jiǎng)h除紅框內(nèi)描述此概念的部分特征標(biāo)簽,
意思是將它們都融入到你的lora這個(gè)概念本身,提高lora模型調(diào)用效率,更精準(zhǔn)的復(fù)原角色的發(fā)型發(fā)色瞳色等生理特征,同時(shí)也減少調(diào)用詞條的數(shù)量。
*(1).刪除的tag會(huì)被固化在模型當(dāng)中,
(2).但是這樣做法還為了防止將基礎(chǔ)模型中的同樣tag引導(dǎo)到你的lora上,從而導(dǎo)致過(guò)擬合。
(3).盡可能添加一個(gè)不存在的標(biāo)簽用于調(diào)度你訓(xùn)練的lora模型
(4).如果是角色建議只刪除生理特征標(biāo)簽,保留著裝配飾裝備等。
2.如果從泛化性角度出發(fā),可以保留角色特征標(biāo)簽
*但是會(huì)導(dǎo)致調(diào)用困難,需要輸入大量的tag用于調(diào)用。
根據(jù)目前總結(jié)下來(lái)的倆種打標(biāo)簽的方法:
1. 保留全部標(biāo)簽:
優(yōu)勢(shì):效率快省時(shí)省力的訓(xùn)練出模型,擬合度提高,且過(guò)擬合出現(xiàn)的情況是最低的。
缺陷:風(fēng)格會(huì)變化過(guò)大,tag調(diào)用比較困難,訓(xùn)練時(shí)需要把epoch提高時(shí)間成本會(huì)被拉長(zhǎng)。
2.剔除部分特征標(biāo)簽:
優(yōu)勢(shì):整合成少量的觸發(fā)詞tag后,調(diào)用方便,更精準(zhǔn)還原角色特征。
缺陷:容易導(dǎo)致過(guò)擬合,泛化性也會(huì)降低,如果標(biāo)簽刪太多會(huì)導(dǎo)致生成的畫面非常固化。
訓(xùn)練文件夾結(jié)構(gòu)規(guī)范:
注:這里把概念名稱轉(zhuǎn)換成角色名稱方便理解,具體概念名稱按照需求進(jìn)行填寫,*文件夾命名不能用中文。

1.首先在腳本的LoraTraining目錄下新建訓(xùn)練文件夾命名為train
2.如果需要訓(xùn)練多個(gè)概念(例如:角色除了本體之外,還要加一個(gè)穿著泳裝訓(xùn)練素材),
這時(shí)候就在(input_角色名稱)下面再新建一個(gè)文件夾,命名寫(訓(xùn)練次數(shù)_角色名稱_泳裝)進(jìn)行文件夾區(qū)分。
正則化文件夾

正則化素材示意:
正則化在深度學(xué)習(xí)中指的是:給模型加一些規(guī)則和約束,限制要優(yōu)化的參數(shù)有效防止過(guò)擬合。

【假設(shè)我在訓(xùn)練集里面放入了一個(gè)泳裝角色的訓(xùn)練素材,那么為了防止過(guò)擬合的問(wèn)題,在正則化文件夾內(nèi)放入一些同樣類型的圖片素材】
正則化素材注意不要過(guò)多,不然機(jī)器會(huì)過(guò)多的學(xué)習(xí)到里面的素材導(dǎo)致跟訓(xùn)練目標(biāo)角色不一致,
可以用SD進(jìn)行快速生成。
*簡(jiǎn)單來(lái)說(shuō)就是讓AI稍微克制一下學(xué)習(xí)的程度,防止發(fā)生過(guò)擬合。
在我的理解看來(lái)正則化手段是目前控制過(guò)擬合問(wèn)題,最容易理解的一個(gè)操作的方法。

04.開始訓(xùn)練
訓(xùn)練腳本講解:
*我這邊之指出的都是常用參數(shù),沒(méi)有提到的可以不用做修改(如果自己能理解知道怎么去調(diào)整也可以,我這里只針對(duì)初級(jí)快速上手進(jìn)行快速講解。)

訓(xùn)練素材路徑設(shè)置參數(shù):
pretrained_model:底模型路徑,底模型一般選擇SD 1.5,底模型不能選擇過(guò)大的完整模型,選擇小模型否則內(nèi)存會(huì)爆。
train_data_dir:訓(xùn)練素材路徑
reg_data_dir:正則化素材路徑,沒(méi)有則不用填。

訓(xùn)練參數(shù):
resolution:圖片分辨率,寬,高。支持非正方形,但必須是 64 倍數(shù)。
batch_size:指的是在神經(jīng)網(wǎng)絡(luò)訓(xùn)練中,一次性送入模型的樣本數(shù)。
(通俗地說(shuō),就像做菜時(shí)一次性放入多少食材一樣,batch_size決定了一次送入多少樣本來(lái)訓(xùn)練模型。較大的batch_size可以加速訓(xùn)練,但會(huì)占用更多的內(nèi)存資源)
max_train_epoches:最大訓(xùn)練的epoch數(shù),即模型會(huì)在整個(gè)訓(xùn)練數(shù)據(jù)集上循環(huán)訓(xùn)練這么多次。
(假設(shè)最大訓(xùn)練epoch為10,即訓(xùn)練過(guò)程中將會(huì)進(jìn)行10次完整的訓(xùn)練集循環(huán)。這個(gè)參數(shù)可以根據(jù)實(shí)際情況進(jìn)行調(diào)整,以達(dá)到更好的模型效果)
network_dim:常用 4~128,不是越大越好,這個(gè)參數(shù)如果是訓(xùn)練畫風(fēng)的話可以給高一些,訓(xùn)練角色物件等不需要調(diào)整。
學(xué)習(xí)率(learning rate)
是訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí)一個(gè)很重要的超參數(shù),控制著權(quán)重的更新速度。這個(gè)參數(shù)越大,權(quán)重更新的幅度就越大;反之,越小更新的幅度越小。因此,設(shè)置一個(gè)合適的學(xué)習(xí)率可以使得訓(xùn)練過(guò)程更加穩(wěn)定、收斂速度更快。
ChatGPT從美術(shù)角度給出的解釋:

學(xué)習(xí)率參數(shù):

lr: 學(xué)習(xí)率,用來(lái)控制模型每次更新參數(shù)時(shí)的步長(zhǎng)大小。
unet_lr: 基本跟lr數(shù)值一樣即可。
text_encoder_lr: 文本編碼器的學(xué)習(xí)率。需要通過(guò)實(shí)踐具體情況來(lái)測(cè)試更改
lr_scheduler: 學(xué)習(xí)率調(diào)度策略,用來(lái)控制模型學(xué)習(xí)率的變化方式。這里提供了五種可選的調(diào)度策略,分別是:“l(fā)inear”,“cosine”,“cosine_with_restarts”,“polynomial”,“constant”,“constant_with_warmup”。基本只用“constant_with_warmup”
lr_warmup_steps: 熱身步數(shù),僅在學(xué)習(xí)率調(diào)度策略為“constant_with_warmup”時(shí)需要設(shè)置,用來(lái)控制模型在訓(xùn)練前逐漸增加學(xué)習(xí)率的步數(shù)。一般不動(dòng)
lr_restart_cycles: 余弦退火重啟次數(shù),僅在學(xué)習(xí)率調(diào)度策略為"cosine_with_restarts"時(shí)需要設(shè)置,用來(lái)控制余弦退火的重啟次數(shù)。一般不動(dòng)
(舉個(gè)例子,如果將學(xué)習(xí)率調(diào)度策略設(shè)置為“cosine_with_restarts”,那么模型的學(xué)習(xí)率會(huì)按照余弦函數(shù)的形式進(jìn)行變化,每當(dāng)達(dá)到一個(gè)重啟周期時(shí),學(xué)習(xí)率會(huì)重新回到初始值,然后再按照余弦函數(shù)進(jìn)行變化。重啟周期的次數(shù)就是lr_restart_cycles。)
*學(xué)習(xí)率這塊如果不理解可以不做修改
輸出設(shè)置和優(yōu)化器設(shè)置:

output_name:模型保存名稱
save_model_as:模型保存格式(一般不動(dòng))

優(yōu)化器設(shè)置:
use_8bit_adam:開啟是1,禁用改為0.
use_lion:開啟是1,禁用改為0.(目前效果最好的一個(gè)優(yōu)化器,但如果有正則化素材建議不開。)
開始煉丹
最后在腳本根目錄下右鍵選擇train.ps1文件—點(diǎn)擊PowerShell即可開始跑訓(xùn)練。


05.模型測(cè)試
最后從煉丹爐內(nèi)取最小值的模型為最佳,沒(méi)有效果再選取最終生成的版本。

Xyz圖表測(cè)試


打開美術(shù)風(fēng)格,選擇腳本XYZ圖表,
1.x軸類型選擇[可附加網(wǎng)絡(luò)]權(quán)重1? x軸值:寫你想測(cè)試的Lora權(quán)重即可。
2.Y軸類型選擇[可附加網(wǎng)絡(luò)]模型1? Y軸值:填你你想測(cè)試的Lora模型名稱。
3.Z軸類型選不選都可以。

總結(jié):
到這里就結(jié)束了~
最后感謝大家觀看本次教程,理論都是基礎(chǔ)實(shí)際效果還是需要實(shí)踐驗(yàn)證。
第一次寫教程(其實(shí)更偏學(xué)習(xí)過(guò)程中的總結(jié)),寫的如果不好請(qǐng)親噴,如有更好的見(jiàn)解歡迎在評(píng)論區(qū)討論,我也還在摸索階段也想更深入的學(xué)習(xí)訓(xùn)練模型知識(shí)。