ジャコ Lab

プログラミング関連のメモ帳的ブログです

kohya-ss/sd-scripts に使うコマンドライン引数について

zako-lab929.hatenablog.com

上記では、 データセット設定ファイル(.toml) の設定についてまとめましたが、
この記事では コマンドライン引数 についてまとめます。

README に記載のあるオプションを書き出すことで、全体像を把握します。

オプション

github.com

github.com

学習に使うモデル指定

オプション名
--v2
--v_parameterization
--v2 / --v_parameterization
  • 学習対象モデルとして Stable Diffusion 2.0 系を使用する場合に指定する
らしい...
--pretrained_model_name_or_path
  • 追加学習を行う元となるモデルを指定する
これは先日の学習でも意識していたものなので理解した!
なお、Hugging Face のモデルIDも指定できる模様

学習に関する設定

オプション名
--output_dir
--output_name
--dataset_config
--max_train_steps
--max_train_epochs
--mixed_precision
--gradient_checkpointing
--xformers
--mem_eff_attn
--clip_skip
--max_token_length
--weighted_captions
--persistent_data_loader_workers
--max_data_loader_n_workers
--logging_dir
--log_prefix
--log_with
--log_tracker_name
--noise_offset
--adaptive_noise_scale (実験的オプション)
--multires_noise_iterations
--multires_noise_discount
--debug_dataset
--vae
--cache_latents
--cache_latents_to_disk
--min_snr_gamma
--output_dir
これも先日の学習で意識していたものなので理解した!
--output_name
  • 保存されるファイル名を拡張子を除いて指定する
これも先日の学習で意識していたものなので理解した!
--dataset_config
  • 設定ファイル(.toml)を指定する
これも先日の学習で意識していたものなので理解した!
--max_train_steps / --max_train_epochs
  • 学習する ステップ数エポック数 を指定する
  • 両方していすると エポック数 が優先される
--mixed_precision
  • 省メモリ化のため mixed precision (混合精度) で学習する
    • --mixed_precision="fp16" のように指定する
--gradient_checkpointing
  • 学習時の重みの計算をまとめて行うのではなく少しずつ行うことで学習に必要な GPU メモリ量を減らす
これも省メモリ化オプションってことだな?
--xformers / --mem_eff_attn
  • --xformers オプションを指定すると xformersCrossAttention を使用する
  • 代わりに --mem-eff-attn を指定すると 省メモリ版CrossAttention を使用する
--clip_skip
  • 2 を指定すると Text Encoder (CLIP) の後ろから二番目の層の出力を使用する
    • 1 またはオプション省略時は最後の層を使用する
よくわかってないけどみんな clip_skip は 2 なんだよなぁ
--max_token_length
  • デフォルトは 75
  • 150 また 225 を指定することでトークン長を拡張して学習できる
  • 必要なければ 75 での学習がおすすめとのこと
--weighted_captions
  • 指定すると 重み付きキャプション が有効になるとのこと
--persistent_data_loader_workers
  • 指定すると Windows 環境でのエポック間待ち時間が短縮されるとのこと
--max_data_loader_n_workers
  • データ読み込みのプロセス数を指定する
  • プロセス数が多いとデータ読み込みが早くなり GPU を効率的に利用できる
    • 但し、メインメモリを消費する
  • デフォルト は「8 または CPU同時実行スレッド数-1 の小さい方」
--logging_dir / --log_prefix
  • ログ保存先のディレクトリを指定する
    • TensorBoard 形式のログが保存されるとのこと
tensorboard とやらは pip module っぽい
--log_with / --log_tracker_name
  • tensorboard だけでなく wandb への保存が可能らしい
  • 詳細は PR#428 を見ろとのこと
--noise_offset
  • この記事 の実装とのこと
  • 全体的に暗い、明るい画像の生成結果が良くなる可能性があるとのこと
  • LoRA 学習でも有効で 0.1 程度の値を指定すると良いらしい
README 的にも推量の表現だったなぁ
--adaptive_noise_scale (実験的オプション)
  • --noise_offset の値を自動調整するオプションらしい
    • latents の各チャネルの平均値の絶対値に応じて変化するらしい
--multires_noise_iterations / --multires_noise_discount
  • Multi resolution noise (pyramid noise) の設定
  • 詳細は PR#471 を見ろとのこと
--debug_dataset
  • 指定すると学習を行う前に事前にどのような画像データ、キャプションで学習されるかを確認できるとのこと
    • ECSキーで終了、Sキーで次のステップ(バッチ)、Eキーで次のエポックに進む
--vae
  • VAE を指定すると、その VAE を使って学習するとのこと
  • DreamBooth 及び Fine-tuning では、保存されるモデルはこの VAE を組み込んだものになる
--cache_latents / --cache_latents_to_disk
  • 使用 VRAM を減らすために VAE の出力をメインメモリにキャッシュする
  • flip_aug 以外の augmentation は使えなくなる
  • --cache_latents_to_disk を指定するとキャッシュをディスクに保存するようになる
--min_snr_gamma
  • Min-SNR Weighting strategy を指定する
  • 詳細は PR#308 を見ろとのこと

モデルの保存に関する設定

オプション名
--save_precision
--save_every_n_epochs
--save_state
--resume
--save_every_n_steps
--save_model_as
--huggingface_repo_id
--save_precision
  • 保存時のデータ精度を指定する
--save_every_n_epochs / --save_state / --resume
  • --save_every_n_epochs を使用すると、そのエポック毎に学習途中のモデルを保存する
  • --save_state を同時に指定すると optimizer 等の状態も含めた学習状態を併せて保存する
  • 保存された学習状態から学習を再開する場合には --resume を使う
--save_every_n_steps
  • --save_every_n_epochs のステップ版ぽい
--save_model_as
  • モデルの保存形式を以下から選べる
    • ckpt
    • safetensors
    • diffusers
    • diffusers_safetensors
--huggingface_repo_id
  • --huggingface_repo_id が指定されているとモデル保存時に同時に HuggingFace にアップロードされる
    • アクセストークンの取り扱いに注意

オプティマイザ関係

オプション名
--optimizer_type
--learning_rate
--lr_scheduler
--lr_warmup_steps
--lr_scheduler_num_cycles
--lr_scheduler_power
--optimizer_type
  • オプティマイザの種類を以下の中から指定できる
    • AdamW : torch.optim.AdamW
      • 過去のバージョンのオプション未指定時と同じ
    • AdamW8bit : 引数は同上
    • PagedAdamW8bit : 引数は同上
      • 過去のバージョンの--use_8bit_adam指定時と同じ
    • Lion : https://github.com/lucidrains/lion-pytorch
      • 過去のバージョンの--use_lion_optimizer指定時と同じ
    • Lion8bit : 引数は同上
    • PagedLion8bit : 引数は同上
    • SGDNesterov : torch.optim.SGD, nesterov=True
    • SGDNesterov8bit : 引数は同上
    • DAdaptation(DAdaptAdamPreprint) : https://github.com/facebookresearch/dadaptation
    • DAdaptAdam : 引数は同上
    • DAdaptAdaGrad : 引数は同上
    • DAdaptAdan : 引数は同上
    • DAdaptAdanIP : 引数は同上
    • DAdaptLion : 引数は同上
    • DAdaptSGD : 引数は同上
    • Prodigy : https://github.com/konstmish/prodigy
    • AdaFactor : Transformers AdaFactor
    • 任意のオプティマイザ
--learning_rate
  • 学習率を指定する
  • 適切な学習率はスクリプトによって異なる
LoRA 学習では1e-41e-3が良いとされていた
--lr_scheduler / --lr_warmup_steps / --lr_scheduler_num_cycles / --lr_scheduler_power
  • 学習率のスケジューラ関連の設定
  • --lr_scheduler で学習率のスケジューラを以下から指定できる (デフォルト:constant)
    • linear
    • cosine
    • cosine_with_restarts
    • polynomial
    • constant
    • constant_with_warmup
    • 任意のスケジューラ
  • --lr_warmup_steps でスケジューラのウォームアップステップ数を指定できる
    • ウォームアップ:だんだん学習率を変えていく
  • --lr_scheduler_num_cyclescosine_with_restarts スケジューラでのリスタート回数
  • --lr_scheduler_powerpolynomial スケジューラでの polynomial power

その他 LoRA 学習ページに記載のあったオプション

オプション名 備考
--network_dim
--network_alpha
--persistent_data_loader_workers 「学習に関する設定」 の項で記載有り
--max_data_loader_n_workers 「学習に関する設定」 の項で記載有り
--network_weights
--network_train_unet_only
--network_train_text_encoder_only
--unet_lr
--text_encoder_lr
--network_args
--network_dim
  • LoRA の RANK を指定する
  • デフォルトは 4
  • 数値が高いほど表現力が増すが、学習に必要なリソースは増える
  • 闇雲に増えやしても良くないらしい
--network_alpha
  • アンダーフローを防ぎ安定して学習するための alpha 値とやらを指定する
  • デフォルトは 1
  • --network_dim と同じ値を指定すると過去の学習方式と同じ動作になるらしい
--network_weights
  • 学習前に学習済みの LoRA の重みを読み込み、そこから追加で学習する
指定例がないからわからないけどベースモデルの他にベースLoRA的なものを指定できるとか?
--network_train_unet_only
  • U-Net に関連する LoRA モジュールのみ有効とする
--network_train_text_encoder_only
  • Text Encoder に関連する LoRA モジュールのみ有効とする
--unet_lr
  • U-Net に関連する LoRA モジュールに、通常の学習率(--learning_rate)とは異なる学習率を使う時に指定する
--text_encoder_lr
  • Text Encoder に関連する LoRA モジュールに、通常の学習率(--learning_rate)とは異なる学習率を使う時に指定する
--network_args
  • 複数の引数を指定できる
  • --network_args "key1=value1" "key2=value2" みたいな感じで指定できるみたい

まとめ

初心者は使わなそうなオプションがいっぱいだ!
という感想でした