最近出た画像生成AIモデル、animaのLoRA学習をやってみたので設定まわりのメモを書いておきます。設定ファイルの中身と、実際に試してわかったことをざっくりまとめます。
学習設定ファイル
今回使った設定ファイル(UMBNE_07_training.toml)の内容です。パス情報は除いています。
pretrained_model_name_or_path = "anima-base-v1.0.safetensors"
qwen3 = "qwen_3_06b_base.safetensors"
vae = "qwen_image_vae.safetensors"
network_module = "networks.lora_anima"
network_dim = 32
network_alpha = 16
network_train_unet_only = true
gradient_checkpointing = true
learning_rate = 1.0
optimizer_type = "Prodigy"
optimizer_args = [ "decouple=True", "weight_decay=0.1", "d_coef=1.0", "use_bias_correction=True", "safeguard_warmup=True", "betas=0.9,0.99",]
lr_scheduler = "constant"
max_train_steps = 2000
train_batch_size = 4
gradient_accumulation_steps = 1
mixed_precision = "bf16"
save_every_n_steps = 200
sample_every_n_steps = 200
sample_sampler = "euler"
timestep_sampling = "logit_normal"
discrete_flow_shift = 3.0
weighting_scheme = "logit_normal"
cache_latents = true
cache_latents_to_disk = true
cache_text_encoder_outputs = true
cache_text_encoder_outputs_to_disk = true
attn_mode = "sdpa"
save_model_as = "safetensors"
save_precision = "bf16"
max_data_loader_n_workers = 4
vae_chunk_size = 32
vae_disable_cache = true
seed = 42
オプティマイザはProdigy、network_dim = 32 / network_alpha = 16、バッチサイズ4、2000ステップという構成です。save_every_n_steps = 200 にしてこまめに出力を確認できるようにしています。
オプティマイザ:Prodigyについて
今のところProdigyが一番いいと思っています。学習率を自動調整してくれるので、learning_rate = 1.0 を起点にあとはお任せという感じで使えます。
ただ、Prodigyは「じわじわ変わる」というより「ある瞬間に一気に変わる」挙動をすることがあります。「気づいたら過学習してた」という事態を避けるために、save_every_n_steps と sample_every_n_steps は細かめに設定して出力をこまめに確認するのがいいです。
キャプションの設定
タグの規則性とLoRAの学習
キャプションのタグ並びに規則性があると、LoRAがそのセットごと覚えてしまいます。たとえば全画像のキャプションが art_style, 1girl, monochrome という固定順序になっていると、この3つをワンセットとして学習してしまう。結果として、その並びから外れたプロンプトを使うと似なくなります。
「じゃあシャッフルすればいいか」というと、それはそれで問題があります。
シャッフルより固定キャプションが良いケース
キャプションシャッフルをオンにすると、タグの順序はランダムになりますが、今度は特徴が削がれて似なくなる場合があります。「規則性があるのも困る、シャッフルも困る」という状況です。
この場合に有効なのが、規則性のない固定キャプションです。画像ごとにタグの並びがバラバラな固定キャプションを用意することで、セット学習を防ぎつつシャッフルの弊害も避けられます。自作のキャプションソフトをこの用途に対応させました。
※追記
LoRAの柔軟性を持たせるにはキャプションはシャッフルをした方が良さそうでした。上記の手段は手っ取り早く作りたい時の手段で、ちゃんと作りたい時はシャッフルをオンにしてsteps数を20%ぐらい多めにして様子をみたほうが良さそうです。
あと、キャラが複数人の場合はコピーでも良いので各キャラ枚数を揃えて、キャラクターのタグを一番前にした方が良さそうでした。当然ながら偏ると結果も偏ります。
ANIMAはオリジナルをそっくりそのまま覚えるクセがあるので、データセットが悪い場合は耐劣データセット性があるillustrious系のモデルでLoRAを作って出力させてそれをデータセットに混ぜるといい感じがします。ANIMAは線が解像度にあわせて細くなるような事があまり感じられないですね。
学習ステップ数の目安
オリジナル画風を覚えさせる場合
モデルが全く知らないオリジナル画風を覚えさせるには、batch4×3000=12000ステップ程度が妥当に思います。ただ、「どこまで忠実に再現したいか」によってかなり変わります。本当にオリジナルに近い出力を求めるなら、もっと回す必要があるかもしれません。
モデルが既知のキャラクター+画風のデータセットの場合
データセットがモデルの学習済みデータと重なっている場合(モデルが既に知っているキャラクター+画風の組み合わせなど)、画風を覚えるのがかなり速いです。800ステップ程度でも覚えることがあります。
おそらく「新しく覚えるものが少ない」からだと思います。ベースモデルが既に持っている知識を引き出す方向に働くので、少ないステップで収束しやすい。とはいえ安定させるためにbatch4×2000程度は回しています。
バッチサイズと解像度の話
バッチサイズの一般論と実感
一般論としては「バッチサイズが小さいと特定の画風に似やすく、大きいと汎用性が上がる」と言われています。ただ自分でやってみた感じでは、そこまで明確な差はわかりません。
むしろ気になるのは、バッチが大きいと変化が急すぎてピーキーになることです。「ちょうどいいステップ数」の幅が狭くなる感じがあります。
メモリとグラボ処理能力の限界
「メモリに余裕があるならバッチを上げれば速くなる」と思いがちですが、メモリギリギリまでバッチを上げても高速化しないことがあります。これはメモリが足りないのではなく、GPUの処理能力の限界を超えているせいです。
同じ理由で、解像度を上げても品質にはあまり関係がないので、GPUが限界動作しない程度に解像度を落とすのが現実的です。無理に高解像度で回してもスループットが落ちるだけです。
低解像度ソースの扱い
低解像度の素材は低解像度のまま学習します。アップスケーリングはどの段階でも絶対にさせません。アップスケーラーが補完した情報をLoRAが覚えてしまうと、本来の画風とズレた特徴を学習することになります。
複数データセットの干渉を利用する
体のラインが一切ないキャラクターデータセットAに、別の体のラインBを覚えさせたいケースがありました。この場合、独立したトリガーワードを付けて干渉させる方法が一番うまくいきました。
トリガーAとトリガーBでそれぞれキャプションすると、それぞれ独立した絵柄として覚えていきます。ただ、たとえばトリガーBで学習した breasts の形状はトリガーAでも反映されます。これを狙いにいく形です。
とはいえ絵柄が多少混ざることがあるので、調整が難しいところです。Bのデータ量をAより少なめに設定することで干渉の度合いをコントロールしています。
まとめ
- オプティマイザ:Prodigyが今のところ安定。ただし変化が急なのでこまめに出力確認
- キャプション:タグの規則性もシャッフルも一長一短。規則性のない固定キャプションが有効なケースがある
- ステップ数:オリジナル画風はbatch4×3000程度。既知キャラ+画風なら800でも覚える
- バッチサイズ:大きくしすぎるとピーキー。メモリではなくGPU処理能力が律速になることがある
- 解像度:高解像度にしても品質への寄与は小さい。低解像度ソースはそのまま学習
- 複数データセット:トリガーワードを分けて干渉させると、別データセットの特徴を意図的に引き込める

コメント