sd-scriptsの使い方|インストールからLoRA学習(SD1.5/SDXL)まで

sd-scriptsはコマンドでLoRA学習などが行えるスクリプト集です。

この記事では、インストールからSD1.5・SDXLのLoRAを学習する方法について紹介します。

この記事で分かること
  • sd-scriptsのインストール手順(Windows・PyTorch・accelerate設定)
  • SD1.5でLoRAを学習して動かすまでの一連の流れ
  • SDXL(Pony/Illustrious含む)で学習するときの差分

sd-scriptsとは?

sd-scriptsは、Stable Diffusion系モデルのLoRA学習やfine-tuning、画像生成をコマンドラインから行えるスクリプト集です。

コマンド操作なので慣れないと最初は難しく感じますが、GUIを挟まないぶん軽くて、オプションも自由に設定できます。

執筆時点でSD1.5からSDXL、FLUX、Animaまで対応しており、同じリポジトリで複数モデルの学習が可能です。

主な特徴

  • コマンドラインでLoRA学習・fine-tuning・画像生成ができる
  • SD1.5 / SDXL / SD3 / FLUX / Anima など幅広いモデルに対応
  • GUIを挟まないぶんVRAM消費が少なめ
  • 学習率やキャッシュなど細かいオプションを自分で指定できる
  • 8GB VRAMでもSD1.5のLoRAならぎりぎり動く
GitHub – kohya-ss/sd-scripts
Contribute to kohya-ss/sd-scripts development by creating an account on GitHub.

必要なもの・動作環境

学習にはNVIDIAのGPUが要ります。

VRAMはSD1.5なら約8GB、SDXLは約12GBあたりが目安になっています。

その他以下のインストールが必要です。

  • Python 3.10.x(3.11/3.12でも動くみたいですが、公式は3.10.xを推奨)
  • Git
  • NVIDIA GPU+CUDAが動く環境

PythonとGitはそれぞれ公式サイトから入れておいてください。

sd-scriptsのインストール

この記事ではWindowsのPowerShellで進めます。

まずPowerShellでvenv(仮想環境)を使えるようにするため、管理者権限のPowerShellで一度だけ実行ポリシーを変更しておきます。

Set-ExecutionPolicy Unrestricted

「Y」と答えたら、管理者のPowerShellは閉じてください。

ここからは通常の(管理者でない)PowerShellで作業します。

次に任意の場所にリポジトリをクローンして、仮想環境を作ります。

git clone https://github.com/kohya-ss/sd-scripts.git
cd sd-scripts

python -m venv venv
.\venv\Scripts\activate

続いてPyTorchと依存ライブラリを入れます。

下はCUDA 12.4版の例です。

pip install torch==2.6.0 torchvision==0.21.0 --index-url https://download.pytorch.org/whl/cu124
pip install --upgrade -r requirements.txt

RTX 50シリーズを使う場合は、PyTorch 2.8.0+CUDA 12.8/12.9の組み合わせを使うようです。

その場合は最初の行を、torch 2.8.0のcu128版に置き換えてください。

最後にaccelerateの設定をします。

accelerate config

質問には次のように答えればOKです。

- This machine
- No distributed training
- NO
- NO
- NO
- all
- NO
- fp16

bf16対応のGPU(RTX 30/40/50系など)なら、最後の質問はbf16でも問題ありません。

もし fp16 mixed precision requires a GPU というエラーが出たら、6番目の質問(使うGPUのid)に「0」と答えると通ることがあります。

これでインストールは完了です。

学習データ(データセット)を用意する

画像の用意

学習に使用する画像をご自身で用意してください。

キャラや絵柄なら、だいたい20〜40枚くらいあれば形になるそうです。

任意のフォルダにまとめておいてください。

(例:C:\lora\train\my_char)。

とりあえず試したい方は以下のリンクでずんだもんなどの学習用データがダウンロードできます。

この記事でもこちらをお借りして進めます。

ずんずんPJイラスト/3Dデータ

タグ(キャプション)付けのやり方

学習用データのtxtを使う場合はここは飛ばしても大丈夫です。

自分でタグ付けをやる場合の操作になります。

sd-scriptsでやる場合は、別途onnxのインストールが必要です。

.\venv\Scripts\activate
pip install onnx onnxruntime-gpu

GPUを使わない場合は、onnxruntime-gpuの代わりにonnxruntimeを入れてください。

あとはsd-scriptsのフォルダで、学習画像のフォルダを指定して実行します。

python finetune/tag_images_by_wd14_tagger.py C:\lora\train\my_char --onnx --batch_size 4 --remove_underscore --always_first_tags zdm

–always_first_tagsはtxtの先頭にトリガーワードを入れたい場合のオプションです。

また既定のタガーはv2ですが、–repo_idを付ければv3系のモデルも使えます。

python finetune/tag_images_by_wd14_tagger.py C:\lora\train\my_char --onnx --batch_size 4 --remove_underscore --repo_id SmilingWolf/wd-swinv2-tagger-v3

wd-swinv2-tagger-v3のほかに、wd-vit-tagger-v3やwd-convnext-tagger-v3、wd-eva02-large-tagger-v3なども指定可能です。

終わると、画像と同じ名前の.txtファイルが同じフォルダにできます。

中身はこんな感じのカンマ区切りのタグです。

zdm, 1girl, solo, long hair, blue eyes, school uniform, smile

他にも以下のようなオプションが使えます。

  • –thresh:タグを付ける確信度のしきい値。既定は0.35で、上げるとタグが減る
  • –general_threshold / –character_threshold:一般タグとキャラタグでしきい値を分ける
  • –remove_underscore:long_hairのようなアンダースコアをスペースに変える
  • –undesired_tags:付けたくないタグをカンマ区切りで除外する
  • –always_first_tags:必ず先頭に置きたいタグを指定する
  • –append_tags:上書きではなく追記する
  • –recursive:サブフォルダの画像も対象にする
  • –repo_id:別のタガーモデルを指定する

もしコマンドじゃなくて自分で事前に用意したいという方は、TAGGUIなどを使うと便利です。

tagguiの使い方|LoRA学習のキャプション作成・タグ付けを簡単に
画像のキャプションデータを簡単に作成・編集できるツール「taggui」の使い方を解説します。exeで起動でき、複数のAIモデルで自動タグ付けが可能。LoRA学習用のデータセット作りにも使えます。

設定ファイルの作成

用意できたら、データセットの設定ファイルをtoml形式で作ります。

txtファイルに書いて拡張子をtomlに変えればOKです。

・最小例

[general]
enable_bucket = true

[[datasets]]
resolution = 512
batch_size = 2

  [[datasets.subsets]]
  image_dir = 'C:\lora\train\my_char'
  num_repeats = 10
  caption_extension = '.txt'

書き換えるのは基本ここだけです。

  • resolution:学習解像度。SD1.5は512が基本
  • batch_size:一度に学習する枚数。VRAMが少なければ1に下げる
  • image_dir:学習画像を入れたフォルダ
  • num_repeats:画像の繰り返し回数

SD1.5でLoRAを学習する

データセットが用意できたら、train_network.py で学習します。

LoRAを学習するときは、network_module に networks.lora を指定します。

・SD1.5の最小構成のコマンド例(powershell用)

accelerate launch --num_cpu_threads_per_process 1 train_network.py `
 --pretrained_model_name_or_path="<SD1.5のモデル.safetensors>" `
 --dataset_config="E:\Dataset\my_SD15_dataset.toml" `
 --output_dir="C:\lora\output" `
 --output_name=my_lora `
 --save_model_as=safetensors `
 --network_module=networks.lora `
 --network_dim=16 `
 --network_alpha=16 `
 --learning_rate=1e-4 `
 --optimizer_type=AdamW8bit `
 --max_train_epochs=10 `
 --mixed_precision=fp16 `
 --cache_latents `
 --gradient_checkpointing `
 --save_every_n_epochs=1 `
 --sdpa

・設定が必要な部分

  • –pretrained_model_name_or_path:SD1.5のモデルがあるパス
  • –dataset_config=上記で作ったtomlファイルのパス
  • –output_dir=C:\lora\output
  • –output_name:LoRAの保存名

パスはスペースがなければ、ダブルクォーテーションは不要です。

ただスペースがある場合は囲まないとエラーになるので付けといた方が安全だと思います。

その他オプションで以下も調整ができます。

  • network_dim:LoRAのランク。大きいほど表現力は増えるが、メモリと時間も増える。まずは16前後
  • network_alpha:安定して学習するための値。とりあえずdimと同じでよい
  • learning_rate:学習率。LoRAは1e-4〜1e-3くらいが目安
  • max_train_epochs:何周学習するか。多すぎると過学習になりやすい
  • save_every_n_epochs:何エポックごとに保存するか。途中経過を比べたいとき便利

実行すると、学習が始まり、終わると指定したoutput_dirにsafetensors形式のLoRAファイルが保存されていきます。

600stepで約15分くらいでした。

sd-scriptsでLoRA学習が進行しているコマンドラインのログ

もしVRAMが足りずに落ちる場合は、batch_sizeやnetwork_dimを下げたりしてみてください。

作ったLoRAを試す

学習が終わったら、出力されたsafetensorsを実際に使ってみます。

SDWebUIなどでLoRAタブから作ったLoRAを選び、トリガーワードを入力してください。

SD WebUIのLoRAタブから学習したLoRAを選ぶ画面

もし再現の弱い部分があれば、別途指定してください。

これでLoRAを反映して生成ができます。

counterfeitV30_v30.safetensorsで生成

counterfeitV30に学習したSD1.5のLoRAを適用して生成した画像

もしここでLoRAの再現性がイマイチだった場合は、ステップ数増やしたり、学習設定変えたり試行錯誤してみてください。

SDXL(Pony/Illustrious含む)で学習する場合

SDXLでも流れはSD1.5とほぼ同じです。

PonyやIllustriousもSDXL派生なので、ベースモデルを差し替えるだけで同じ手順で学習できます。

SD1.5との違いは、以下の通りです。

  • 使うスクリプトが sdxl_train_network.py になる
  • 学習解像度は1024が基本(tomlのresolutionを1024に)
  • VRAMを多く使うので、12GBくらい必要

・コマンド例

accelerate launch --num_cpu_threads_per_process 1 sdxl_train_network.py `
 --pretrained_model_name_or_path="<SDXL/Pony/Illustriousのモデル.safetensors>" `
 --dataset_config="E:\Dataset\my_SDXL_dataset.toml" `
 --output_dir="C:\lora\output" `
 --output_name=my_sdxl_lora `
 --save_model_as=safetensors `
 --network_module=networks.lora `
 --network_dim=32 `
 --network_alpha=16 `
 --learning_rate=1e-4 `
 --unet_lr=1e-4 `
 --text_encoder_lr 1e-5 1e-5 `
 --optimizer_type=AdamW8bit `
 --max_train_epochs=10 `
 --mixed_precision=bf16 `
 --gradient_checkpointing `
 --cache_latents `
 --save_every_n_epochs=1 `
 --sdpa

SDXLだとこんな感じでした。

animagineXLV31_v31.safetensorsで生成

animagine XL V3.1に学習したSDXLのLoRAを適用して生成した画像

うまくいかないときは

よくある詰まりどころをいくつか挙げておきます。

  • CUDA out of memory:VRAM不足。batch_sizeを1に、network_dimを下げる、gradient_checkpointingやcache_latentsを付けると通りやすい
  • fp16 mixed precision requires a GPU:accelerate configをやり直し、GPUのidに「0」を指定する
  • venvがactivateできない:管理者PowerShellで Set-ExecutionPolicy Unrestricted を実行し直す
  • pythonコマンドが反応しない:python を py に置き換える(py -m venv venv など)

AIエージェント使える方はrepoごと読んでもらって、〇〇したいとか伝えながらコマンド出してもらった方が楽かもしれません。

以上、sd-scriptsの使い方を紹介しました。

参考になれば幸いです。

タイトルとURLをコピーしました