This repository contains training, generation and utility scripts for Stable Diffusion.
Change History is moved to the bottom of the page. 更新履歴はページ末尾に移しました。
The development version is in the dev
branch. Please check the dev branch for the latest changes.
FLUX.1 and SD3/SD3.5 support is done in the sd3
branch. If you want to train them, please use the sd3 branch.
For easier use (GUI and PowerShell scripts etc...), please visit the repository maintained by bmaltais. Thanks to @bmaltais!
This repository contains the scripts for:
The file does not contain requirements for PyTorch. Because the version of PyTorch depends on the environment, it is not included in the file. Please install PyTorch first according to the environment. See installation instructions below.
The scripts are tested with Pytorch 2.1.2. 2.0.1 and 1.12.1 is not tested but should work.
Most of the documents are written in Japanese.
English translation by darkstorm2150 is here. Thanks to darkstorm2150!
Python 3.10.6 and Git:
Give unrestricted script access to powershell so venv can work:
Set-ExecutionPolicy Unrestricted
and answer AOpen a regular Powershell terminal and type the following inside:
git clone https://github.com/kohya-ss/sd-scripts.git
cd sd-scripts
python -m venv venv
.\venv\Scripts\activate
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
If python -m venv
shows only python
, change python
to py
.
Note: Now bitsandbytes==0.43.0
, prodigyopt==1.0
and lion-pytorch==0.0.6
are included in the requirements.txt. If you'd like to use the another version, please install it manually.
This installation is for CUDA 11.8. If you use a different version of CUDA, please install the appropriate version of PyTorch and xformers. For example, if you use CUDA 12, please install pip install torch==2.1.2 torchvision==0.16.2 --index-url https://download.pytorch.org/whl/cu121
and pip install xformers==0.0.23.post1 --index-url https://download.pytorch.org/whl/cu121
.
Answers to accelerate config:
- This machine
- No distributed training
- NO
- NO
- NO
- all
- fp16
If you'd like to use bf16, please answer bf16
to the last question.
Note: Some user reports ValueError: fp16 mixed precision requires a GPU
is occurred in training. In this case, answer 0
for the 6th question:
What GPU(s) (by id) should be used for training on this machine as a comma-separated list? [all]:
(Single GPU with id 0
will be used.)
When a new release comes out you can upgrade your repo with the following command:
cd sd-scripts
git pull
.\venv\Scripts\activate
pip install --use-pep517 --upgrade -r requirements.txt
Once the commands have completed successfully you should be ready to use the new version.
If you want to upgrade PyTorch, you can upgrade it with pip install
command in Windows Installation section. xformers
is also required to be upgraded when PyTorch is upgraded.
The implementation for LoRA is based on cloneofsimo's repo. Thank you for great work!
The LoRA expansion to Conv2d 3x3 was initially released by cloneofsimo and its effectiveness was demonstrated at LoCon by KohakuBlueleaf. Thank you so much KohakuBlueleaf!
The majority of scripts is licensed under ASL 2.0 (including codes from Diffusers, cloneofsimo's and LoCon), however portions of the project are available under separate license terms:
Memory Efficient Attention Pytorch: MIT
bitsandbytes: MIT
BLIP: BSD-3-Clause
svd_merge_lora.py
VRAM usage has been reduced. However, main memory usage will increase (32GB is sufficient).svd_merge_lora.py
のVRAM使用量を削減しました。ただし、メインメモリの使用量は増加します(32GBあれば十分です)。Fixed a bug in svd_merge_lora.py
, sdxl_merge_lora.py
, and resize_lora.py
where the hash value of LoRA metadata was not correctly calculated when the save_precision
was different from the precision
used in the calculation. See issue #1722 for details. Thanks to JujoHotaru for raising the issue.
It will be included in the next release.
svd_merge_lora.py
、sdxl_merge_lora.py
、resize_lora.py
で、保存時の精度が計算時の精度と異なる場合、LoRAメタデータのハッシュ値が正しく計算されない不具合を修正しました。詳細は issue #1722 をご覧ください。問題提起していただいた JujoHotaru 氏に感謝します。
以上は次回リリースに含まれます。
sdxl_merge_lora.py
now supports OFT. Thanks to Maru-mee for the PR #1580.
svd_merge_lora.py
now supports LBW. Thanks to terracottahaniwa. See PR #1575 for details.
sdxl_merge_lora.py
also supports LBW.
See LoRA Block Weight by hako-mikan for details on LBW.
These will be included in the next release.
sdxl_merge_lora.py
が OFT をサポートされました。PR #1580 Maru-mee 氏に感謝します。
svd_merge_lora.py
で LBW がサポートされました。PR #1575 terracottahaniwa 氏に感謝します。
sdxl_merge_lora.py
でも LBW がサポートされました。
LBW の詳細は hako-mikan 氏の LoRA Block Weight をご覧ください。
以上は次回リリースに含まれます。
Fixed cache_latents.py
and cache_text_encoder_outputs.py
not working. (Will be included in the next release.)
cache_latents.py
および cache_text_encoder_outputs.py
が動作しなくなっていたのを修正しました。(次回リリースに含まれます。)
The default value of huber_schedule
in Scheduled Huber Loss is changed from exponential
to snr
, which is expected to give better results.
Scheduled Huber Loss の huber_schedule
のデフォルト値を exponential
から、より良い結果が期待できる snr
に変更しました。
imagesize
is newly added, so if you cannot update the libraries immediately, please install with pip install imagesize==1.4.1
separately.bitsandbytes==0.43.0
, prodigyopt==1.0
, lion-pytorch==0.0.6
are included in the requirements.txt.bitsandbytes
no longer requires complex procedures as it now officially supports Windows. .toml
). Thanks to bghira for raising the issue.
--console_log_simple
option in the training script to disable rich logging.train_network.py
and sdxl_train_network.py
are modified to record some dataset settings in the metadata of the trained model (caption_prefix
, caption_suffix
, keep_tokens_separator
, secondary_separator
, enable_wildcard
).train_network.py
and sdxl_train_network.py
. The saving and loading of the state are faster, the file size is smaller, and the memory usage when loading is reduced.--noise_offset_random_strength
and --ip_noise_gamma_random_strength
are added to each training script. These options can be used to vary the noise offset and ip noise gamma in the range of 0 to the specified value. PR #1177 Thanks to KohakuBlueleaf!--save_state_on_train_end
are added to each training script. PR #1168 Thanks to gesen2egee!--sample_every_n_epochs
and --sample_every_n_steps
in each training script now display a warning and ignore them when a number less than or equal to 0
is specified. Thanks to S-Del for raising the issue..toml
file for the dataset config is now read in UTF-8 encoding. PR #1167 Thanks to Horizon1704!secondary_separator
is added to specify the tag separator that is not the target of shuffling or dropping. secondary_separator=";;;"
. When you specify secondary_separator
, the part is not shuffled or dropped. enable_wildcard
is added. When set to true
, the wildcard notation {aaa|bbb|ccc}
can be used. The multi-line caption is also enabled.keep_tokens_separator
is updated to be used twice in the caption. When you specify keep_tokens_separator="|||"
, the part divided by the second |||
is not shuffled or dropped and remains at the end.caption_prefix
and caption_suffix
can be used together. caption_prefix
and caption_suffix
are processed first, and then enable_wildcard
, keep_tokens_separator
, shuffling and dropping, and secondary_separator
are processed in order.tag_image_by_wd14_tagger.py
(--onnx
option only). PR #1192 Thanks to sdbds!
pip install onnx==1.15.0 onnxruntime-gpu==1.17.1
etc. Please also check the comments in requirements.txt
.--repo_id
in tag_image_by_wd14_tagger.py
. This caches multiple repo_id models. Please delete unnecessary files under --model_dir
.tag_image_by_wd14_tagger.py
.
--use_rating_tags
and --use_rating_tags_as_last_tag
--character_tags_first
--character_tag_expand
--always_first_tags
--tag_replacement
--beam_search
and a value of 2 or more for --num_beams
in make_captions.py
.The masked loss is supported in each training script. To enable the masked loss, specify the --masked_loss
option.
The feature is not fully tested, so there may be bugs. If you find any issues, please open an Issue.
ControlNet dataset is used to specify the mask. The mask images should be the RGB images. The pixel value 255 in R channel is treated as the mask (the loss is calculated only for the pixels with the mask), and 0 is treated as the non-mask. The pixel values 0-255 are converted to 0-1 (i.e., the pixel value 128 is treated as the half weight of the loss). See details for the dataset specification in the LLLite documentation.
Scheduled Huber Loss has been introduced to each training scripts. This is a method to improve robustness against outliers or anomalies (data corruption) in the training data.
With the traditional MSE (L2) loss function, the impact of outliers could be significant, potentially leading to a degradation in the quality of generated images. On the other hand, while the Huber loss function can suppress the influence of outliers, it tends to compromise the reproduction of fine details in images.
To address this, the proposed method employs a clever application of the Huber loss function. By scheduling the use of Huber loss in the early stages of training (when noise is high) and MSE in the later stages, it strikes a balance between outlier robustness and fine detail reproduction.
Experimental results have confirmed that this method achieves higher accuracy on data containing outliers compared to pure Huber loss or MSE. The increase in computational cost is minimal.
The newly added arguments loss_type, huber_schedule, and huber_c allow for the selection of the loss function type (Huber, smooth L1, MSE), scheduling method (exponential, constant, SNR), and Huber's parameter. This enables optimization based on the characteristics of the dataset.
See PR #1228 for details.
loss_type
: Specify the loss function type. Choose huber
for Huber loss, smooth_l1
for smooth L1 loss, and l2
for MSE loss. The default is l2
, which is the same as before.huber_schedule
: Specify the scheduling method. Choose exponential
, constant
, or snr
. The default is snr
.huber_c
: Specify the Huber's parameter. The default is 0.1
.Please read Releases for recent updates.
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
オプションを指定し、rich のロギングを無効してお試しください。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 encoding で読み込まれるようになりました。PR #1167 Horizon1704 氏に感謝します。secondary_separator
を追加しました。secondary_separator=";;;"
のように指定します。secondary_separator
で区切ることで、その部分はシャッフル、drop 時にまとめて扱われます。enable_wildcard
を追加しました。true
にするとワイルドカード記法 {aaa|bbb|ccc}
が使えます。また複数行キャプションも有効になります。keep_tokens_separator
をキャプション内に 2 つ使えるようにしました。たとえば keep_tokens_separator="|||"
と指定したとき、1girl, hatsune miku, vocaloid ||| stage, mic ||| best quality, rating: general
とキャプションを指定すると、二番目の |||
で分割された部分はシャッフル、drop されず末尾に残ります。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 氏に感謝します。
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
オプションを指定してください。
機能は完全にテストされていないため、不具合があるかもしれません。その場合は Issue を立てていただけると助かります。
マスクの指定には ControlNet データセットを使用します。マスク画像は RGB 画像である必要があります。R チャンネルのピクセル値 255 がロス計算対象、0 がロス計算対象外になります。0-255 の値は、0-1 の範囲に変換されます(つまりピクセル値 128 の部分はロスの重みが半分になります)。データセットの詳細は LLLite ドキュメント をご覧ください。
各学習スクリプトに、学習データ中の異常値や外れ値(data corruption)への耐性を高めるための手法、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損失、smooth_l1
で smooth L1 損失、l2
で MSE 損失を選択します。デフォルトは l2
で、従来と同様です。huber_schedule
: スケジューリング方法を指定します。exponential
で指数関数的、constant
で一定、snr
で信号対雑音比に基づくスケジューリングを選択します。デフォルトは snr
です。huber_c
: Huber損失のパラメータを指定します。デフォルトは 0.1
です。PR 内でいくつかの比較が共有されています。この機能を試す場合、最初は --loss_type smooth_l1 --huber_schedule snr --huber_c 0.1
などで試してみるとよいかもしれません。
最近の更新情報は Release をご覧ください。
The LoRA supported by train_network.py
has been named to avoid confusion. The documentation has been updated. The following are the names of LoRA types in this repository.
LoRA-LierLa : (LoRA for Li n e a r La yers)
LoRA for Linear layers and Conv2d layers with 1x1 kernel
LoRA-C3Lier : (LoRA for C olutional layers with 3 x3 Kernel and Li n e a r layers)
In addition to 1., LoRA for Conv2d layers with 3x3 kernel
LoRA-LierLa is the default LoRA type for train_network.py
(without conv_dim
network arg).
A prompt file might look like this, for example
# 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
Lines beginning with #
are comments. You can specify options for the generated image with options like --n
after the prompt. The following can be used.
--n
Negative prompt up to the next option.--w
Specifies the width of the generated image.--h
Specifies the height of the generated image.--d
Specifies the seed of the generated image.--l
Specifies the CFG scale of the generated image.--s
Specifies the number of steps in the generation.
The prompt weighting such as ( )
and [ ]
are working.