VRAM 8GBでもXLのLoRAが作りたい
皆さんANIMAGINE XL 3.0は触りましたか?
従来のXL系モデルは特に二次イラストについて(NAI v3を除いて)promptの指示を結構な割合で無視してくる感じでしたが、ANIMAGINE XL 3.0はpromptの効きが良いどころか、1.x系では表現できなかったpromptがバシバシ出てとても面白いです。
個人的にはviewfinderがしっかり出てくれるのが好きです(1.xでLoRA作ろうとして挫折していた為)
ただ悲しいことにボクのグラボ(3070)はVRAMが8GBしかないので、XLのLoRAが作れない(1024サイズの学習なんて無理ィ!)環境です。
ところが、今回512サイズで作ってみた所、なんか普通に良い感じになったので、学習設定の話などを簡単にしておこうと思います。
今回作ったもの
作成のノウハウが固まっているスライダーLoRAを作成する。
スライダーLoRA、並びに、コピー機学習については過去の記事を参照。
成果物は以下のようなもの。
XLのLoRA作成で問題だった点
問題は大きく分けて2つ(+1)
要求スペックが高い
コピー機が上手く作れない
(安定したモデルが存在しなかったのでLoRAの効果検証が困難)
要求スペックはもうどうしようもないのでサイズを落とした。
1024サイズだとOOMになるだけで、512サイズなら学習は可能。
小さなサイズでの学習がどのような悪影響を及ぼすのか、ベースモデルによって通用しない可能性があるか等、不透明な点はある。
ANIMAGINEは512サイズの学習も行っているそうなので、そのお陰で許された可能性はある。
コピー機が上手く作れないのは設定の問題だったと思われる(いつものフワッとした理解)
XLはUnetの構造が変化しており、以前の学習においてConv層の学習を無効にしていたことが原因と思われる(風説の流布)
3つ目は学習の問題ではないのだが、効果確認を目視でする以上は結構困っていた。
なお、困っていたのは9月時点の話で、少なくとも今はANIMAGINEを使えば問題無し。
具体的なパラメータの変更点
学習時の実際のパラメータを全部記載しておく。
パスさえ書き換えれば多分このまま実行できるんじゃないですかね?(普段GUIに頼っているので知らんけど)
accelerate launch
--num_cpu_threads_per_process 4 sdxl_train_network.py
--pretrained_model_name_or_path "F:\hoge\animagine-xl-3.0.safetensors"
--train_data_dir "F:\fuga"
--output_dir "F:\piyo"
--network_module "networks.lora"
--network_dim 4
--network_alpha 1
--network_args "conv_dim=4" "conv_alpha=1"
--xformers
--gradient_checkpointing
--persistent_data_loader_workers
--cache_latents
--cache_latents_to_disk
--max_data_loader_n_workers 1
--enable_bucket
--save_model_as "safetensors"
--lr_scheduler_num_cycles 4
--mixed_precision "fp16"
--learning_rate 0.0001
--resolution 512
--train_batch_size 2
--max_train_epochs 5
--optimizer_type "AdamW"
--lr_warmup_steps 250
--output_name "base"
--bucket_no_upscale
--save_precision "fp16"
--lr_scheduler "cosine_with_restarts"
--min_bucket_reso 320
--max_bucket_reso 960
--caption_extension ".txt"
--seed 42
--network_train_unet_only
--noise_offset 0.1
--multires_noise_discount 0.3
--no_half_vae
--cache_text_encoder_outputs
--cache_text_encoder_outputs_to_disk
1.xとの重要な差異のみ下記に記載する。
変更: train_network.py → sdxl_train_network.py
そりゃそう
追加: --network_args "conv_dim=4" "conv_alpha=1"
conv層の学習、いわゆるLierLa→C3Lier
変更: learning_rate 1e-3 → 1e-4
1.xでは時短のために1e-3でstep少なめにしていたが、XLだと発散した
なお、自分の経験上そうだったというだけで、明確な根拠は無いため、これが正解というわけではない。
むしろ正解があるなら教えて欲しい。
おまけ:XLのLoRAサイズデカすぎ問題
XLのLoRAはサイズがデカい。
例えば、頭身スライダーは差分抽出直後は126MBあった(1.x版は2MB程度)
このままだと自分で使うにも難儀するので、resize_lora.pyでRank(dim)を下げてみた。
もちろんディティールが重要なキャラクターLoRAでは話が変わってくると思うが、頭や胸のサイズ調整のようにディティールが不要な場合はresizeすることが望ましい。
なお、resizeにあたっては下記の記事を大いに参考にさせて頂きました、とても感謝。
おわりに
本当に作りたいのはスライダーLoRAではなく、脳内キャラのLoRAなのですが、今回の検証で1.xと同様に差分抽出による不要な影響の排除が可能とわかりました。
本当はnote記事とか書いてる場合じゃないです、学習回します。おわり。