10 KiB
sd3_train_network.py を用いたStable Diffusion 3/3.5モデルのLoRA学習ガイド
このドキュメントでは、sd-scriptsリポジトリに含まれるsd3_train_network.pyを使用して、Stable Diffusion 3 (SD3) および Stable Diffusion 3.5 (SD3.5) モデルに対するLoRA (Low-Rank Adaptation) モデルを学習する基本的な手順について解説します。
1. はじめに
sd3_train_network.pyは、Stable Diffusion 3/3.5モデルに対してLoRAなどの追加ネットワークを学習させるためのスクリプトです。SD3は、MMDiT (Multi-Modal Diffusion Transformer) と呼ばれる新しいアーキテクチャを採用しており、従来のStable Diffusionモデルとは構造が異なります。このスクリプトを使用することで、SD3/3.5モデルに特化したLoRAモデルを作成できます。
このガイドは、基本的なLoRA学習の手順を理解しているユーザーを対象とし、train_network.pyでの学習経験があることを前提としています。基本的な使い方や共通のオプションについては、train_network.pyのガイドを参照してください。
前提条件:
sd-scriptsリポジトリのクローンとPython環境のセットアップが完了していること。- 学習用データセットの準備が完了していること。(データセットの準備についてはデータセット設定ガイドを参照してください)
- 学習対象のSD3/3.5モデルファイルが準備できていること。
2. train_network.py との違い
sd3_train_network.pyはtrain_network.pyをベースに、SD3/3.5モデルに対応するための変更が加えられています。主な違いは以下の通りです。
- 対象モデル: Stable Diffusion 3 Medium / Large (3.0 / 3.5) モデルを対象とします。
- モデル構造: U-Netの代わりにMMDiT (Transformerベース) を使用します。Text EncoderとしてCLIP-L, CLIP-G, T5-XXLの三つを使用します。VAEはSDXLと互換性がありますが、入力のスケール処理が異なります。
- 引数: SD3/3.5モデル、Text Encoder群、VAEを指定する引数があります。ただし、単一ファイルの
.safetensors形式であれば、内部で自動的に分離されるため、個別のパス指定は必須ではありません。 - 一部引数の非互換性: Stable Diffusion v1/v2向けの引数(例:
--v2,--v_parameterization,--clip_skip)はSD3/3.5の学習では使用されません。 - SD3特有の引数: Text Encoderのアテンションマスクやドロップアウト率、Positional Embeddingの調整(SD3.5向け)、タイムステップのサンプリングや損失の重み付けに関する引数が追加されています。
3. 準備
学習を開始する前に、以下のファイルが必要です。
- 学習スクリプト:
sd3_train_network.py - SD3/3.5モデルファイル: 学習のベースとなるSD3/3.5モデルの
.safetensorsファイル。単一ファイル形式(Diffusers/ComfyUI/AUTOMATIC1111形式)を推奨します。- Text EncoderやVAEが別ファイルになっている場合は、対応する引数でパスを指定します。
- データセット定義ファイル (.toml): 学習データセットの設定を記述したTOML形式のファイル。(詳細はデータセット設定ガイドを参照してください)。
- 例として
my_sd3_dataset_config.tomlを使用します。
- 例として
4. 学習の実行
学習は、ターミナルからsd3_train_network.pyを実行することで開始します。基本的なコマンドラインの構造はtrain_network.pyと同様ですが、SD3/3.5特有の引数を指定する必要があります。
以下に、基本的なコマンドライン実行例を示します。
accelerate launch --num_cpu_threads_per_process 1 sd3_train_network.py
--pretrained_model_name_or_path="<path to SD3 model>"
--dataset_config="my_sd3_dataset_config.toml"
--output_dir="<output directory for training results>"
--output_name="my_sd3_lora"
--save_model_as=safetensors
--network_module=networks.lora
--network_dim=16
--network_alpha=1
--learning_rate=1e-4
--optimizer_type="AdamW8bit"
--lr_scheduler="constant"
--sdpa
--max_train_epochs=10
--save_every_n_epochs=1
--mixed_precision="fp16"
--gradient_checkpointing
--apply_lg_attn_mask
--apply_t5_attn_mask
--weighting_scheme="sigma_sqrt"
--blocks_to_swap=32
※実際には1行で書くか、適切な改行文字(\ または ^)を使用してください。
4.1. 主要なコマンドライン引数の解説(train_network.pyからの追加・変更点)
train_network.pyのガイドで説明されている引数に加え、以下のSD3/3.5特有の引数を指定します。共通の引数(--output_dir, --output_name, --network_module, --network_dim, --network_alpha, --learning_rateなど)については、上記ガイドを参照してください。
モデル関連
--pretrained_model_name_or_path="<path to SD3 model>"[必須]- 学習のベースとなるSD3/3.5モデルの
.safetensorsファイルのパスを指定します。単一ファイル形式(Diffusers/ComfyUI/AUTOMATIC1111形式)を想定しています。
- 学習のベースとなるSD3/3.5モデルの
--clip_l,--clip_g,--t5xxl,--vae:- ベースモデルが単一ファイル形式の場合、通常これらの指定は不要です(自動的にモデル内部から読み込まれます)。
- もしText EncoderやVAEが別ファイルとして提供されている場合は、それぞれの
.safetensorsファイルのパスを指定します。
SD3/3.5 学習パラメータ
--t5xxl_max_token_length=<integer>- T5-XXL Text Encoderで使用するトークンの最大長を指定します。SD3のデフォルトは
256です。データセットのキャプション長に合わせて調整が必要な場合があります。
- T5-XXL Text Encoderで使用するトークンの最大長を指定します。SD3のデフォルトは
--apply_lg_attn_mask- CLIP-LおよびCLIP-Gの出力に対して、パディングトークンに対応するアテンションマスク(ゼロ埋め)を適用します。
--apply_t5_attn_mask- T5-XXLの出力に対して、パディングトークンに対応するアテンションマスク(ゼロ埋め)を適用します。
--clip_l_dropout_rate,--clip_g_dropout_rate,--t5_dropout_rate:- 各Text Encoderの出力に対して、指定した確率でドロップアウト(出力をゼロにする)を適用します。過学習の抑制に役立つ場合があります。デフォルトは
0.0(ドロップアウトなし)です。
- 各Text Encoderの出力に対して、指定した確率でドロップアウト(出力をゼロにする)を適用します。過学習の抑制に役立つ場合があります。デフォルトは
--pos_emb_random_crop_rate=<float>[SD3.5向け]- MMDiTのPositional Embeddingに対してランダムクロップを適用する確率を指定します。SD3 5M (3.5) モデルで学習された機能であり、他のモデルでの効果は限定的です。デフォルトは
0.0です。
- MMDiTのPositional Embeddingに対してランダムクロップを適用する確率を指定します。SD3 5M (3.5) モデルで学習された機能であり、他のモデルでの効果は限定的です。デフォルトは
--enable_scaled_pos_embed[SD3.5向け]- マルチ解像度学習時に、解像度に応じてPositional Embeddingをスケーリングします。SD3 5M (3.5) モデルで学習された機能であり、他のモデルでの効果は限定的です。
--training_shift=<float>- 学習時のタイムステップ(ノイズレベル)の分布を調整するためのシフト値です。
weighting_schemeに加えて適用されます。1.0より大きい値はノイズの大きい(構造寄り)領域を、小さい値はノイズの小さい(詳細寄り)領域を重視する傾向になります。デフォルトは1.0です。
- 学習時のタイムステップ(ノイズレベル)の分布を調整するためのシフト値です。
--weighting_scheme=<choice>- 損失計算時のタイムステップ(ノイズレベル)に応じた重み付け方法を指定します。
sigma_sqrt,logit_normal,mode,cosmap,uniform(またはnone) から選択します。SD3の論文ではsigma_sqrtが使用されています。デフォルトはuniformです。
- 損失計算時のタイムステップ(ノイズレベル)に応じた重み付け方法を指定します。
--logit_mean,--logit_std,--mode_scale:weighting_schemeでlogit_normalまたはmodeを選択した場合に、その分布を制御するためのパラメータです。通常はデフォルト値で問題ありません。
メモリ・速度関連
--blocks_to_swap=<integer>[実験的機能]- VRAM使用量を削減するために、モデルの一部(MMDiTのTransformerブロック)をCPUとGPU間でスワップする設定です。スワップするブロック数を整数で指定します(例:
32)。値を大きくするとVRAM使用量は減りますが、学習速度は低下します。GPUのVRAM容量に応じて調整してください。gradient_checkpointingと併用可能です。 --cpu_offload_checkpointingとは併用できません。
- VRAM使用量を削減するために、モデルの一部(MMDiTのTransformerブロック)をCPUとGPU間でスワップする設定です。スワップするブロック数を整数で指定します(例:
非互換・非推奨の引数
--v2,--v_parameterization,--clip_skip: Stable Diffusion v1/v2特有の引数のため、SD3/3.5学習では使用されません。
4.2. 学習の開始
必要な引数を設定し、コマンドを実行すると学習が開始されます。基本的な流れやログの確認方法はtrain_network.pyのガイドと同様です。
5. 学習済みモデルの利用
学習が完了すると、指定したoutput_dirにLoRAモデルファイル(例: my_sd3_lora.safetensors)が保存されます。このファイルは、SD3/3.5モデルに対応した推論環境(例: ComfyUIなど)で使用できます。
6. その他
sd3_train_network.pyには、サンプル画像の生成 (--sample_promptsなど) や詳細なオプティマイザ設定など、train_network.pyと共通の機能も多く存在します。これらについては、train_network.pyのガイドやスクリプトのヘルプ (python sd3_train_network.py --help) を参照してください。