過学習直前のLoRAを作成する - Stable Diffusion

過学習直前のLoRAを作成する手順を紹介します。

概要

過学習直前のLoRAを作成します。 2つのLoRAの差分を作成して差分を適用するLoRAを作成する用途や 過学習直前のLoRAを利用して絵柄の固定をする用途があります。

この記事ではSDXLでの実施例を紹介します。

手順

sd-scriptsのインストール

sd-scriptsをインストールします。インストール手順はこちらの記事を参照してください。

画像の準備

今回はこちらの画像を利用します。(img.png)

画像のタグ

今回はこちらのタグを利用します。画像と同じ位置にテキストファイルを配置します。
img.txt
girl, face, face close up

ベースモデルの配置

ベースモデルを準備します。今回はSDXLのモデル sd_xl_base_1.0_0.9vae.safetensors を利用します。

設定ファイルの作成

sd-scriptsの設定ファイルを作成します。
config.toml
[model_arguments]
pretrained_model_name_or_path = "D:\\data\\model\\sd_xl_base_1.0_0.9vae.safetensors"

[additional_network_arguments]
network_train_unet_only = true
cache_text_encoder_outputs = true
network_module = "networks.lora"

[optimizer_arguments]
optimizer_type = "adamw8bit"
unet_lr = 1e-3
network_dim = 16
network_alpha = 1
network_args = ["conv_dim=8"]

[dataset_arguments]
dataset_config = "D:\\data\\lora\\test01\\dataset.toml"
cache_latents = true

[training_arguments]
output_dir = "D:\\data\\lora\\test01\\output"
output_name = "test01"
save_every_n_epochs = 1
save_model_as = "safetensors"
max_train_steps = 400
xformers = true
mixed_precision= "bf16"
save_precision = "bf16"
gradient_checkpointing = true
persistent_data_loader_workers = true

[sample_arguments]
sample_every_n_epochs = 2
sample_sampler = "k_euler_a"
sample_prompts = "D:\\data\\lora\\test01\\prompts.txt"
dataset.toml
[general]
enable_bucket = true 

[[datasets]]
resolution = 1024
batch_size = 12

[[datasets.subsets]]
image_dir = 'D:\data\lora\test01\image'
caption_extension = '.txt'
num_repeats = 192
prompts.txt
girl, face, face close up --w 1024 --h 1024 --d 10000
girl, face, face close up --w 1024 --h 1024 --d 20000
exec.bat
accelerate launch --num_cpu_threads_per_process 1 sdxl_train_network.py --config_file=D:\data\lora\test01\config.toml

ファイル配置

exec.bat, config.toml, dataset.toml, prompts.txt を同じディレクトリに配置し、image ディレクトリ内に画像とタグのテキストファイルを配置します。


解説

network_train_unet_only = true によりunetのみの学習としています。
学習結果は1Epochごとの出力とし、2Epochごとに画像を生成して結果が確認できる設定としています。
学習率は"1e-3"としています。この値は参考URLで紹介されているうまく動作した値になります。通常のLoRA学習より大きい値となっています。
バッチサイズ12で画像の繰り返し数は192としています。

実行結果

出力された画像を確認します。徐々に学習が進み学習元画像と同じ絵が表示されます。 学習が進むと徐々に色が落ちたり、輪郭が溶けたりします。さらに学習を続けると、突然ノイズだらけになります。
Epoch16~18あたりが過学習のLoRAとして利用できそうです。

メモ:学習の進みが遅い場合
学習の進みが遅い場合は、unet_lr = 1e-3 の値を確認するとともに、num_repeats = 192 の値を確認します。 num_repeatsは正則化画像が無い場合は"1"でよいとされていますが、今回の学習では画像が1枚しかないため、num_repeatsが1の場合、 学習が進みにくい状態になります。num_repeatsの値が大きくなっているかを確認します。
メモ:処理速度が遅い場合
GPUのVRAMからあふれてしまうと、計算速度が極端に遅くなります。バッチサイズの値を小さくして(batch_size = 12を8や4に変更する)VRAMの使用量を減らす設定にします。

参考

著者
iPentecのメインデザイナー
Webページ、Webクリエイティブのデザインを担当。PhotoshopやIllustratorの作業もする。
掲載日: 2024-01-01
iPentec all rights reserverd.