見出し画像

SDXLでLora学習をしてみる→FP8使用で必要VRAMが劇的に減少!

 急にSDXLブームがきましたね。
 とりあえず波に飛び乗ってみました。

 SDXL、出力クオリティ高すぎマジヤバいw

 SD1.5だとLORA使っても難しかった小物や構図の出力が、プロンプトだけでモリモリ出力できます。

 プロンプトだけで当分お腹いっぱいになれそうですが、過去に使った学習素材や設定がまるまる残っているので、ついでにLORA学習もしてみました。

 というわけで、ここ数日で得た「SDXLでのLORA学習」知見について、ノート代わりにまとめてみます。


1:前準備

 SDXLでのLORA学習の基本的なやり方は、すでに丁寧な解説サイトがあるので、そちらをどうぞ。

 学習用イラストやタグTXTは1.5時代のものをそのまま使用したところ、問題なく望んだ学習ができました。
 詰めていくと解像度をちゃんとアップスケールしたり画像クオリティの選別をしたりといった作業が必要になりそうですが、とりあえずは「今までと同じ」で大丈夫。

 過去資産がある人は素材流用で手間を大幅に削減できるので、経験者にとっては、SDXL版のLora作成は敷居が低いと言えそうです。

 あと、従来のSD-SCRIPTがある場合、ある程度バージョンアップしてあれば、そのままSDXL学習に使えます。
 ただし、僕の場合はSDXL学習時にエラーが出たため、新規にインストールしなおしました。

 下記の「FP8」を使用する場合、PytorchやXformersを新しいもの変える必要もあるため、もしバージョンアップでトラブルが発生した場合は、さっさと最新版を新規インストールした方が早いと思います。

2:メモリ対策として「FP8」で学習する。

 SDXLでの学習は「VRAM消費量が大幅に上昇する」のと「時間がかかる」のが特徴です。

 とくにVRAM消費量が深刻で、ウチの3060-VRAM12GBの場合、デフォルト設定だとメモリが本当にギリギリで、メモリ不足でエラーが出ることも珍しくありません。

 バッチ数を下げたり、キャッシュをディスクに出力したり、オプティマイザーを低VRAM型に変えたりと、対応策はいろいろあるのですが、一番楽で確実なのは「FP8で計算する」です。
 これでメモリ消費量が劇的に下がるので、メモリ対策で他の設定を弄る必要がなくなりました。

 FP8を使うにはPytorchの2.1以上が必要です。
 それに合わせてXformersのバージョンアップも必要です。
 SD-SCRIPTのデフォルトインストール設定だとTorchは2.0.1なので、各自での対応が必須です。

 Pytorch2.1のインストールコマンドはこちら。


pip install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 --index-url https://download.pytorch.org/whl/cu118
pip install --upgrade -r requirements.txt
pip install xformers==0.0.22.post7 --index-url https://download.pytorch.org/whl/cu118 


 FP8に対応したら、あとはSD-SCRIPTのパラメータに「-fp8_base」を追加すればOKです。

 FP8にしてからは「総STEP2000程度をバッチ4で学習して1時間~2時間程度」で安定して学習できています。
 FP8にするとFP16よりもクオリティが下がる可能性もありますが(ネット上では「ほぼ同じ」「多少下がるが許容レベル」といった報告があるものの、大幅なクオリティ低下という情報は見つかりませんでした)、それ以上に「メモリ問題が解決することで他の設定の自由度が大幅に上がる」というメリット・利便性向上が大きすぎます。

 もちろんFP16で動くならそれに越したことはありませんが、メモリ不足の壁で悩んでいる方にはFP8学習を強くおすすめします

3:学習パラメータ

 FP8にしてメモリに余裕ができたため、他の学習パラメータは基本的にSD1.5と同じ感覚で使えています。

---------------------------------------------------------------------------------
2024/4/40 追記
最近はテキストエンコーダも学習するのが一般的になっているようです。
個人的には未確認ですが、有志の検証や体感では「テキストエンコーダも学習した方が再現率が高い」とも言われています。
ためしにテキストエンコーダ学習もやってみて、問題なければそのままでよいかと。
後述している「時間がかかった」は、TE学習の有無だけではなくオプティマイザやアルゴリズムの組み合わせによる影響も大きいようです。
---------------------------------------------------------------------------------

今までと変わるところは、

  • SDXLの仕様の都合でテキストエンコーダの学習が難しいので、UNETオンリーで学習「-network_train_unet_only」。

  • clip skip設定が不要になったので「--clip_skip=2」を削除。

  • メモリ対策でTEをキャッシュする「--cache_text_encoder_outputs」。※TE学習しないのにキャッシュ削除させる意味がよく分からないけど、公式推薦だったので採用。

  • 「--gradient_checkpointing」(メモリ使用量減少・学習速度は低下)、「--no_half_vae」(学習エラー対策)

  • オプティマイザーは公式だとAdamとかAdaFactor推薦だけど、FP8にしてれば他のオプティマイザーでも問題なくいけた。

  • Lycoris x LoHaの組み合わせもOKでした。

 あと、テキストエンコーダ学習も試したのですが、ウチの環境では「まともに学習しない」「時間がすさまじくかかる」ことから、TE学習は諦めました。
 画風LORAと構図LORAの両方を試しましたが、UNETオンリーでも問題なく動作しています。
※構図LORAの方はTE学習もできたほうが良さそうな雰囲気はありますが…

4:ベースモデル

 SDXLとSD1.5でのLORA学習の最大の違いは「LoRAの対応モデルがほぼ一つに固定される」ことです。
 Animagineで使うLORAなら学習時のベースモデルをAnimagineに、PonyであればPonyを指定しないと、学習効果がかなり薄まります。
 これは派生モデルでの使用でも同じで、PonyをベースにしたLoRAは、Ponyのマージモデルで使うと効果の減衰が見られました。

 

 以下、最近使っている「画風LoRA」のパラメータ設定と簡単な注釈・解説を有料部分で公開します。
 特別なことはしていないので、「他人のパラメータを参考にしたい」方向けの情報となります。

ここから先は

3,601字

¥ 200

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