このリポジトリには、Stable Diffusion のトレーニング、生成、およびユーティリティ スクリプトが含まれています。
変更履歴はページの下部に移動します。 更新履歴はページ末尾に移しました。
日本語版READMEはこちら
開発バージョンはdev
ブランチにあります。最新の変更については、dev ブランチを確認してください。
FLUX.1 および SD3/SD3.5 のサポートはsd3
ブランチで行われます。育成したい場合はsd3ブランチをご利用ください。
より簡単に使用するには (GUI や PowerShell スクリプトなど)、bmaltais によって管理されているリポジトリにアクセスしてください。 @bmaltais に感謝します!
このリポジトリには、次のスクリプトが含まれています。
このファイルには PyTorch の要件が含まれていません。 PyTorchのバージョンは環境に依存するため、ファイルには含まれていません。環境に応じてまず PyTorch をインストールしてください。以下のインストール手順を参照してください。
スクリプトは Pytorch 2.1.2 でテストされています。 2.0.1 と 1.12.1 はテストされていませんが、動作するはずです。
書類のほとんどは日本語で書かれています。
darkstorm2150による英語翻訳はこちらです。 darkstorm2150に感謝します!
Python 3.10.6 と Git:
venv が動作できるように、powershell への無制限のスクリプト アクセスを許可します。
Set-ExecutionPolicy Unrestricted
と入力し、「A」と答えます通常の Powershell ターミナルを開き、その中に次のように入力します。
git clone https: // github.com / kohya - ss / sd - scripts.git
cd sd - scripts
python - m venv venv
.venvScriptsactivate
pip install torch == 2.1 . 2 torchvision == 0.16 . 2 -- index - url https: // download.pytorch.org / whl / cu118
pip install -- upgrade - r requirements.txt
pip install xformers == 0.0 . 23. post1 -- index - url https: // download.pytorch.org / whl / cu118
accelerate config
python -m venv
python
のみが表示される場合は、 python
py
に変更します。
注:現在、 bitsandbytes==0.43.0
、 prodigyopt==1.0
、およびlion-pytorch==0.0.6
が required.txt に含まれています。別のバージョンを使用したい場合は、手動でインストールしてください。
このインストールは CUDA 11.8 用です。別のバージョンの CUDA を使用する場合は、適切なバージョンの PyTorch と xformers をインストールしてください。たとえば、CUDA 12 を使用している場合は、 pip install torch==2.1.2 torchvision==0.16.2 --index-url https://download.pytorch.org/whl/cu121
およびpip install xformers==0.0.23.post1 --index-url https://download.pytorch.org/whl/cu121
をインストールしてください。 pip install xformers==0.0.23.post1 --index-url https://download.pytorch.org/whl/cu121
。
構成を高速化するための答え:
- This machine
- No distributed training
- NO
- NO
- NO
- all
- fp16
bf16を使用したい場合は、最後の質問にbf16
について答えてください。
注: 一部のユーザーは、トレーニング中にValueError: fp16 mixed precision requires a GPU
が発生すると報告しています。この場合、6 番目の質問には0
と答えてください: What GPU(s) (by id) should be used for training on this machine as a comma-separated list? [all]:
(ID 0
の単一 GPU が使用されます。)
新しいリリースがリリースされたら、次のコマンドを使用してリポジトリをアップグレードできます。
cd sd - scripts
git pull
.venvScriptsactivate
pip install -- use-pep517 -- upgrade - r requirements.txt
コマンドが正常に完了すると、新しいバージョンを使用できるようになります。
PyTorch をアップグレードする場合は、「Windows インストール」セクションのpip install
コマンドを使用してアップグレードできます。 PyTorch をアップグレードする場合は、 xformers
もアップグレードする必要があります。
LoRA の実装は cloneofsimo のリポジトリに基づいています。素晴らしい仕事をありがとう!
Conv2d 3x3 への LoRA 拡張は、当初 cloneofsimo によってリリースされ、その有効性は LoCon で KohakuBlueleaf によって実証されました。 KohakuBlueleafさん、本当にありがとうございました!
スクリプトの大部分は ASL 2.0 に基づいてライセンスされています (Diffuser、cloneofsimo、LoCon のコードを含む) が、プロジェクトの一部は別のライセンス条項に基づいて利用可能です。
メモリ効率の高い注意 Pytorch: MIT
ビットサンドバイト: MIT
BLIP: BSD-3 条項
svd_merge_lora.py
VRAM の使用量が削減されました。ただし、メインメモリの使用量は増加します(32GBで十分です)。svd_merge_lora.py
の VRAM 使用量を削減しました。 なお、メインメモリの使用量は増加します(32GB あれば十分です)。 save_precision
が計算で使用されるprecision
と異なる場合に、LoRA メタデータのハッシュ値が正しく計算されないというsvd_merge_lora.py
、 sdxl_merge_lora.py
、およびresize_lora.py
のバグを修正しました。詳細については、問題 #1722 を参照してください。問題を提起してくれた JujoHotaru に感謝します。
次のリリースに含まれる予定です。
svd_merge_lora.py
、 sdxl_merge_lora.py
、 resize_lora.py
で、保存時の精度が計算時の精度と異なる場合、LoRAメタデータのハッシュ値が正しく計算されない不具合を修正しました。詳細は issue #1722 をご覧ください。問題を上げていただいた JujoHotaru 氏に感謝します。
以上は次回リリースに含まれます。
sdxl_merge_lora.py
OFT をサポートするようになりました。 PR #1580 は、まるめーさんに感謝します。
svd_merge_lora.py
LBW をサポートするようになりました。テラコッタハニワさんに感謝です。詳細については PR #1575 を参照してください。
sdxl_merge_lora.py
LBW もサポートしています。
LBW の詳細については、hako-mikan の LoRA Block Weight を参照してください。
これらは次のリリースに含まれる予定です。
sdxl_merge_lora.py
が OFT をサポートしました。PR #1580 マルミー氏に感謝します。
svd_merge_lora.py
で LBW がサポートされました。PR #1575 terracottahaniwa 氏に感謝します。
sdxl_merge_lora.py
でも LBW がサポートされました。
LBWの詳細はhako-mikan氏のLoRAブロック重量をご覧ください。
以上は次回リリースに含まれます。
cache_latents.py
とcache_text_encoder_outputs.py
機能しない問題を修正しました。 (次のリリースに含まれる予定です。)
cache_latents.py
およびcache_text_encoder_outputs.py
が動作しなくなっていたのを修正しました。(次回リリースに含まれます。)
スケジュールされたフーバー損失のhuber_schedule
のデフォルト値がexponential
からsnr
に変更され、より良い結果が得られることが期待されます。
予定されたフーバー損失のhuber_schedule
の当然値をexponential
から、より良い結果が期待できるsnr
に変更しました。
imagesize
新しく追加されたものなので、すぐにライブラリを更新できない場合は別途pip install imagesize==1.4.1
でインストールしてください。bitsandbytes==0.43.0
、 prodigyopt==1.0
、 lion-pytorch==0.0.6
は、requirements.txt に含まれています。bitsandbytes
Windows を正式にサポートするようになったため、複雑な手順は必要なくなりました。.toml
) に wandb API キーと HuggingFace トークンを記述することをお勧めします。問題を提起してくれた bghira に感謝します。--console_log_simple
オプションを指定して、リッチ ログを無効にしてみてください。train_network.py
とsdxl_train_network.py
、トレーニング済みモデルのメタデータ ( caption_prefix
、 caption_suffix
、 keep_tokens_separator
、 secondary_separator
、 enable_wildcard
) にいくつかのデータセット設定を記録するように変更されています。train_network.py
とsdxl_train_network.py
の状態に U-Net と Text Encoder が含まれてしまうバグを修正しました。状態の保存と読み込みが高速になり、ファイル サイズが小さくなり、読み込み時のメモリ使用量が削減されます。--noise_offset_random_strength
および--ip_noise_gamma_random_strength
が各トレーニング スクリプトに追加されます。これらのオプションを使用して、ノイズ オフセットと IP ノイズ ガンマを 0 から指定された値の範囲で変更できます。 PR #1177 KohakuBlueleafさんに感謝!--save_state_on_train_end
が各トレーニング スクリプトに追加されます。 PR #1168 gesen2egee さん、ありがとうございます!--sample_every_n_epochs
および--sample_every_n_steps
は、 0
以下の数値が指定された場合に警告を表示し、無視するようになりました。問題を提起してくれた S-Del に感謝します。 .toml
ファイルが UTF-8 エンコーディングで読み取られるようになりました。 PR #1167 Horizon1704 に感謝します!secondary_separator
を追加します。secondary_separator=";;;"
を指定します。 。 secondary_separator
指定すると、パートはシャッフルまたはドロップされません。enable_wildcard
が追加されました。 true
に設定すると、ワイルドカード表記{aaa|bbb|ccc}
を使用できます。複数行のキャプションも有効になります。keep_tokens_separator
がキャプション内で 2 回使用されるように更新されました。 keep_tokens_separator="|||"
を指定した場合、2 番目の|||
で除算された部分シャッフルもドロップもされず、最後に残ります。caption_prefix
とcaption_suffix
併用できます。 caption_prefix
とcaption_suffix
が最初に処理され、次に、 enable_wildcard
、 keep_tokens_separator
、シャッフルとドロップ、およびsecondary_separator
順番に処理されます。tag_image_by_wd14_tagger.py
に追加されました ( --onnx
オプションのみ)。 PR #1192 sdbds に感謝します!pip install onnx==1.15.0 onnxruntime-gpu==1.17.1
などでインストールまたは更新してくださいrequirements.txt
のコメントも確認してください。tag_image_by_wd14_tagger.py
の--repo_id
としてサブディレクトリに保存されます。これにより、複数の repo_id モデルがキャッシュされます。 --model_dir
配下の不要なファイルを削除してください。tag_image_by_wd14_tagger.py
に追加されます。--use_rating_tags
および--use_rating_tags_as_last_tag
--character_tags_first
--character_tag_expand
--always_first_tags
--tag_replacement
make_captions.py
で--beam_search
を指定し、 --num_beams
に 2 以上の値を指定した場合のエラーを修正しました。 マスクされた損失は各トレーニング スクリプトでサポートされています。マスクされた損失を有効にするには、 --masked_loss
オプションを指定します。
この機能は完全にテストされていないため、バグが存在する可能性があります。問題が見つかった場合は、問題を開いてください。
ControlNet データセットはマスクを指定するために使用されます。マスク画像はRGB画像である必要があります。 R チャネルの画素値 255 はマスクとして扱われ (損失はマスクのある画素についてのみ計算されます)、0 は非マスクとして扱われます。ピクセル値 0 ~ 255 は 0 ~ 1 に変換されます (つまり、ピクセル値 128 は損失の半分の重みとして扱われます)。データセット仕様の詳細については、LLLite ドキュメントを参照してください。
スケジュールされたフーバー損失が各トレーニング スクリプトに導入されました。これは、トレーニング データの外れ値や異常 (データ破損) に対する堅牢性を向上させる方法です。
従来の MSE (L2) 損失関数では、外れ値の影響が大きく、生成される画像の品質が低下する可能性があります。一方、フーバー損失関数は外れ値の影響を抑制できますが、画像の細部の再現が損なわれる傾向があります。
これに対処するために、提案された方法では、フーバー損失関数の賢明なアプリケーションを採用しています。トレーニングの初期段階 (ノイズが高いとき) にフーバー損失を使用し、後の段階で MSE を使用するようにスケジュールすることにより、異常値の堅牢性と細部の再現性のバランスが取れます。
実験結果により、この方法は純粋なフーバー損失または MSE と比較して、外れ値を含むデータに対してより高い精度を達成することが確認されました。計算コストの増加は最小限です。
新しく追加された引数 loss_type、huber_schedule、huber_c を使用すると、損失関数のタイプ (Huber、smooth L1、MSE)、スケジューリング方法 (指数関数、定数、SNR)、および Huber のパラメーターを選択できます。これにより、データセットの特性に基づいた最適化が可能になります。
詳細については、PR #1228 を参照してください。
loss_type
: 損失関数のタイプを指定します。 Huber 損失の場合はhuber
、スムーズな L1 損失の場合はsmooth_l1
、MSE 損失の場合はl2
選択します。デフォルトはl2
で、これは前と同じです。huber_schedule
: スケジュール方法を指定します。 exponential
、 constant
、またはsnr
を選択します。デフォルトはsnr
です。huber_c
: Huberのパラメータを指定します。デフォルトは0.1
です。最近の更新については、「リリース」を参照してください。
imagesize
が新しく追加されていますので、すぐにライブラリの更新ができない場合はpip install imagesize==1.4.1
で個別にインストールしてください。bitsandbytes==0.43.0
、 prodigyopt==1.0
、 lion-pytorch==0.0.6
がrequirements.txtに含まれるようになりました。bitsandbytes
が公式にWindowsをサポートしたため複雑な手順が不要になりました。.toml
)への記載をお勧めし問題を引き上げていただいた bghira 氏に感謝します。--console_log_simple
オプションを指定して、豊富なロギングを試してください。train_network.py
およびsdxl_train_network.py
で、学習したモデルのメタデータの一部のデータセット設定が記録されるよう修正しました( caption_prefix
、 caption_suffix
、 keep_tokens_separator
、 secondary_separator
、 enable_wildcard
)。train_network.py
およびsdxl_train_network.py
で、stateにU-NetおよびText Encoderが含まれる不具合を修正しました。stateの保存、読み込みが高速化され、ファイルサイズも小さくなり、また読み込み時のメモリ使用量も削減されます。--noise_offset_random_strength
および--ip_noise_gamma_random_strength
が追加されました。 PR #1177 KohakuBlueleaf 氏に感謝します。--save_state_on_train_end
オプションが追加されました。 PR #1168 gesen2egee 氏に感謝します。--sample_every_n_epochs
および--sample_every_n_steps
オプションに0
以下の数値を指定した時、警告を表示する場合はそれを無視するよう変更しました。問題引き上げしていただいた S-Del 氏に感謝します。 .toml
ファイルがUTF-8エンコードで読み進められました。PR #1167 Horizon1704氏に感謝します。secondary_separator
を追加しました。 secondary_separator
secondary_separator=";;;"
のように指定します。true
にするとenable_wildcard
記法{aaa|bbb|ccc}
が使用できます。また複数行のキャプションも有効になります。keep_tokens_separator
をキャプション内に 2 つ使えるようにしました。 同様にkeep_tokens_separator="|||"
と指定したとき、 1girl, hatsune miku, vocaloid ||| stage, mic ||| best quality, rating: general
とキャプションを指定すると、二番目の|||
で分割された部分はシャッフル、ドロップされず末尾に残ります。caption_prefix
とcaption_suffix
とあわせて使えます。 caption_prefix
とcaption_suffix
は一番最初に処理され、その後、ワイルドカード、 keep_tokens_separator
、シャッフルおよびdrop、 secondary_separator
の順に処理されます。tag_image_by_wd14_tagger.py
で v3 のリポジトリがサポートされました( --onnx
指定時のみ有効)。 PR #1192 sdbds 氏に感謝します。requirements.txt
pip install onnx==1.15.0 onnxruntime-gpu==1.17.1
ません。 requirements.txt
のコメントもあわせてご確認ください。tag_image_by_wd14_tagger.py
で、モデルを--repo_id
のサブディレクトリに保存しますようにしました。これにより複数のモデルファイルがキャッシュされます。 --model_dir
直下の不要なファイルは願い削除します。tag_image_by_wd14_tagger.py
にいくつかのオプションを追加しました。--use_rating_tags
および--use_rating_tags_as_last_tag
--character_tags_first
--character_tag_expand
--always_first_tags
--tag_replacement
make_captions.py
で--beam_search
を指定し--num_beams
に2以上の値を指定した時のエラーを修正しました。 各学習スクリプトでマスクロスをサポートしました。マスクロスを有効にしてください--masked_loss
オプションを指定してください。
機能は完全にテストされていないため、不具合があるかもしれません。その場合は問題を立てていただけると思います。
マスクの指定には ControlNet データセットを使用します。マスク画像は RGB 画像である必要があります。R チャンネルのピクセル値 255 がロス計算対象、0 がロス計算対象外になります。0-255 の値は、0-1 の範囲に変換されます(つまりピクセル値 128 の部分はロスの重みが半分になります)。データセットの詳細は LLLite ドキュメントをご覧ください。
各学習スクリプトに、学習データ中の異常値や想定値(データ破損)への耐性を高めるための手法、Scheduled Huber Lossが導入されました。
従来のMSE(L2)失関数では、異常値の影響を大きく受け止めて、生成画像の品質低下を恐れています。一方、Huber 失関数は異常値の影響を抑えられますが、画像の細部再現性がよくありました。
この手法ではHuber関数の適用を工夫し、学習の初期段階(ノイズが大きい場合)ではHuber損失を、後期段階ではMSEを載せようスケジューリングすることで、異常値耐久性と再現性のバランスを取りますます。
実験の結果では、この手法が純粋なHuber損失やMSEと比べて、異常値を含むデータでより高い精度を達成することが確認されています。また計算コストの増加はわずかです。
具体的には、新たに追加された引数loss_type、huber_schedule、huber_cで、ロス関数の種類(Huber、smooth L1、MSE)とスケジューリング方法(exponential、constant、SNR)を選択できます。これによりデータセットに応じた最適化が可能になります。
詳細はPR#1228をご覧ください。
loss_type
: 損失関数の種類を指定します。huber で Huber 損失、 huber
でスムーズ L1 損失、 l2
で MSE 損失を選択します。当然smooth_l1
l2
で、従来と同様です。huber_schedule
constant
exponential
一定、 snr
で信号対雑音比に基づくsnr
を選択します。huber_c
: Huber 失敗のパラメータを指定します。結局0.1
です。 PR 内でいくつかの比較が共有されています。この機能を実行する場合、最初は--loss_type smooth_l1 --huber_schedule snr --huber_c 0.1
などで試してみてもよいかもしれません。
最近の更新情報はリリースをご覧ください。
train_network.py
でサポートされる LoRA は、混乱を避けるために名前が付けられています。ドキュメントが更新されました。このリポジトリ内の LoRA タイプの名前は次のとおりです。
LoRA -LierLa : (線形層のLoRA)
1x1 カーネルを使用した線形レイヤーおよび Conv2d レイヤー用の LoRA
LoRA-C3Lier : ( 3 x 3 カーネル層とライナー層を備えたColutional層用の LoRA)
1. に加えて、3x3 カーネルを使用した Conv2d レイヤー用の LoRA
LoRA-LierLa は、 train_network.py
( conv_dim
ネットワーク引数なし) のデフォルトの LoRA タイプです。
たとえば、プロンプト ファイルは次のようになります。
# prompt 1
masterpiece, best quality, (1girl), in white shirts, upper body, looking at viewer, simple background --n low quality, worst quality, bad anatomy,bad composition, poor, low effort --w 768 --h 768 --d 1 --l 7.5 --s 28
# prompt 2
masterpiece, best quality, 1boy, in business suit, standing at street, looking back --n (low quality, worst quality), bad anatomy,bad composition, poor, low effort --w 576 --h 832 --d 2 --l 5.5 --s 40
#
で始まる行はコメントです。プロンプトの後に--n
などのオプションを使用して、生成されたイメージのオプションを指定できます。以下のものが使用できます。
--n
次のオプションまでの否定プロンプト。--w
生成される画像の幅を指定します。--h
生成される画像の高さを指定します。--d
生成されるイメージのシードを指定します。--l
生成されるイメージの CFG スケールを指定します。--s
生成のステップ数を指定します。 ( )
や[ ]
などのプロンプトの重み付けが機能します。