Prodigy オプティマイザーを利用して過学習直前のLoRAを作成する - Stable Diffusion

Prodigy オプティマイザーを利用して過学習直前のLoRAを作成する手順を紹介します。

概要

こちらの記事では、過学習直前ののLoRAを作成する手順を紹介しました。 最新のProdigyオプティマイザを利用すると、少ない学習回数で収束状態に到達でき、学習率を自動調整するため、 過学習による破綻を防ぐこともできるそうです。
この記事では、Prodigyを利用してLoRAを強めに学習する手順を紹介します。

手順

事前準備

こちらの記事を参照してく、sd-scripts の導入、学習画像の準備をします。

Prodigyのインストール

Prodigyをインストールします。sd-scriptの仮想環境に切り替え後、次のコマンドを実行します。
pip install prodigyopt

ベースモデルの配置

ベースモデルを準備します。今回は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 = "prodigy"
optimizer_args = ["betas=0.9,0.999", "weight_decay=0"]
unet_lr = 1
network_dim = 16
network_alpha = 1
network_args = ["conv_dim=8"]
lr_scheduler="cosine"

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

[training_arguments]
output_dir = "D:\\data\\lora\\test01\\output"
output_name = "eye-small"
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

[dreambooth_arguments]
prior_loss_weight = 1.0

[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

解説

オプティマイザーを Prodigy に設定しています。
optimizer_type = "prodigy"

オプティマイザーのパラメータは以下の値としています。他の成功事例のパラメーターと同じものを利用しています。
optimizer_args = ["betas=0.9,0.999", "weight_decay=0"]

学習率は自動で調整されるため、初期値を"1"としています。
unet_lr = 1

スケジューラーは Cosine を設定しています。こちらも他の成功事例のパラメーターと同じものを利用しています。
lr_scheduler="cosine"

実行結果

sd-scriptsの仮想環境から、exec.batを実行し学習を実行します。


出力された画像を確認します。徐々に学習が進み学習元画像と同じ絵が表示されます。 AdamWの時よりも低いEpoch数で同じ絵が出るようになり、輪郭が溶けるなどの動作もなく、安定して学習元の画像に収束する印象です。 また、さらに学習を続けてもノイズだらけにならずに、学習元画像と同じ絵が出力され続けます。
Epoch10以降であれば、過学習のLoRAとして利用できそうです。


作成したEpoch20のLoRAを顔にのみ適用した結果です。詳細はこちらの記事を参照してください。 AdamWのLoRAより特徴がやや出やすい印象があります。

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