過学習直前のLoRAを作成する - Stable Diffusion
過学習直前のLoRAを作成する手順を紹介します。
概要
過学習直前のLoRAを作成します。
2つのLoRAの差分を作成して
差分を適用するLoRAを作成する用途や
過学習直前のLoRAを利用して
絵柄の固定をする用途があります。
この記事ではSDXLでの実施例を紹介します。
手順
sd-scriptsのインストール
sd-scriptsをインストールします。インストール手順は
こちらの記事を参照してください。
画像の準備
今回はこちらの画像を利用します。(img.png)
画像のタグ
今回はこちらのタグを利用します。画像と同じ位置にテキストファイルを配置します。
girl, face, face close up
ベースモデルの配置
ベースモデルを準備します。今回はSDXLのモデル sd_xl_base_1.0_0.9vae.safetensors を利用します。
設定ファイルの作成
sd-scriptsの設定ファイルを作成します。
[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"
[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
girl, face, face close up --w 1024 --h 1024 --d 10000
girl, face, face close up --w 1024 --h 1024 --d 20000
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の作業もする。