DreamBooth/LoRA のチューナ/マージャの解説です。
関連
- ◯
- 拡散モデルの調整パターン:DreamBooth/LoRA …… このページで使っている用語の説明
- ◯
- プロンプトを与えて画像を生成させる(クラウドのコンテテで):sd-scripts, Ubuntu, Docker, GCP
- ◯
- プロンプトを与えて画像を生成させる(クラウドのコンテテで):Stable-Diffusion-WebUI, Ubuntu, Docker, GCP
チューナ
拡散モデルをDreamBooth/LoRA の手法で調整したい場合、たとえば次のようなツールが使えます:[※1]
- ・
- チューナ(GUI):Dreambooth Extension for Stable-Diffusion-WebUI
- ・
- チューナ(GUI):Stable Tuner
- ・
- チューナ(CLI):sd-scripts
- ※1
- これらはすべて、チェックポイント形式のモデルをあつかえます。
チューナ(GUI):Dreambooth Extension for Stable-Diffusion-WebUI
Stable-Diffusion-WebUIのDreambooth/LoRA 機能拡張です。
学習には、大きく2つの手法があります:
- ◯
- 手法#1:Dreambooth / LoRA
Dreamboothの手法です(LoRAも、ほぼこのやり方になりますーー異なるところは後述しています)。
チェックポイント形式のモデルはそのままでは学習に使えないので、いったんSD形式に変換します:
dreambooth > input > create > source checkpoint: ... # 対象のモデル > [create model]
SD形式のモデルは、次のフォルダに置かれます:
- ・
- stable-diffusion-webui/models/dreambooth
インスタンス・ベースで学習させる場合:[※1]
dreambooth > input > concepts > generate > concept N > directories > dataset directory: ... # 教師用画像群のフォルダ > classification dataset directory: ... # 正則化画像群のフォルダ > filewords > instance token: ... # インスタンストークン > class token: ... # クラストークン > prompts > class prompt: ... # 正則化画像群を生成するためのプロンプト > classification image negative prompt: ... # 正則化画像群を生成するためのネガティブプロンプト > image generation > class images per instance image: ... # 教師用画像1枚当たりの正則化画像の枚数 ... > [train]
キャプション・ベースで学習させる場合:
dreambooth > input > concepts > generate > concept N > directories > dataset directory: ... # 教師用画像群のフォルダ > prompts > instance prompt: [filewords] # 教師用画像群に対するキャプションファイルの適用 ... > [train]
ハイブリッドで学習させる場合:
インスタンス・ベースとキャプション・ベースの混合で、さまざまな考え方があります。
- ◯
- 手法#2:LoRA
DreamBoothの手法で、LoRAネットワークを作ります。
DreamBoothの設定を踏襲しますが、次を有効にします:
dreambooth > input > settings > basic > general > use lora: <yes> # 有効(LoRA)
学習済みのLoRAネットワークは、次のフォルダに置かれます:
- ・
- stable-diffusion-webui/models/lora
LoRAネットワークを対象のモデルに適用し、チェックポイント形式で生成するには、次を実行します:
dreambooth > [generate ckpt]
学習済みのモデルは、次のフォルダに置かれます:
- ・
- stable-diffusion-webui/models/Stable-diffusion
- ◯
- 参照
- ・
- 参照:https://github.com/d8ahazard/sd_dreambooth_extension
- ・
- 参照:https://github.com/d8ahazard/sd_dreambooth_extension/wiki
- ※1
- コンセプトが複数あっても、同じ正則化画像を使うなら、正則化画像の生成は最初のコンセプトのみの設定でかまいません。
チューナ(GUI):Stable Tuner
- ◯
- 参照
- ・
- 参照:https://github.com/devilismyfriend/StableTuner
チューナ(CLI):sd-scripts
コマンドラインから使う、拡散モデルを操作するスクリプト群です。Dreambooth/LoRA チューナをふくみます。
学習には、大きく3つの手法があります:[※1]
- ◯
- 手法#1:Dreambooth / LoRA (Dreambooth)
- ・
- 参照:https://github.com/kohya-ss/sd-scripts/blob/main/train_db_README-ja.md
Dreamboothの手法です(LoRA (Dreambooth) も、ほぼこのやり方になりますーー異なるところは後述しています)。
インスタンス・ベースで学習させる場合:
教師用画像群を、次のように「繰り返し回数・インスタンストークン・クラストークン」で名前づけしたフォルダ群の直下に置きます(複数のフォルダを設置できます。クラスが共通なら、クラストークンは同じになります):
- ・
- REPEATS_INSTANSTOKEN#1 CLASSTOKEN#1
- ・
- REPEATS_INSTANSTOKEN#2 CLASSTOKEN#2
- ・
- ...
正則化画像群を、次のように「繰り返し回数・クラストークン」で名前づけしたフォルダ群の直下に置きます(複数のファルダを設置できます):
- ・
- REPEATS_CLASSTOKEN#1
- ・
- REPEATS_CLASSTOKEN#2
- ・
- ...
学習は、次のように設定〜実行します:
accelerate launch ... train_db.py \ --pretrained_model_name_or_path=... \ # 対象のモデル --train_data_dir=... \ # 教師用画像群のフォルダ(複数のインスタンスのフォルダの、直上のフォルダを指定します) --reg_data_dir=... \ # 正則化画像群のフォルダ(複数のクラスのフォルダの、直上のフォルダを指定します) --output_dir=... \ # 学習させたモデルを生成するフォルダ ...
キャプション・ベースで学習させる場合:
教師用画像群を、次のように「繰り返し回数・インスタンストークン」で名前づけしたフォルダ群の直下に置きます(複数のフォルダを設置できます):
- ・
- REPEATS_INSTANSTOKEN#1
- ・
- REPEATS_INSTANSTOKEN#2
- ・
- ...
それぞれの教師用画像群に対して、キャプション(タグ群)を書いたテキストファイル群を用意します(自動生成もできますが、いずれにしてもこれは必須です):
- ・
- IMAGE.png
- ・
- IMAGE.txt
学習は、次のように設定〜実行します:
accelerate launch ... train_db.py \ --pretrained_model_name_or_path=... \ # 対象のモデル --train_data_dir=... \ # 教師用画像群のフォルダ(複数のインスタンスのフォルダの、直上のフォルダを指定します) --output_dir=... \ # 学習させたモデルを生成するフォルダ ...
教師用画像に対応するテキストファイルがある場合、フォルダ名に指定したインスタンストークンは使われませんーー代わりに、テキストファイルに書かれたタグ群が学習に使われるようになります。またクラスを指定しない(通常、正則化画像も使わない)ので、対象のモデルそのものの重みに対する学習になります。[※2][※3]
ハイブリッドで学習させる場合:
インスタンス・ベースとキャプション・ベースの混合で、さまざまな考え方があります。
- ◯
- 手法#2:LoRA (DreamBooth)
- ・
- 参照:https://github.com/kohya-ss/sd-scripts/blob/main/train_network_README-ja.md
- ・
- 参照:https://github.com/kohya-ss/sd-scripts/blob/main/train_db_README-ja.md
DreamBoothの手法で、LoRAネットワークを作ります。
DreamBoothの設定を踏襲しますが、スクリプトをLoRAをあつかうものに変えます。また、LoRAネットワークの雛形を指定します:
accelerate launch ... train_network.py \ --network_module=networks.lora ...
生成したLoRAネットワークをモデルに追加するには、次を実行します:
python3 networks/merge_lora.py \ --sd_model ... \ # 対象モデルのパス --save_to ... \ # マージしたモデルのパス --models ... \ # 適用するLoRAネットワーク --ratios ... # 適用するLoRAネットワークに対する重み(範囲:0.0 - 1.0 )
- ◯
- 手法#3:LoRA (Hypernetworks)
- ・
- 参照:https://github.com/kohya-ss/sd-scripts/blob/main/train_network_README-ja.md
- ・
- 参照:https://github.com/kohya-ss/sd-scripts/blob/main/fine_tune_README_ja.md
Hypernetworks の手法で、LoRAネットワークを作ります。
- ◯
- 参照
- ・
- 参照:https://github.com/kohya-ss/sd-scripts
- ※2
- このやり方で生成したLoRAネットワークを利用する場合、(インスタンストークンをプロンプトに使うのではなく)そのLoRAネットワークをモデルに追加(マージ)しますーーこのような手法は、LoRAネットワークを別のモデルとリアルタイムに調合できるツールの登場で、可能になったといえます。
- ※3
- とくに4chan では、次のツール(sd-scriptsのラッパ)を使って、キャプション・ベースのLoRAネットワークがよく作られています:
- ・
- 参照:https://rentry.org/lora_train
- ・
- 参照:https://github.com/derrian-distro/LoRA_Easy_Training_Scripts
マージャ
作成したLoRAネットワークは、次のツールを使うことで、既存の拡散モデルにリアルタイムに追加(マージ)し、描画の状態をすばやく確認することができます:
- ・
- マージャ(GUI):Additional Networks for generating images
- ・
- マージャ(GUI):Stable-Diffusion-WebUI
マージャ(GUI):Additional Networks for generating images
sd-scriptsで生成したLoRAネットワークを、マージするツールです。
- ◯
- 利用
次からLoRAネットワークを置くフォルダを指定し:
settings > additional networks > extra path to scan for lora models: ...
次から利用します(複数のLoRAネットワークを、重みを変えて適用することができます)。
txt2img | img2img > additional networks > network module N / model N / weight N
- ◯
- 参照
- ・
- 参照:https://github.com/kohya-ss/sd-webui-additional-networks
マージャ(GUI):Stable-Diffusion-WebUI
Stable-Diffusion-WebUIが、標準でLoRAネットワークのリアルタイムマージに対応しました(2023.01.22)。[※1]
- ◯
- 利用
次のフォルダに置いた、複数のLoRAネットワークを:
- ・
- stable-diffusion-webui/models/lora
次から選択〜利用できます:
txt2img | img2img > show extra networks > lora
表示されたLoRAネットワークのどれかを選択することで、プロンプト欄に、プレースホルダトークンが挿入されます:
<lora:NAME:WEIGHT>
このトークンで、適用するウェイトを変えることができます。不要なら削除し、必要になったら手書きで追記もできます。
- ◯
- 参照
- ・
- 参照:https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki
- ※1
- sd-scripts版LoRAとの完全な互換性については、まだ微妙なようですが……