本文為您介紹如何使用Kohya訓練LoRA模型。
背景信息
Stable Diffusion(SD)是一個開源的深度學習文生圖模型。SD WebUI是SD的可視化界面,支持網頁端文生圖、圖生圖操作,并通過插件和模型導入實現高度定制化。
使用SD WebUI生成圖片需要使用多種模型,不同模型有各自的特色與適用領域,需要針對性地采用不同的訓練數據集及訓練策略進行培養。其中,LoRA是一種輕量化的模型微調方法,速度較快,文件大小適中,對配置要求低。
Kohya是廣泛應用的LoRA模型訓練開源服務,Kohya's GUI程序包提供了訓練環境和模型訓練的用戶界面,避免與其他程序干擾。SD WebUI也支持通過插件進行模型訓練,但可能會產生干擾,導致報錯 。
其他模型微調方法請參見模型介紹。
LoRA模型介紹
LoRA(Low-Rank Adaptation of Large Language Models)可以基于基礎模型通過對數據集的訓練,得到一個風格化的模型,從而實現高度定制化的圖像生成效果。
文件規格如下:
文件大小:通常為個位到百級MB,具體大小取決于受訓練參數與基礎模型的復雜度。
文件格式:采用.safetensors作為標準后綴。
文件應用:需與特定的Checkpoint基礎模型結合使用。
文件版本:需要明確區分Stable Diffusion v1.5與Stable Diffusion XL版本,各版本間模型不通用。
LoRA微調模型
如果將基礎模型(如Stable Diffusion v1.5 Model、v2.1 Model或Stable Diffusion XL base 1.0 Model等)視作基礎原生態的自然食材,那么LoRA模型則是某種特殊風味的調味料,旨在為這些食材賦予獨特的風味與創新。為了使料理具備多樣性和創新性,LoRA模型作為關鍵的創新催化劑,可以突破基礎模型在創造過程中遭遇的局限性,使內容創作更加靈活高效,個性十足。
以Stable Diffusion v1.5模型為例,其局限性包括:
生成內容細節精準度缺失:在生成特定細節或復雜內容時,可能難以精準復現所有細節,導致生成圖像缺乏細節或不夠逼真。
生成內容邏輯性構建不足:生成圖像中的物體布局、尺寸比例及光影邏輯可能不符合現實規律。
生成內容風格不一致:高度復雜且隨機的生成過程,使得維持特定風格或執行風格轉移時,難以確保風格的統一與連貫。
當前模型生態社區已有眾多優秀的微調模型,此類模型均基于基礎模型微調訓練產生。相較于原始基礎模型,生成圖像細節更豐富,風格特征也更加鮮明,且生成內容更加可控。例如,下圖展示了Stable Diffusion v1.5模型和微調模型生成圖像效果對比,可以直觀感受到圖像生成質量的顯著提升。
LoRA模型的不同類型
LyCORIS(LoHa/LoCon的前身)
LyCORIS作為LoRA的增強版,能夠對26層的神經網絡進行精細調整,相比LoRA僅支持17層的微調,在性能上顯著提升。因此,相較于LoRA,LyCORIS表現力更強,有更多的參數,可以承載更多的信息量。LyCORIS的核心優勢在于LoHa與LoCon。其中,LoCon專注于針對SD模型的每一層級進行調整,而LoHa則在原基礎上實現雙倍數據信息量。
用法和LoRA相同,進階用法可以通過調整文本編碼的權重、Unet的權重和DyLoRa的權重實現。
LoCon
LoRA(Conventional LoRA)只調整了cross-attention layers,LoCon用同樣的方法調整了ResNet矩陣。目前LoCon已經被LyCORIS合并,過去擴展的LoCon已經不再需要。更多信息,參見 LoCon-LoRA for Convolution Network。
LoHa
LoHa(LoRA with Hadamard Product)用Hadamard Product替換了原方法中的矩陣點乘,理論上在相同的情況下能容納更多信息。更多信息,請參見FedPara Low-Rank Hadamard Product For Communication-Efficient Federated Learning。
DyLoRA
LoRA的rank并非越高越好,其最優值需依據具體模型、數據集特性和所執行任務共同決定。DyLoRA能夠在指定維度(rank)下靈活探索并學習多種rank的LoRA配置,簡化了尋找最適rank的復雜度,從而提升了模型調優的效率與精準度。
準備數據集
確定LoRA類型
首先您需要確定希望訓練的LoRA模型的類型,比如是角色類型還是風格類型。
例如,需要訓練一個阿里云進化設計語言體系下的阿里云3D產品圖標風格的風格模型。
數據集內容要求
數據集由圖片和圖片對應的文本描述標注兩種文件組成。
準備數據集內容:圖片
圖片要求
數量:15張以上。
質量:分辨率適中,畫質清晰。
風格:需要一套風格統一的圖片內容。
內容:圖片需凸顯要訓練的主體物形象,不宜有復雜背景以及其他無關的內容,尤其是文字。
尺寸:分辨率是64的倍數,范圍為512~768。顯存低可以裁剪為512*512,顯存高可以裁剪為768*768。
圖片預處理
質量調整:圖片分辨率適中即可,保證畫質清晰,但也無需太大。畫質會影響模型訓練的結果。如果自己準備的圖片分辨率比較小,不是很清晰,可以使用SD WebUI中Extras頁面進行分辨率放大,也可以使用其他圖像處理工具去處理圖像的分辨率。
尺寸調整:可以前往像birme站點批量裁剪后批量下載,也可以使用SD WebUI裁剪或手動裁剪。
圖片部分準備完畢示例
將圖片存放至本地文件夾中。
創建數據集并上傳文件
上傳前需要注意文件的屬性和命名要求,如果只是用平臺管理數據集文件或者給圖片打標,直接上傳文件或文件夾都可以,對這些文件和文件夾的命名沒有特殊要求。
如果數據集打標完之后,需要用平臺的Kohya做LoRA模型訓練,對于上傳的文件屬性和命名要求如下。
命名格式:數字+下劃線+任意名稱
命名含義:自定義。
數字:每張圖片重復訓練次數,一般要求≥100??傆柧毚螖狄话阋?gt;1500,因此若文件夾內包含10張圖片,則每張圖片訓練1500/10=150次,圖片文件夾名數字部分可為150;若文件夾內包含20張圖片,則每張圖片訓練1500/20=75(<100)次,圖片文件夾名數字部分可為100。
任意名稱:本文以100_ACD3DICON為例,您可以根據實際情況自定義。
登錄PAI ArtLab,選擇Kohya(專享版),進入Kohya-SS頁面。
創建數據集
在數據集頁面,單擊新建數據集,并輸入數據集名稱,此處以acd3dicon為例。
上傳數據集文件
單擊已創建的數據集,將整理好的數據集圖片文件夾從本地拖拽上傳。
上傳成功。
進入到文件夾里可以查看到已上傳的圖片。
準備數據集內容:圖片標注
圖片標注是指每張圖片對應的文字描述,文字描述的標注文件,是與圖片同名的TXT格式的文件。
圖片標注要求
B端元素通常具備清晰的結構布局、規范的透視效果及特定的光影,因此在進行標注處理時,需要區別于人像、風景等類型的數據集圖像處理方法。建議采取基礎的描繪打標,集中關注并標注元素的頂層、中層及底部的簡單幾何形態,如“球形”、“立方體”等。
分類
關鍵詞
業務
產品/業務
數據庫、云安全、計算平臺、容器、云原生等(英文)
云計算元素
Data processing、Storage、Computing、Cloud computing、Elastic computing、Distributed storage、Cloud database、Virtualization、Containerization、Cloud security、Cloud architecture、Cloud services、Server、Load balancing、Automated management、Scalability、Disaster recovery、High availability、Cloud monitoring、Cloud billing
設計(質感)
環境&構圖
viewfinder、isometric、hdri environment、white background、negative space
材質
glossy texture、matte texture、metallic texture、glass texture、frosted glass texture
照明
studio lighting、soft lighting
色彩
alibaba cloud orange、white、black、gradient orange、transparent、silver
情緒
rational、orderly、energetic、vibrant
質量
UHD、accurate、high details、best quality、1080P、16k、8k
設計(氛圍)
...
...
示例一:針對3D圖標畫面打標的信息維度的拆分。
示例二:針對紫砂壺物品打標的信息維度的拆分。
給圖片添加標注
您可以手動為每張圖片添加對應的文字描述,但當圖片數量非常大時,手動打標非常耗時耗力,此時您可以選擇借助神經網絡,完成對所有圖片批量生成文本描述的工作,或者在Kohya中選擇使用BLIP的圖像打標模型,搭配手動微調,滿足您的業務需求。
打標數據集
在Kohya-SS頁面,選擇Utilities>Captioning>BLIP Captioning。
選擇已創建的數據集中上傳的圖片文件夾。
輸入一些預置詞,讓機器給每一張圖片都批量加上您輸入的標注文本。您可以結合自己對數據集圖片拆分的維度去添加預置詞,不同類型的圖片打標的維度也不同。
單擊Caption Image即可開始打標。
在下方的日志里可以查看打標的進度和打標完成的提示。
返回數據集,可以看到剛才上傳的圖片已經有對應的標注文件。
(可選)對于不合適的標注,可以手動修改。
訓練LoRA模型
在Kohya-SS頁面,選擇LoRA(LoRA)>Training(訓練)>Source Model(模型來源)。
配置以下參數:
Model Quick Pick(快速選擇模型):runwayml/stable-diffusion-v1-5
Save trained model as(保存訓練模型為):safetensors
在Kohya-SS頁面,選擇LoRA(LoRA)>Training(訓練)>Folders(文件夾)。
選擇已上傳了數據集文件夾的數據集,并配置訓練參數。
說明數據集文件打標時,要選到數據集下面圖片的文件夾;做模型訓練時,要選擇放置數據集文件夾的數據集。
單擊Start training,開始訓練。
更多參數信息,請參見常用訓練參數介紹說明。
在下方的日志里可以查看模型訓練進度和模型訓練完成的提示。
常用訓練參數介紹說明
參數介紹
圖片數量*repeat數量*設置的epoch/batch_size=模型訓練總步數
例如,10張圖*20步*10個循環/2并行數=1000步。
在Kohya-SS頁面,選擇LoRA(LoRA)>Training(訓練)>Parameters(參數),即可配置模型訓練參數,常用參數說明如下:
Basic(基礎)頁簽
參數
功能
設置說明
repeat
讀取圖像次數
在文件夾命名時設置讀取圖像的次數,次數越多學習效果越好。初期訓練時建議設置如下:
二次元:7~15
人像:20~30
實物:30~100
LoRA type
選擇LoRA類型
保持默認選擇Standard。
LoRA network weights
LoRA網絡權重
選填。如果要接著訓練則選用最后訓練的LoRA。
Train batch size
訓練批量大小
根據顯卡性能選擇。12G顯存最大為2,8G顯存最大為1。
Epoch
訓練輪數,將所有數據訓練一次為一輪
自行計算。一般:
Kohya中總訓練次數=訓練圖片數量x重復次數x訓練輪數/訓練批量大小
WebUI中總訓練次數=訓練圖片數量x重復次數
使用類別圖像時,在Kohya或在WebUI中總訓練次數都會乘2;在Kohya中模型存儲次數會減半。
Save every N epochs
每N個訓練周期保存一次結果
如設為2,則每完成2輪訓練保存一次訓練結果。
Caption Extension
打標文件擴展名
選填。 訓練圖集中注解/提示文件的格式為.txt。
如圖:
Mixed precision
混合精度
根據顯卡性能決定。取值如下:
no
fp16(默認)
bf16(RTX30以上顯卡可選bf16)
Save precision
保存精度
根據顯卡性能決定。取值如下:
no
fp16(默認)
bf16(RTX30以上顯卡可選bf16)
Number of CPU threads per core
CPU每核線程數
主要為顯存,根據所購實例和需求調整,保持默認即可。
Seed
隨機數種子
可以用于生圖驗證。
Cache latents
緩存潛變量
默認開啟,訓練后圖像信息會緩存為latens文件。
LR Scheduler
學習率調度器
理論上沒有最佳學習點,為了能夠找到一個最佳的假設值,一般可以使用cosine(余弦函數)。
Optimizer
優化器
默認AdamW8bit。如果基于sd1.5的基礎模型訓練,保持默認值即可。
Learning rate
學習率
初期訓練時,建議設置學習率為0.01~0.001。默認值為0.0001。
可以根據損失函數(loss)調整學習率:當loss值偏高時,可以適度提升學習率;若loss值較低,可以逐步減少學習率有助于精細調優模型。
高學習率加速訓練但可能因學習粗糙引發過擬合,即模型對訓練數據過度適應而泛化能力差。
低學習率雖能細致學習,減少過擬合,但可能導致訓練時間長和欠擬合,即模型簡化而未能把握數據特性。
LR Warmup(% of steps)
學習率預熱(%的步數)
默認值為10。
Max Resolution
最大分辨率
根據圖片情況設置。默認值為512,512。
Network Rank (Dimension)
模型復雜度
一般設置為64即可適應大部分場景。
Network Alpha
網絡Alpha
建議可以設置較小值,Rank和Alpha設置會影響最終輸出LoRA的大小。
Clip skip
文本編碼器跳過層數
二次元選2,寫實模型選1,動漫模型訓練最初就有跳過一層,如使用訓練素材也是二次元圖像,再跳一層=2。
Sample every n epochs
每n個訓練周期采樣一次
每幾輪保存一次樣本。
Sample prompts
樣本提示
提示詞樣本。需要使用命令,參數如下:
--n:反向提示詞。
--w:圖片寬度。
--h:圖片高度。
--d:圖像種子。
--l:提示詞相關性(cfg比例)。
--s:迭代步數(steps)。
Advanced(增強)頁簽
參數
功能
設置說明
Clip skip
文本編碼器跳過層數
二次元選2,寫實模型選1,動漫模型訓練最初就有跳過一層,如使用訓練素材也是二次元圖像,再跳一層=2。
Samples(樣例)頁簽
參數
功能
設置說明
Sample every N epochs
每N個訓練周期采樣一次
每幾輪保存一次樣本。
Sample prompts
樣本提示
提示詞樣本。需要使用命令,參數如下:
--n:反向提示詞。
--w:圖片寬度。
--h:圖片高度。
--d:圖像種子。
--l:提示詞相關性(cfg比例)。
--s:迭代步數(steps)。
Loss值介紹
在微調模型訓練過程中(LoRA),Loss值可以算是一個比較重要的衡量模型優劣的指標。理想狀況下,隨著訓練的進程,Loss值應呈現逐漸下降的趨勢,這代表訓練過程機器正在有效學習并逐漸去貼合用戶提供的訓練數據。一般Loss值維持在0.08至0.1之間,表明模型訓練的結果較好,Loss值為0.08時,模型訓練的結果比較理想。
可以說LoRA學習就是Loss值從高到低的過程。假設訓練周期Epoch為30,如果目標是獲取Loss值位于0.09至0.07區間的模型,則有望在第20至24個Epoch之間實現這一目標。這樣設置可以避免因訓練輪次過少而導致的Loss快速驟降。例如,僅經歷兩輪訓練Loss就從0.1驟減至0.06,可能會錯過期望的Loss區間。