[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 的項目當作基本的訓練模型。

訓練參數設置

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

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

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

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

訓練參數

這裡的參數是這樣的,

參數 設定 說明
Unet LR 0.00010 這是 UNET 學習率,建議使用 1e-4 或是 5e-5,我這邊採用 1e-4
LR Scheduler constant 這是學習率排程器,採用這個方法對於後面我們使用的優化器來說是不錯的選項。
LR Scheduler Cycles 1 其實這個項目不會用到,除非你排程器使用 cosine_with_restart 才會有效果。
Network Dim 16 如果你只是練一個角色,用 16 其實就足夠了。
Network Alpha 8 由於 Unet LR 使用 1e-4,所以我們這裡用 8
Noise Offset 0.03 這邊先採用與 SDXL 相近的數值就好。
Optimizer AdamW8Bit 我們這邊採用 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 設定

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

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

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

項目 說明
folder_path /content/dataset 你的圖片資料集的資料夾,資料夾中直接放置圖片跟提示詞檔案。
caption_ext txt 圖片提示詞檔案的附檔名。
caption_dropout_rate 0.05 圖片提示詞捨棄率,在 Flux 中我並不確定這個是否真的有效。
shuffle_tokens False 隨機打散提示詞,在 Flux 中我並不確定這個是否真的有效。
cache_latents_to_disk True 快取潛空間資訊,預設啟用,請別更改他。
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_size 1 他在這邊預設使用 1,可以先使用這個沒問題,畢竟你不是每次都抽的到 A100。
steps 2000 預設訓練 2,000 步,你可以增加他或減少他,看你的訓練目標。
content_or_style balanced 這邊可以選擇三種,content, style, balanced,是對於你的訓練目標的方向,預設是使用 balanced
optimizer adamw8bit 優化器預設採用 adamw8bit
lr 1e-4 學習率預設使用 1e-4
linear_timesteps True 這個項目你可以斟酌使用,實驗性功能,可能可以獲得比較好的結果。

最後是訓練時可以生成範例圖片的設定,如果你上面有使用 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 Path ae.safetensors 這邊要填入你剛剛下載的 ae.safetensors 的檔案路徑。
CLIP-L Path clip-l.safetensors 這邊要填入你剛剛下載的 clip-l.safetensors 的檔案路徑。
T5-XXL Path t5xxl-fp16.safetensors 這邊要填入你剛剛下載的 t5xxl-fp16.safetensors 的檔案路徑。
Discrete Flow Shift 3.1582 Kohya 建議數值,當 Timestep Sampling 使用 shift 時。
Model Prediction Type raw 使用 raw 即可。
Timestep Sampling shift 使用 shift 或是 flux_shift 都可以。
Apply T5 Attention Mask 不使用 你要使用他也可以,個人目前偏好不開。
Split Mode 不使用 VRAM 嚴重不足要開啟,但訓練速度會變慢很多。
Train Blocks single 你可以訓練 allsingle 都可。
Guidance Scale 1.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