2024年5月7日火曜日

SDXLのLoRAの学習時間、Epoch数について

以前書いた低VRAMでのSDXLのLoRAの学習についていろいろ試行錯誤しています。アニメ系のLoRAは数エポックで割と使えるレベルになりますが、最近、日本人のアイドル系の顔を出せるようにリアル系のLoRAにチャレンジしてみているのですがなかなか難しい。

今回は、リアル系LoRAの学習にはどれくらいの学習が必要なのか調べてみました。

まずこれ以降の話の前提となる、学習回数に関係しそうなパラメータ等は以下の通りです。オプティマイザはadafactorなので学習率(learning_rate)は初期値扱いです。

network_dim=16
network_alpha=2
sampler="ddim" (default)
learning_rate=5e-5
optimizer_type="adafactor"
fp8_baseオプションを利用

fp8_baseオプションについては、以前の記事を参考にしてください。8GBのVRAMでも高速なLoRA学習を実現してくれる重要な機能です。

学習に使ったベースモデルは以下2種類
leosamsHelloworldXL_helloworldXL60.safetensors
sdxl10ArienmixxlAsian_v45Pruned.safetensors

学習の画像の枚数は147枚、画像ごとの繰り返し回数は5回です。キャプション付与はWD14でSmilingWolf/wd-convnext-tagger-v3モデルを使っています。(リアル系には少し弱いかも)

一枚の画像当たり200回の学習が目安か

まず、leosamsHelloworldXL_helloworldXL60に対しての学習。resume機能を使ったためグラフが切れていてすみませんが、濃い青->水色->ピンク->橙色とステップが進んでいて、合計52エポックまで学習しています。

Epochごとのプロットをみると、lossが平均的に下がっていることがわかります。
学習率(lr:learning-rate)の方について、textencoderの方はおおよそ40エポックあたりで学習率が上昇しなくなり平坦に、u-net側も52epochになるころには平坦になりかけというところでしょうか。

1エポックあたり、各画像を5回繰り返し学習しているので、一枚の画像あたり52x5=260回学習していることになります。

もう一つの例。sdxl10ArienmixxlAsian_v45Prunedに対するほぼ同じ学習データ(少しだけデータを増やしました)を与えた場合のグラフです。こちらも紫ー>緑ー>橙ー>濃い青ー>水色と学習が進んでいます。トータルで51エポックです。



こちらも、おおよそ40エポックごろにtextencoder/unet両方の学習率の上昇が殆どなくなっているように見えます。つまり画像あたり、40エポックx5回繰り返し = 200回の学習がされたころに学習率が収まっているように見えます。

147枚x5回繰り返し/(batch=3)で、1エポックあたり245ステップ。ステップ数は一ステップあたり6から7秒。なので、だいたい、1エポックあたり25分程度。約40エポック以上ということで、大体17時間以上が学習に必要な時間でした。

エポックを通じた画質の変化

さて、実際の結果です。上の各線の終端ごとのLoRAで描かせた結果です。
まずleosamsHelloworldXL_helloworldXL60の方から。
上の方が,LoRAの学習が一番進んだもの、一番下がLoRA未適用です。
下から2枚目3枚目では、色合いがおかしいですが、学習が進むと色合いも落ち着いてきます。色合いの落ち着きがLoRAの学習進度の参考になるかと思います。

次は、sdxl10ArienmixxlAsian_v45Pruned のほうです。

こちらは,27エポックぐらいまで色彩が飛ぶ感じですね。そこから落ち着きが出る感じです。

顔の形状などは早期から学習が進んでいるように見えますが、細かいディテール、質感、色彩などの落ち着きに時間がかかる印象です。

さてさて、学習が進んだLoRAですが、上記の最後の出力を見ても、少し荒れが見られたりしてあまり使える気がしませんね・・・。学習データが良くないのかもと思いつつ、次回は、少し過学習なLoRAでも、オリジナリティのある出力が出せるんですといったところを。

(あれ、今回は英語がない・・・)





0 件のコメント:

コメントを投稿