[Flux] Lora 從訓練到放棄

[Flux] Lora 從訓練到放棄
AIGC, Flux Lora

自從 SD3 徹底被放棄之後,Flux 的出現又是一個新的氣象。加上前一陣子 C 站大動作率先支援 Flux Dev 的訓練,所以整個 Flux Lora 如同雨後春筍般瘋狂的冒了出來。

線上工具也是有諸如 AI-toolkit,本地端青龍的訓練包,以及 Kohya。


FLUX

這是由 Block Forest Labs 所釋出的新模型,目前市面上流通的是 Dev 與 Schnell 兩個版本,而 Pro 版本僅只能線上使用並未釋出。這兩個版本都是由 Pro 版本剪支而來(應該是吧?),而 Schnell 則是更精簡的 4 步生成模型。

兩個模型的使用授權範圍不同,Dev 是不可商用的,而 Schnell 基本上走的是 Apache 2.0 的授權,所以商用上沒什麼太大問題。

目前比較大宗的訓練面向還是以 Dev 為主(因為 C 站率先開了第一槍),所以這邊我也會以 Dev 的訓練來介紹。


Lora 訓練

Lora 基本的概念我就不贅述了,訓練 Flux 跟訓練 SD1.5/SDXL 差不多,該準備的提詞、圖片你也一樣都不能少。至於說,訓練的過程中會發生什麼事情,我後續在慢慢跟各位介紹。

首先,訓練的方法有很多選擇,

  1. CIVITAI 線上訓練,目前應該最方便。
  2. AI-toolkit, Colab 需要 Colab Pro 你會跑得比較開心。
  3. Kohya, sd-scripts, sd3 分支 本地端訓練,你需要最少 12GB,最好 16GB 以上 VRAM,系統記憶體最少 32GB 比較保險。
  4. Kohya GUI, sd4-flux.1 分支 然後他有一個 Typo,我去開 Issue 了但是他還沒修掉。
  5. Tensor.Art 很少人知道他可以練吧?官方看到我這篇會不會把他關閉呢?

CIVITAI 訓練器

註冊帳號什麼的我就不贅述了。這邊直接給大家參數的畫面參考,

選擇 Flux Dev Base Model for Training

首先你得選擇 FLUX Dev 的項目當作基本的訓練模型。

訓練參數設置

這邊幾個項目我稍微說明一下,

參數設定說明
Epochs5設定訓練要跑幾個輪次,當然數字高一點對穩健性比較有幫助。
Num Repeats10設定圖片在訓練時要被看幾次,數字不是越高越好,你圖片數量夠多的情況下,可以斟酌減少這個數量。
Train Batch Size4這邊可以先使用 4 沒有問題,他對於訓練目標特徵的固定有幫助。
Resolution1024這邊可以直接開到最大 1024,如果你的訓練圖片沒有大於這個尺寸,那麼你可以降低到 768 或是 512 試試看。

其他的參數可以不需要更改。最後,你會得到一個 Steps 也就是總共訓練會跑得步數,C 站計算 Buzz 點數主要是依照這個步數為主,步數越高,需要消耗的點數也越高。

這邊建議你可以把步數抓在 4,000 附近。

訓練參數

這裡的參數是這樣的,

參數設定說明
Unet LR0.00010這是 UNET 學習率,建議使用 1e-4 或是 5e-5,我這邊採用 1e-4
LR Schedulerconstant這是學習率排程器,採用這個方法對於後面我們使用的優化器來說是不錯的選項。
LR Scheduler Cycles1其實這個項目不會用到,除非你排程器使用 cosine_with_restart 才會有效果。
Network Dim16如果你只是練一個角色,用 16 其實就足夠了。
Network Alpha8由於 Unet LR 使用 1e-4,所以我們這裡用 8
Noise Offset0.03這邊先採用與 SDXL 相近的數值就好。
OptimizerAdamW8Bit我們這邊採用 AdamW8Bit 優化器即可。

由於在 C 站的訓練器背後是採用 Kohya,但版本不明,所以上述是目前我執行起來還算不錯的設定。

其實在 Flux 訓練中,排程器使用 constant_with_warmup 是更好的選擇,但由於 C 站並沒有提供 Lr warmup steps 的設定,所以我們這邊才會採用 constant 來執行。

而關於 Dim/Alpha 的設計,我之所以採用 Alpha = Dim / 2 的原因在於,我的學習率是使用 1e-4 的情況下,我希望在權重累加的時候削弱效果,所以 Alpha 才會採用 Dim 的一半來設定。實際上,你要使用 Dim = Alpha = 16 也是可以的。

設定好之後就可以讓他去幫你訓練模型了。


AI-Toolkit

這個工具需要在 Colab 上面執行,或者是你本地端的設備夠用的話,你也可以在本地端執行應該是沒有問題的。

要執行這個 notebook 你需要有 Huggungface 的帳號,並且要先取得 black-forest-labs/FLUX.1-dev 的存取權。

我這邊直接開啟他預設的項目來給大家說明,

AI-Toolkit 設定

這邊就按照項目來逐一說明:

項目說明
namemy_first_flux_lora_v1你的 Lora 名稱,你可以自己修改成你要的名字。
training_folder/content/output訓練後儲存的位置,這邊可以改成指定到你的 Google Drive 裡面的路徑。
network.linear16這邊就是我們所熟悉的 Network Dim,預設使用 16
network.linear_alpha16這邊就是我們所熟悉的 Network Alpha,預設使用 16。請注意!更改他貌似沒有作用,AI-Toolkit 訓練會讓 Alpha = Dim
AI-Toolkit 設定

接下是要設定你要訓練的資料集:

項目說明
folder_path/content/dataset你的圖片資料集的資料夾,資料夾中直接放置圖片跟提示詞檔案。
caption_exttxt圖片提示詞檔案的附檔名。
caption_dropout_rate0.05圖片提示詞捨棄率,在 Flux 中我並不確定這個是否真的有效。
shuffle_tokensFalse隨機打散提示詞,在 Flux 中我並不確定這個是否真的有效。
cache_latents_to_diskTrue快取潛空間資訊,預設啟用,請別更改他。
resolution[512, 768, 1024]Flux 可以支援多解析度訓練,所以可以放三個,你要改成一個也可以。

其中 shuffle_tokenscaption_dropout_rate 個人覺得應該是設定了也沒效果。根據 Kohya 的作法,在訓練 Flux 時會快取 Caption,所以這兩個設置基本上會直接失效。但我不確定 AI-Toolkit 背後的訓練機制,所以這兩個設定就暫時留著。

請注意!以上的設定只有設定一個資料夾,而他每個資料夾的圖片只會看 1 次。所以如果你要多組資料夾,或是要設定他的圖片重複次數,需要使用 num_repeats 來設定。

我舉個例子:

OrderedDict([
    ('folder_path', '/content/drive/MyDrive/portrait'),
    ('caption_ext', 'txt'),
    ('num_repeats', 5),
    ('cache_latents_to_disk', True),
    ('resolution', [512, 768, 1024])
]),
AI-Toolkit 設定

接著訓練設定,我沒有提到的部分你可以暫時忽略:

項目說明
batch_size1他在這邊預設使用 1,可以先使用這個沒問題,畢竟你不是每次都抽的到 A100。
steps2000預設訓練 2,000 步,你可以增加他或減少他,看你的訓練目標。
content_or_stylebalanced這邊可以選擇三種,content, style, balanced,是對於你的訓練目標的方向,預設是使用 balanced
optimizeradamw8bit優化器預設採用 adamw8bit
lr1e-4學習率預設使用 1e-4
linear_timestepsTrue這個項目你可以斟酌使用,實驗性功能,可能可以獲得比較好的結果。

最後是訓練時可以生成範例圖片的設定,如果你上面有使用 disable_sampling 的話,底下的設定就不需要管他了。

AI-Toolkit 設定

這個生成範例設定,在 Prompt 裡面的每一行都是一個描述,你可以改成你想要的描述,然後每一行都會生成一張圖片,如果你不想要太多,就把他刪減到只剩下一行就好。最後就是讓他跑訓練了。

使用神童 Prodigy 優化器

('lr_scheduler', 'cosine'),
('optimizer', 'prodigy'),
('lr', 1.0),
('optimizer_params', OrderedDict([
    ('safeguard_warmup', True),
    ('decouple', True),
    ('use_bias_correction', True),
    ('betas', [0.9, 0.99]),
    ('weight_decay', 0.5),
    ('d_coef', 2)
])),

具體要怎麼改我不多說,懂的就懂。


Kohya / Kohya GUI

我想這是絕大多數人熟悉的,在 Kohya GUI 新的分支 sd3-flux.1 當中,已經對 Kohya 的 Flux 訓練新增了支援。但我實在不知道他那個打錯字的 Bug 到底什麼時候要修。

首先,在本地端訓練,你需要準備以下檔案,

  1. flux.1-dev
  2. flux.1-schnell 如果你要訓練這種,才需要下載。
  3. ae
  4. clip-l
  5. t5xxl-fp16

接著我們從熟悉的 Kohya 介面開始,

Kohya GUI Flux.1

在預訓練模型的部分,你要選擇剛剛下載的 flux.1-dev.safetensors 檔案,這是一個 fp16 的 UNET 預訓練模型。在 Kohya 訓練器中,你只能使用這種預訓練模型(或是 flux.1-schnell.safetensors)。

Kohya GUI Flux.1

接著我們在 Lora Type 的地方選擇 Flux1,代表我們是要訓練 Flux。選擇了這個類型之後,我們在下方的參數設定中,就會多出一個區塊是關於 Flux1 的設定。

Kohya GUI Flux.1

這個地方我稍微說明一下,

參數說明
VAE Pathae.safetensors這邊要填入你剛剛下載的 ae.safetensors 的檔案路徑。
CLIP-L Pathclip-l.safetensors這邊要填入你剛剛下載的 clip-l.safetensors 的檔案路徑。
T5-XXL Patht5xxl-fp16.safetensors這邊要填入你剛剛下載的 t5xxl-fp16.safetensors 的檔案路徑。
Discrete Flow Shift3.1582Kohya 建議數值,當 Timestep Sampling 使用 shift 時。
Model Prediction Typeraw使用 raw 即可。
Timestep Samplingshift使用 shift 或是 flux_shift 都可以。
Apply T5 Attention Mask不使用你要使用他也可以,個人目前偏好不開。
Split Mode不使用VRAM 嚴重不足要開啟,但訓練速度會變慢很多。
Train Blockssingle你可以訓練 allsingle 都可。
Guidance Scale1.0請使用 1.0
Cache Text Encoder Outputs啟用請啟用他。
Cache Text Encoder Outputs to Disk啟用請啟用他。

這邊需要注意一點,關於 Timestep Sampling 在 Kohya GUI 的 Bug 還沒修正以前,請不要使用 flux_shift

Kohya GUI Flux.1

請在 Additional parameters 上面填入 --network_train_unet_only

Kohya GUI Flux.1

剩下的一些項目請依照上面的去設定即可。如果你不知道這些項目的功能,請勿隨意開啟或是設定他,我無法保證這樣是否會干擾到最終訓練結果。

最後,我知道大家很喜歡抄作業,所以我準備了一個在 Kohya 中可以訓練多解析度的設定,

Kohya Flux 多解析度訓練

如果你沒有要跑多解析度,就使用後面的 json 檔案就好。


Tensor.ART

最後提一下這件事情,關於 Tensor.art 的註冊我之前 有寫過 TensorArt 訓練筆記 我就不再多說。

因為 TensorArt 有人把 FLUX-Dev fp32 的模型放上去,所以在好奇心的驅使下,我就來嘗試看看到底能不能跑 Flux 訓練。

Tensor.Art 訓練

後面的訓練參數設定其實跟上面的設定差不多,

Tensor.Art 訓練

接下來就是賭你的運氣,看是不是 TensorArt 可以幫你跑完訓練了。

Tensor.Art 訓練

提詞

這件事情說起來真的很冗長,或許之後有時間我再整理這方面的相關資訊。目前的一個小小的結論是,

短提詞 + 自然語言描述

這是目前在訓練當中,算是表現比較好的一種訓練提詞方法。


小結

以下是我的 Flux 訓練結果,歡迎大家愛用,

  1. [LORA] FLUX - Yuki Suou / すおう ゆき / 周防有希
  2. [LORA] FLUX - Any Style Toon Lora
  3. [LORA] Flux Asian Mix Lora - schnell
  4. [LORA] Flux Asian Mix Lora
  5. [CHECKPOINT] Flux Asian Realistic
  6. [TensorArt - LORA] Flux Asian Mix Lora - schnell
  7. [TensorArt - CHECKPOINT] Flux Asian Realistic
Hina Chen
偏執與強迫症的患者,算不上是無可救藥,只是我已經遇上我的良醫了。
Taipei