ずんだもんLoRA学習チャレンジ

https://zunko.jp/con_illust.html  から、01_LoRA学習用データ_A氏提供版_背景白 の ずんだもんの画像12枚をダウンロード。キャプション等も変えずそのまま12枚で実施しました。
元モデルは sd_xl_base_1.0_0.9vae.safetensors 

フォルダ構成
train
L  13_zundamon
  L (ずんだもんの画像12枚+キャプションファイル 12ファイル)

override steps. steps for 22 epochs is / 指定エポックまでのステップ数: 352
running training / 学習開始
num train images * repeats / 学習画像の数×繰り返し回数: 156
num reg images / 正則化画像の数: 0
num batches per epoch / 1epochのバッチ数: 16
num epochs / epoch数: 22
batch size per device / バッチサイズ: 12
gradient accumulation steps / 勾配を合計するステップ数 = 1
total optimization steps / 学習ステップ数: 352

352 steps x 12(バッチサイズ)  = 4224 steps(バッチ1相当)
352 steps x 156(学習画像の数×繰り返し回数) = 54,912 ? ← この数値に意味があるのかは不明です…
12枚画像を13回繰り返しで156枚相当に水増ししているのはあまり step数が大きくなるとグラフ化した際に傾向が見えにくくなる為という個人的な好みです。 

RedRayz さんの Kohya_lora_param_gui を使ってGUIでパラメータを埋めてゆき、「コマンドの生成とコピー」ボタンでコマンドを出力。それに polynomial のパラメータの --lr_warmup_steps 1 --lr_scheduler_power <power値> を追加して kohya-ss さんの sd-scripts のコマンドを作成します。

2024/4/12追記:RedRayz さんが lr_scheduler_power の入力が Kohya_lora_param_gui から可能なように機能追加してくださいました! ありがとうございます!

triton が使えると早いと思って WSL で実行(実際はそんなに変わらなかった)。パスをWSLのルールに置換します。
パラメータ変えたときに 出来上がる LoRA のファイル名がわかりやすいようにパラメーター値をLoRAの値を含むようにちょっとだけ設定値を外出しして以下のコマンドを生成。

export learning_rate=0.0015
export lr_scheduler_power=3
export lora_name=zundamon
export lora_version=v01
mkdir /mnt/c/workspaces_c/kohya_lora_gui/tensorboard_log/10_${lora_name}/${lora_version}

accelerate launch --num_cpu_threads_per_process 2 sdxl_train_network.py --pretrained_model_name_or_path "/mnt/c/workspaces_c/stablediffusion_data/models/checkpoints/sd_xl_base_1.0_0.9vae.safetensors" --train_data_dir "/mnt/c/workspaces_c/kohya_lora_gui/${lora_name}/train" --output_dir "/mnt/c/workspaces_c/kohya_lora_gui/output/${lora_name}" --network_module "networks.lora" --xformers --gradient_checkpointing --persistent_data_loader_workers --cache_latents --cache_latents_to_disk --max_data_loader_n_workers 2 --enable_bucket --save_model_as "safetensors" --lr_scheduler_num_cycles 4 --mixed_precision "bf16" --learning_rate ${learning_rate} --resolution 1024 --train_batch_size 12 --max_train_epochs 22 --network_dim 16 --network_alpha 8 --shuffle_caption --save_every_n_epochs 1 --optimizer_type "Lion" --output_name "SDXL_${lora_name}_LoRA_${lora_version}_lion_${learning_rate}_polynomial_power${lr_scheduler_power}.safetensors" --save_precision "fp16" --lr_scheduler "polynomial" --lr_warmup_steps 1 --lr_scheduler_power ${lr_scheduler_power} --min_bucket_reso 512 --max_bucket_reso 2048 --caption_extension ".txt" --seed 42 --logging_dir "/mnt/c/workspaces_c/kohya_lora_gui/tensorboard_log/10_${lora_name}/${lora_version}"

22epoch 回しましたが 20 epoch 目が最小 avr_loss になりました。
epoch 20/22
steps: 91%|████████████████████████████████████████████████████████████████████▏ | 320/352 [18:57<01:53, 3.56s/it, avr_loss=0.0155]saving checkpoint: /mnt/c/workspaces_c/kohya_lora_gui/output/zundamon/SDXL_zundamon_LoRA_v01_lion_0.0015_polynomial_power3.safetensors-000020.safetensors

TensorBoard 出力 初回にしてはまずまず?というかいきなり適正値?

学習結果からいくつか かいつまんで出力テスト
Prompt は
zundamon, in the beach, masterpiece
Negative Prompt は なし
過学習度合いを見るためにわざとずんだもんと関係なさそうな beach を入れて背景がどうなるのかも見てみました。

LoRAなし(epoch 4 LoRA強度0)は流石に ずんだもん の影も形もないので元のモデルには存在しないということがわかります。
epoch 4 : 絵柄はA氏の絵柄になってきた。頭のさやが帽子になっちゃう… 背景が beach なのはここまで。
epoch 8-12: もうbeach が消えてしまいました。 LoRA強い。epoch8 だとまだ頭のさや(?)がたくさん出たりちょっと不安定

zundamon, in the beach, masterpiece
LoRA なし epoch4、8、10、12

epoch 14: ずんだもんのキャラとしてはこのあたりが良さそうですね。背景がぼんやり塗りつぶされてしまうのは今回の学習元データがすべて白背景なので起こると思われます。他のランダムな背景も混ぜて学習するか、キャラの再現性を捨てて epoch 4 あたりで留めるなどを選択する必要がありそうです。
epoch 17: ずんだもんの顔に模様が…
epoch 20: loss 値最小の個人的な期待の星。17、21のように顔に模様はでていませんがこれと言って良い要素もなく、あえてこれを選択する理由は loss値以外にはなさそう…
epoch 21: ずんだもんの顔に模様+背景の木までずんだもん化がすすんでいます。

zundamon, in the beach, masterpiece
epoch14、17、20、21

今回の学習では epoch 14 = 16 x 14 x 12 = 2,588 step(batch 1相当)あたりがいい感じになりました。


追伸:
その後も何回かパラメータをちょこちょこ変えてやってみたのですが、初回を超えることはできずでした。

5回トライアルしてみたけど…初回(緑)が一番良かったという結果に

皆様のLoRA作成に少しでも参考になれば幸いです。
ありがとうございました。

suito-venus/zundamon_sdxl_lora
背景は過学習により変わりません…

kohya-ss / sd-scripts

RedRayz / Kohya_lora_param_gui

ツールを作ってくださる方に感謝!

この記事が気に入ったらサポートをしてみませんか?