オリジナルキャラクターLoRAの作り方【SDXL学習編】SDXLのキャラクター学習

前回の記事にてSD1.5モデルの学習を解説しました。今回はSDXLのLoRA学習方法を解説します。SDXLのLoRA学習はSD1.5と比べると、より多くのVRAMが必要となります。学習時間も多くなりますので、お使いのPCのスペックが低い方はColabやGPUクラウドのRunPod等を使って学習することをおススメします。Kohya ss GUIのインストールや、データセットの作り方が分からない方は、まずは下記の記事を読んでみましょう。
また、LoRA学習がはじめての方は学習が早く終わるSD1.5モデルから為すことをおススメします。


SDXLの学習ベースモデルの互換性について
SDXLのLoRAは、SD1.5と比べて汎用性が低くなっています。学習ベースモデルの系統によってLoRAが対応できるチェックポイントモデルが限られます。生成時、同系統内のLoRA適用は問題なく使えますが、系統外のチェックポイントモデルに適用した場合は上手くLoRAを適用することができません。SDXLイラストベースモデルの系統で代表的なのが下記の様になっています。
- SDXL-base-1.0系:SDXLの基本モデル。イラスト生成にはあまり向いていないモデルです。
- animagineXL V3系:PDXL(PonyV6)の登場まで人気だったイラストAIモデル。※V3で学習したLoRAはV4では使えません。
- ponyDiffusionV6XL系:登場してから瞬く間に一斉風靡した人気モデル。ただし、NSFW画像が良く生成されるのでネガティブプロンプトで調整する必要があります。
- illustriousXL01系:kohaku-xl-beta5がベースモデルに使われているモデル。執筆時ではもっとも活気のあるモデルで高品質なイラストを生成します。コチラもanimagineXLと同じくバージョン違いの互換性はあまりよくありません。
- NoobAI-XL系:Illustrious-xl-early-release-v0がベースモデルに使われているのでillustriousXL系に属するかもしれませんが、コチラもイラストAIモデルでは人気のモデルです。
SDXLのLoRA学習では、LoRAをどの系統のモデルで学習させるのかを決定することが大切です。
互換性のテスト生成
互換性の有無が分かりやすいように、各モデルで生成した比較画像を見ていきましょう。比較対象のLoRAは、(SDXL-base-1.0VAEFix / animagineXLV31_v31 / ponyDiffusionV6XL_v6StartWithThisOne / illustriousXL_v01 / noobaiXLNAIXL_epsilonPred 1.1-Version)を学習モデルに指定して、デフォルトのパラメーターで学習しています。
学習パラメーター学習画像数:100
Repeats:5
Train batch size:1
Epoch:1
Max train steps:1600
Seed:123
LR Scheduler:cosine
Optimizer:AdamW8bit
Learning rate:0.0001 (1e-4)
Unet learning rate:0.0001 (1e-4)
Text Encoder learning rate:0.00005 (5e-5)
Network Rank (Dimension):8
Network Alpha:1
clip_skip:0 ※SDXLではClip skipが無効化される為
dcai-girl, 1girl, looking at viewer, solo, short hair, orange hair, brown eyes, animal ears, dress, masterpiece, meadow, sky, day <lora:DCAI_Girl_SDXL_Def_sdxl-base:1>
worst quality, low quality, bad anatomy, realistic, lips, inaccurate limb, extra digit, fewer digits, six fingers, monochrome, nsfw
Steps: 20
Sampler: DPM++ SDE
Schedule type: Karras
CFG scale: 6
Seed: 3156195032
Size: 1024x1024
VAE: sdxl.vae.safetensors
最初の比較画像は「SDXL-base-1.0」を使って生成しています。一番右はLoRA適応前の生成結果になります。

続いて「animagineXLV31_v31」を使った比較画像になります。

「ponyDiffusionV6XL_v6StartWithThisOne」を使った比較画像になります。※生成にはPonyDiffusionV6XL特有の品質修飾「score_9, score_8_up, score_7_up」とネガティブプロンプトに「score_6, score_5, score_4」を追加しています。

「illustriousXL_v01」を使った比較画像になります。

「noobaiXLNAIXL_epsilonPred 1.1-Version」を使った比較画像になります。※メインのモデルは「NOOBAI XL-VPred 1.0」ですが、V-predictionがA1111WebUIでは開発バージョンでしか使えません。今回はEpsilon-predictionバージョンを使っています。

以上の比較画像からSDXLのLoRAは互換性がない事がわかりました。
Kohya ss GUIのデフォルト値を使った学習
SDXLの互換性について理解したところで、「animagineXLV31_v30Base」をつかって学習してみましょう。このモデルでLoRAを学習すればanimagineXL V3系のチェックポイントモデルに使う事ができます。注意点としてはanimagineXL V3系のLoRAはanimagineXL V4系に使う事が出来ないことです。先ほどの比較画像でAnimagine XL 4.0 Optで生成した画像を見比べてみましょう。


データセット
まずは、パラメーターをデフォルトで学習してみましょう。データセットは「オリジナルキャラクターLoRAの作り方【データセット編】学習画像の制作とキャプション」で作成したデータを元に学習します。同じデータセットで学習させたい場合は、Patreonで公開していますが、有料サポーター様のみダウンロードが可能となっています。

デフォルトパラメーター
データセットの準備ができたら、まずはデフォルト値をつかって学習します。SDXLモデルのイラスト学習用に、少しだけ値を変更しました。入力または変更が必要な部分は赤文字で記載しています。
- Pretrained model name or path:animagineXLV31_v30Base.safetensors
- Trained Model output name:DCAI_Girl_SDXL_Def_anima3 ※モデルの出力名
- Instance prompt:dcai-girl ※今回使うキャプション方式では値は無視されますが、入力しないとエラーになるため。
- Class prompt:1girl ※上記と同じ理由で入力。
- Repeats:5 [デフォルト:40] ※学習元画像が100枚で、トータル画像を500にしたいため。
- Presets:none
- LoRA type:Standard
- Train batch size:1
- Epoch:1
- Max train epoch:0
- Max train steps:1600
- Save every N epochs:1
- Seed:123 [デフォルト:0 = ランダム] ※パラメーターをコントロールする為に適当な数字を入れます。
- LR Scheduler:cosine
- Optimizer:AdamW8bit
- Learning rate:0.0001 (1e-4)
- Text Encoder learning rate:0.00005 (5e-5) [デフォルト:0.0001 (1e-4)] ※公式ドキュメントの推奨デフォルト値に変更しています。
- Unet learning rate:0.0001 (1e-4)
- LR warmup (% of total steps):10
- Network Rank (Dimension):8
- Network Alpha:1
- clip_skip:0 [デフォルト:1] ※SDXLではClip skipが無効化される為
学習したLoRAを使ったテスト生成
学習されたLoRAを、A1111 WebUIを使って生成した結果、下図の様になりました。生成には「animagineXLV31_v31」を使用しています。下はLoRA適用前の画像になります。


再現度が高いですが、Seedガチャの当たりの様なもので、他のSeedでは不安定な生成になっていました。生成パラメーターは、先ほどの比較画像とほとんど変わりませんが、AnimagineV3.1用に少しだけプロンプトを変更しています。
Prompt:dcai-girl, 1girl, looking at viewer, solo, short hair, orange hair, brown eyes, animal ears, dress, meadow, sky, day, newest, masterpiece, best quality, very aesthetic, absurdres <lora:DCAI_Girl_SDXL_Def_anima3:1>
worst quality, low quality, bad anatomy, realistic, lips, inaccurate limb, extra digit, fewer digits, six fingers, monochrome, nsfw
Steps: 30
Sampler: DPM++ SDE
Schedule type: Karras
CFG scale: 6
Seed: 3156195032
Size: 1344x768
VAE: sdxl.vae.safetensors
Hires.fix: True
ADetailer: True
今回の学習で使用するパラメーター
今回はSDXLの学習なので比較的に軽量に動くように設定していますが、VRAMが16~24GB以下の設定になります。
インストールしたKohya ssのバージョンや、依存しているTorchやCUDAのバージョン違いでも結果は変わってくるので、紹介した設定で必ずしも同じ結果になるとは限りません。あらゆるデータセットやキャプションで高品質なLoRAを学習できるベストな設定は今のところは存在しないので、トライ&エラーで品質を上げていきましょう。今回の学習は執筆時のKohya ss GUI最新バージョンv25.0.3とRunPodのubuntu22.04を使っています。
RunPodの環境は下記の様になっています。
- PODテンプレート:RunPod Pytorch 2.2.0
- GPU:1 x RTX 4090 ※RTX 5090はx-formarsが条件を満たしていない為今のところ使えません。どうしても使いたい場合はご自身でx-formarsをアンインストールしてクロスアテンションをTorchのsdpaを使う必要があります。🔗[参照] bmaltais/kohya_ss GitHub issue(英語)
- OS:ubuntu22.04
- Torch:2.5.0+cu124
- Python:3.10.12
- CUDA:12.4
- cuDNN:90100
- Kohya_ss GUI:25.0.3
LR Scheduler
cosine_with_restartsは、LR Schedulerの1つでcosineを指定した間隔でリセットしながら学習します。リセットの回数はLR # cyclesで指定します。
下記のデフォルトとの比較画像を見てみましょう。


Optimizer
公式のドキュメントでは、Adafactorを推奨しています。また、先ほどのデフォルト設定で使用したAdamW8bitはおススメしていない様です。学習画像数が少なかったり、シンプルな場合はProdigyをおススメしますが、今回は「AdamW」でOptimizer extra argumentsを使い、設定を少し変更して学習してみましょう。
PyTorchのドキュメントではAdamWのデフォルトクラスが下記の様になっています。
torch.optim.AdamW(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.01, amsgrad=False, *, maximize=False, foreach=None, capturable=False, differentiable=False, fused=None)
今回変更するAdamWのパラメーターは下記の2つになります。
betas
学習の収束に向けた勾配の平均を計算するために使用される係数。(beta1, beta2)となっており、beta1は過去の勾配をどれだけ重視するかを調節します。beta2は勾配の大きさ(変動の度合い)をどれだけ重視するかを調節します。
今回はbeta2を0.999から0.99
に下げて使用します。下げることで直近の勾配変動に反応しやすく、学習率の調整が敏感になります。
weight_decay
weight_decayは、モデルの重みが大きくなりすぎるのを防ぐための正則化手法です。モデルを効果的に単純化し、汎用性を高めることができます。
今回はデフォルトの0.01から0.05
に上げて使用します。こうすることで安定性と汎用性が上がります。
その他のパラメーター
基本的には前回のSD1.5の時とほとんど変わりませんが、違う点としてはScale weight normsとMin SNR gammaを使っていないところです。理由としてはScale weight normsはAdamWのweight_decayを強くしているので必要ないのと、Min SNR gammaは今回の設定では、あまり効果が無かったので使っていません。
では、変更後の学習設定をみていきましょう。
- Pretrained model name or path:animagineXLV31_v30Base.safetensors
- Trained Model output name:DCAI_Girl_SDXL_Anima3
- Instance prompt:dcai-girl
- Class prompt:1girl
- Repeats:5 [デフォルト:40]
- Presets:none
- LoRA type:Standard
- Train batch size:1
- Epoch:4 [デフォルト:1] ※総ステップをEpochで調節する為
- Max train epoch:0
- Max train steps:0 [デフォルト:1600] ※総ステップをEpochで調節する為
- Save every N epochs:0 [デフォルト:1] ※途中経過を見る必要が無かった為
- Seed:123 [デフォルト:0 = ランダム]
- LR Scheduler:cosine_with_restarts [デフォルト:cosine]
- Optimizer:AdamW [デフォルト:AdamW8bit]
- Optimizer extra arguments:betas=0.9,0.99 weight_decay=0.05
- Learning rate:0.0004 (4e-4) [デフォルト:0.0001]
- Text Encoder learning rate:0.00005 (5e-5) [デフォルト:0.0001 (1e-4)]
- Unet learning rate:0.0004 (4e-4) [デフォルト:0.0001]
- LR warmup (% of total steps):10
- LR # cycles:2 [デフォルト:1]
- Network Rank (Dimension):32 [デフォルト:8]
- Network Alpha:16 [デフォルト:1]
- Keep n tokens:8 [デフォルト:0] ※インスタンスとクラスのトークン数
- clip_skip:0 [デフォルト:1] ※SDXLではClip skipが無効化される為
- Shuffle caption:true [デフォルト:false]
- CrossAttention:sdpa [デフォルト:xformers]
VRAMが16GB以下の方はGradient checkpointingを使いましょう。学習時間は伸びますがVRAMの消費を抑える事ができます。これでもVRAMが足らない場合はOptimizerを「Adafactor」に変更して見ましょう。
学習結果
A1111 WebUIの設定は先ほどのテスト生成と同じ設定で生成しました。

他のLoRAとの併用について
他のLoRAと併用する時にウェイトのスケールが違うと上手く適用できない時があります。生成の設定は同じで「xl_more_art-full / xl_real / Enhancer」を1.0で適応させたのが以下になります。

同系統のチェックポイントモデルに適用する
今回はAnimagineV3.1で学習したので、同じ系統のチェックポイントモデルでも使う事ができます。すべてテスト生成と同じ設定で生成しています。






この様に、マージモデルにAnimagineV3.1が含まれている場合は、LoRAを適用する事ができます。
最終結果のLoRAはCivitaiにて公開していますので興味のある方はダウンロードしてみましょう。
まとめ
今回はSDXLのLoRA学習について解説してきました。前回のSD1.5と比べると学習時間も長くなり、PCのスペックもある程度求められるのでトライ&エラーが結構大変になります。しかし、SD1.5と比べると解像度も上がった影響でディテールのあるキャラクターLoRAを学習できたと思います。近いうちにanimagineXL以外の系統(ponyDiffusionV6XL・illustriousXL01・NoobAI-XL)の解説もしていきたいと思っています。また、今回の編集ではGPUクラウドのRunPodを使って学習していたので、学習の為にPCが使えない状況にはならなかったのがとても有用でした。有料のサービスですがRunPodの導入方法もDCAIで解説したいとも思っています。


MSI GeForce RTX 3050 LP 6G OC PCIe4.0 ロープロファイルサイズ 補助電源不要 デュアルファン搭載 グラフィックスボード VD8790
ASIN:B0CTJZCJH1

玄人志向 NVIDIA GeForce RTX3060 搭載 グラフィックボード GDDR6 12GB GALAKURO GAMINGシリーズ 【国内正規代理店品】 GG-RTX3060-E12GB/OC/DF
ASIN:B08XMC4QJ1


玄人志向 NVIDIA Geforce RTX5060Ti 搭載 グラフィックボード GDDR7 16GB【国内正規品】 GG-RTX5060Ti-E16GB/OC/DF
ASIN:B0F5394R5S

ASUS GeForce RTX 3050 LP BRK OC Edition 6GB GDDR6 ビデオカード / RTX3050-O6G-LP-BRK 国内正規流通品
ASIN:B0CXPBVJD3

玄人志向 NVIDIA GeForce RTX2060 搭載 グラフィックボード GDDR6 12GB GALAKURO GAMINGモデル GG-RTX2060-E12GB/DF ブラック
ASIN:B09Q66CLY2

玄人志向 NVIDIA GeForce GTX1650搭載 グラフィックボード GDDR6 4GB デュアルファン・補助電源なしモデル GF-GTX1650D6-E4GB/DF3
ASIN:B08PBP1F6Y

GIGABYTE NVIDIA GeForce RTX4060搭載 グラフィックボード GDDR6 8GB【国内正規代理店品】 GV-N4060OC-8GL
ASIN:B0CG69PH11

【国内正規品】NVIDIA RTX A400 4GB GDDR6 Ampere アーキテクチャ グラフィックスボード ENQRA400-4GER ELSA エルザ
ASIN:B0DFXNDR4S