[SD3.5] Quickstart - Lora Training with Kohya

SD3.5 Large with Lora

SD3.5 目前的表現應該可以算是擺脫 SD3 的慘狀。訓練器也陸續的出現,甚至 TensorArt 上面也已經放上訓練器了。這邊就快速的帶大家看一下目前使用 Kohya 訓練的結果。


Kohya, sd-scripts

目前 Kohya GUI 雖然有新的分支,但 GUI 在 Lora 介面上並沒有 SD3/SD3.5 的項目可以設定,所以這邊基本上是比較硬核的方式,你需要使用 CLI 的方式來操作整個訓練。

如果你先前已經有安裝過 Kohya GUI 的人,你要做的只有切換裡面 sd-scripts 的分支即可。

cd sd-scripts
git fetch
git checkout sd3

由於 Kohya 在前天(2024/11/01)已經把 sd3_5_support 合併回 sd3 這個分支,所以基本上可以使用 sd3 這個分支來訓練 SD3.5 的 Lora。

切換分支後,基本上可以不需要重新安裝什麼新的套件,但這一點我無法在此保證,畢竟 Kohya 那邊的更動頻率還算蠻高的,可能隨時都需要對齊分支上面的更新。

訓練設定

由於全程都需要使用 CLI 操作,為了簡化這件事情,所以我有設定檔,你可以直接抄去用。

Startup

為了方便閱讀,所以底下是分行的寫法,如果你是 Windows 的話,請把尾巴的 \ 拿掉,然後全部接成一行來執行(如果是 Powershell 應該是可以直接執行)。

accelerate launch --dynamo_backend eager \
    --dynamo_mode default \
    --mixed_precision bf16 \
    --num_processes 1 \
    --num_machines 1 \
    --num_cpu_threads_per_process 2 \
    ./sd3_train_network.py \
    --config_file ./myLoraConfig.toml \
    --network_train_unet_only

請注意,./myLoraConfig.toml 是設定檔案的放置位置,請先不要照抄。後面會提到這個檔案的內容,你需要修改成你想要的訓練設定。

SD3.5 Large config

如果你要訓練 SD3.5 Large,以下這些內容請儲存成 ./myLoraConfig.toml,然後執行訓練。

# 這是 CLIP-L 的檔案位置。
clip_l = "/data/models/clip/sd3/clip_l_sd35.safetensors"
# 這是 CLIP-G 的檔案位置。
clip_g = "/data/models/clip/sd3/clip_g_sd35.safetensors"
# 這是 T5XXL 的檔案位置。
t5xxl = "/data/models/clip/sd3/t5xxl_fp16.safetensors"
# 這是 SD3.5 Large 的模型檔案位置。
pretrained_model_name_or_path = "/data/models/sd3.5_large.safetensors"
# 放置記錄的路徑。
logging_dir = "/data/logs/lora-train-log"
# 訓練的資料夾。
train_data_dir = "/data/train/dataset"
# 訓練出圖的 Prompt 檔案位置。
sample_prompts = "/data/train/sample/prompt.txt"
# 訓練輸出的資料夾。
output_dir = "/data/output"
# 訓練的 Lora 名稱。
output_name = "my-sd35-large-lora"
# 記錄方式,你可以使用 wandb 或 tensorboard。
log_with = "tensorboard"
# 如果你要用 wandb,請填寫 API KEY。
wandb_api_key = ""
# 如果你要用 wandb,請填寫 RUN NAME。
wandb_run_name = ""
# UNET 學習率,使用 2e-4、1e-4、1e-5、5e-6 皆可。
unet_lr = 2e-4
# TE 學習率,可以使用 UNET 的一半。
text_encoder_lr = [ 5e-5, 5e-5, 5e-5]
# 由於是 SD3.5 Large,如果你的 VRAM 超多,可以加大。
train_batch_size = 1
# 因為 Train batch size 1,所以這邊使用 4,但會放大整體訓練時間。
gradient_accumulation_steps = 4
# 我的習慣是使用最大步數訓練,如果你想使用 Epoch,請把他改 0。
max_train_steps = 4000
# 因為使用最大步數訓練,所以維持 1,若你不是,請設定一個 Epoch,例如 10。
epoch = 1
# 設定多少 Epochs 儲存一次 Lora 結果。
save_every_n_epochs = 1
# 設定多少訓練步數儲存一次 Lora 結果,如果不需要請設定成 0。
save_every_n_steps = 500
# 訓練 Dim,目前尚未針對這兩個數值作更多實驗,所以可以先別動他。
network_dim = 32
# 訓練 Alpha,就使用 Dim 的一半就好。
network_alpha = 16
# 分塊設定,請把數值設定跟 dim 相同
context_attn_dim = 32
context_mlp_dim = 32
x_attn_dim = 32
x_mlp_dim = 32
# 底下如果你不知道你在做什麼,請不要更動。
context_mod_dim = 0
x_mod_dim = 0
apply_t5_attn_mask = true
bucket_no_upscale = true
bucket_reso_steps = 64
cache_latents = true
cache_latents_to_disk = true
cache_text_encoder_outputs = true
cache_text_encoder_outputs_to_disk = true
caption_extension = ".txt"
clip_skip = 0
dynamo_backend = "eager"
enable_bucket = true
fp8_base = true
gradient_checkpointing = true
guidance_scale = 1.0
highvram = true
huber_c = 0.1
huber_schedule = "snr"
ip_noise_gamma = 0.1
ip_noise_gamma_random_strength = true
loss_type = "l2"
lr_scheduler = "cosine"
lr_scheduler_args = []
lr_scheduler_num_cycles = 1
lr_scheduler_power = 1
lr_warmup_steps = 200
max_bucket_reso = 2048
max_data_loader_n_workers = 4
max_grad_norm = 0.01
max_timestep = 1000
max_token_length = 225
min_bucket_reso = 256
mixed_precision = "bf16"
network_args = ["train_t5xxl=False", "emb_dims=[0,0,0,0,0,0]", "train_block_indices=12-24,30-37"]
network_module = "networks.lora_sd3"
noise_offset = 0
noise_offset_type = "Original"
optimizer_args = ["weight_decay=0.01", "betas=0.9,0.999", "eps=0.000001",]
optimizer_type = "AdamW8bit"
persistent_data_loader_workers = 1
prior_loss_weight = 1
resolution = "1024,1024"
sample_sampler = "euler_a"
save_model_as = "safetensors"
save_precision = "fp16"
save_state_on_train_end = true
sdpa = true
seed = 42
log_config = true

SD3.5 Medium config

如果你要訓練 SD3.5 Medium,以下這些內容請儲存成 ./myLoraConfig.toml,然後執行訓練。

# 這是 CLIP-L 的檔案位置。
clip_l = "/data/models/clip/sd3/clip_l_sd35.safetensors"
# 這是 CLIP-G 的檔案位置。
clip_g = "/data/models/clip/sd3/clip_g_sd35.safetensors"
# 這是 T5XXL 的檔案位置。
t5xxl = "/data/models/clip/sd3/t5xxl_fp16.safetensors"
# 這是 SD3.5 Large 的模型檔案位置。
pretrained_model_name_or_path = "/data/models/sd3.5_medium.safetensors"
# 放置記錄的路徑。
logging_dir = "/data/logs/lora-train-log"
# 訓練的資料夾。
train_data_dir = "/data/train/dataset"
# 訓練出圖的 Prompt 檔案位置。
sample_prompts = "/data/train/sample/prompt.txt"
# 訓練輸出的資料夾。
output_dir = "/data/output"
# 訓練的 Lora 名稱。
output_name = "my-sd35-large-lora"
# 記錄方式,你可以使用 wandb 或 tensorboard。
log_with = "tensorboard"
# 如果你要用 wandb,請填寫 API KEY。
wandb_api_key = ""
# 如果你要用 wandb,請填寫 RUN NAME。
wandb_run_name = ""
# UNET 學習率,使用 2e-4、1e-4、1e-5、5e-6 皆可。
unet_lr = 2e-4
# TE 學習率,可以使用 UNET 的一半。
text_encoder_lr = [ 5e-5, 5e-5, 5e-5]
# SD3.5 Medium 比較省 VRAM,所以可以用 4,如果你 VRAM 不夠,請降低他。
train_batch_size = 4
# 因為 Train batch size 4,所以這邊使用 1。
gradient_accumulation_steps = 1
# 我的習慣是使用最大步數訓練,如果你想使用 Epoch,請把他改 0。
max_train_steps = 4000
# 因為使用最大步數訓練,所以維持 1,若你不是,請設定一個 Epoch,例如 10。
epoch = 1
# 設定多少 Epochs 儲存一次 Lora 結果。
save_every_n_epochs = 1
# 設定多少訓練步數儲存一次 Lora 結果,如果不需要請設定成 0。
save_every_n_steps = 500
# 訓練 Dim,目前尚未針對這兩個數值作更多實驗,所以可以先別動他。
network_dim = 32
# 訓練 Alpha,就使用 Dim 的一半就好。
network_alpha = 16
# 分塊設定,請把數值設定跟 dim 相同
context_attn_dim = 32
context_mlp_dim = 32
x_attn_dim = 32
x_mlp_dim = 32
# 底下如果你不知道你在做什麼,請不要更動。
context_mod_dim = 0
x_mod_dim = 0
apply_t5_attn_mask = true
bucket_no_upscale = true
bucket_reso_steps = 64
cache_latents = true
cache_latents_to_disk = true
cache_text_encoder_outputs = true
cache_text_encoder_outputs_to_disk = true
caption_extension = ".txt"
clip_skip = 0
dynamo_backend = "eager"
enable_bucket = true
fp8_base = true
gradient_checkpointing = true
guidance_scale = 1.0
highvram = true
huber_c = 0.1
huber_schedule = "snr"
ip_noise_gamma = 0.1
ip_noise_gamma_random_strength = true
loss_type = "l2"
lr_scheduler = "cosine"
lr_scheduler_args = []
lr_scheduler_num_cycles = 1
lr_scheduler_power = 1
lr_warmup_steps = 200
max_bucket_reso = 2048
max_data_loader_n_workers = 4
max_grad_norm = 0.01
max_timestep = 1000
max_token_length = 225
min_bucket_reso = 256
mixed_precision = "bf16"
network_args = ["train_t5xxl=False","emb_dims=[0,0,0,0,0,0]", "train_block_indices=3-22"]
network_module = "networks.lora_sd3"
noise_offset = 0
noise_offset_type = "Original"
optimizer_args = ["weight_decay=0.01", "betas=0.9,0.999", "eps=0.000001",]
optimizer_type = "AdamW8bit"
persistent_data_loader_workers = 1
prior_loss_weight = 1
resolution = "1024,1024"
sample_sampler = "euler_a"
save_model_as = "safetensors"
save_precision = "fp16"
save_state_on_train_end = true
sdpa = true
seed = 42
log_config = true

訓練結果

SD3.5 Large 與 Medium 兩個在訓練結果上,我個人覺得最主要的差異在於「素材表現」上。

底下這張是 SD3.5 Medium Lora 的出圖結果。

SD3.5 Medium with Lora

而底下這張是所有出圖設定皆相同,但使用 SD3.5 Large 與 Lora 的出圖結果。

SD3.5 Large with Lora

整體表現上來說 Medium 在細節上比 Large 略多一些,但相對的 Medium 的肢體表現就沒有 Large 那麼好,不過這一點應該可以慢慢做修正。


小結

上面的東西如果跑壞了或不能跑,我其實也不知道該怎麼辦(笑)。

Hina Chen
偏執與強迫症的患者,算不上是無可救藥,只是我已經遇上我的良醫了。
Taipei