Training LoRA
install sd-webui-additional-networks
bmaltais/kohya_ss
>This repository provides a Windows-focused Gradio GUI for Kohya's Stable Diffusion trainers. The GUI allows you to set the training parameters and generate and run the required CLI commands to train the model.
とりあえずGUIなしでやる
prepare
acccelarate config
accelerate configuration saved at C:\Users\YOU/.cache\huggingface\accelerate\default_config.yaml
everytime
$ .\venv\Scripts\activate
Step1. 教師データの用意
>学習させたい画像データを用意し、任意のフォルダに入れてください。リサイズ等の事前の準備は必要ありません。 ただし学習解像度よりもサイズが小さい画像については、超解像などで品質を保ったまま拡大しておくことをお勧めします。
video:10:00
directory
sd-scripts
train_data //images
finetune //python scripts
Step2. 自動キャプショニング
>キャプションを使わずタグだけで学習する場合はスキップしてください。
video:34:00
$ python finetune\make_captions.py --batch_size 8 ..\train_data
Step3. タグ付け
>danbooruタグのタグ付け自体を行わない場合は「キャプションとタグ情報の前処理」に進んでください。
Do this inside AUTOMATIC1111
directory
\stable-diffusion-webui-docker\data\tiggging-it //images
execute
hint: Add Additional tag
.txt will appear in the data directory
Step4 キャプションとタグ情報の前処理
>スクリプトから処理しやすいようにキャプションとタグをメタデータとしてひとつのファイルにまとめます。
caption
move .\stable-diffusion-webui-docker\data\tiggging-it\*txt to sd-scripts\train_data
$ python .\finetune\merge_captions_to_metadata.py .\train_data\ meta_cap.json
All captions will be merged
if there is not meta_cap.json, it will be created.
meta_cap.json{
"image1" : {
"caption": "a girl in black hole"
},
"image2": {
"caption": "anime girl with cats"
}
}
tag
$ cd sd-scritpts
$ python .\finetune\merge_dd_tags_to_metadata.py .\train_data --in_json meta_cap.json meta_cap_dd.json
meta_cap_dd.json{
"image1" : {
"caption": "a girl in black hole",
"tags": "1girl, open mouth"
},
"image2": {
"caption": "anime girl with cats",
"tags": "1girl, solo, balck hair"
}
}
cleaning
>ここまででメタデータファイルにキャプションと...タグがまとめられています。
>ただ自動キャプショニングにしたキャプションは表記ゆれなどがあり微妙(※)ですし、
>※たとえばアニメ絵の少女を学習する場合、キャプションにはgirl/girls/woman/womenなどのばらつきがあります。また「anime girl」なども単に「girl」としたほうが適切かもしれません。
>タグにはアンダースコアが含まれていたりratingが付いていたりしますので(DeepDanbooruの場合)、エディタの置換機能などを用いてキャプションとタグのクリーニングをしたほうがいいでしょう。
$ python .\finetune\clean_captions_and_tags.py meta_cap_dd.json meta_clean.json
white shirtとshirtみたいな重複タグの削除
woman, female, lady, person ...-> girl
Step5. latentsの事前取得
>学習を高速に進めるためあらかじめ画像の潜在表現を取得しディスクに保存しておきます。あわせてbucketing(教師データをアスペクト比に応じて分類する)を行います。
$ python .\finetune\prepare_buckets_latents.py train_data meta_clean.json meta_lat.json model.ckpt --batch_size 4 --max_resolution 512,512 --mixed_precision no
powershellfound 19 images.
loading existing metadata: meta_clean.json
load VAE: vae-model.ckpt
100%|████████████████████████████████████████████████████████████████████| 19/19 [00:03<00:00, 5.24it/s]
bucket 0 (320, 704): 2
bucket 1 (320, 768): 1
bucket 2 (384, 640): 4
bucket 3 (448, 576): 6
bucket 4 (512, 512): 2
bucket 5 (576, 448): 3
bucket 6 (640, 384): 1
mean ar error: 0.054515281612950744
writing metadata: meta_lat.json
done!
>教師データフォルダにnumpyのnpz形式でlatentsが保存されます。
train_data folder
on RTX3090
batch 8 / 512x768 OK
Step6. 学習の実行
powershellaccelerate launch --num_cpu_threads_per_process 1 fine_tune.py
--pretrained_model_name_or_path=model.ckpt
--in_json meta_lat.json
--train_data_dir=train_data
--output_dir=fine_tuned
--shuffle_caption
--train_batch_size=1 --learning_rate=5e-6 --max_train_steps=10000
--use_8bit_adam --xformers --gradient_checkpointing
--mixed_precision=bf16
--save_every_n_epochs=4
powershellrunning training / 学習開始
num examples / サンプル数: 19
num batches per epoch / 1epochのバッチ数: 19
num epochs / epoch数: 527
batch size per device / バッチサイズ: 1
total train batch size (with parallel & distributed & accumulation) / 総バッチサイズ(並列学習、勾配合計含む): 1
gradient ccumulation steps / 勾配を合計するステップ数 = 1
total optimization steps / 学習ステップ数: 10000
batch_size = 1, No --gradient_checkpointing
1.6s/it
10000step
10000/1.6/3600 =1.7h
few GB/4epoch
few hundred GB/1learn
Step 7. Use Additional Networks
mv .ckpt to \stable-diffusion-webui-docker\data\config\auto\extensions\sd-webui-additional-networks\models\lora
Enable Additional Networks on WebUI
Select Model and set weight
generate and error!
powershellwebui-docker-auto-1 | LoRA weight_unet: 1, weight_tenc: 1, model: vae-model(****)
webui-docker-auto-1 | Error verifying pickled file from /stable-diffusion-webui/extensions/sd-webui-additional-networks/models/lora/vae-model.ckpt:
webui-docker-auto-1 | Traceback (most recent call last):
webui-docker-auto-1 | File "/stable-diffusion-webui/modules/safe.py", line 135, in load_with_extra
webui-docker-auto-1 | check_pt(filename, extra_handler)
webui-docker-auto-1 | File "/stable-diffusion-webui/modules/safe.py", line 93, in check_pt
webui-docker-auto-1 | unpickler.load()
webui-docker-auto-1 | File "/stable-diffusion-webui/modules/safe.py", line 62, in find_class
webui-docker-auto-1 | raise Exception(f"global '{module}/{name}' is forbidden")
webui-docker-auto-1 | Exception: global 'torch/BFloat16Storage' is forbidden
webui-docker-auto-1 |
webui-docker-auto-1 |
webui-docker-auto-1 | The file may be malicious, so the program is not going to read it.
webui-docker-auto-1 | You can skip this check with --disable-safe-unpickle commandline argument.
webui-docker-auto-1 |
webui-docker-auto-1 |
webui-docker-auto-1 | Error running process_batch: /stable-diffusion-webui/extensions/sd-webui-additional-networks/scripts/additional_networks.py
webui-docker-auto-1 | Traceback (most recent call last):
webui-docker-auto-1 | File "/stable-diffusion-webui/modules/scripts.py", line 395, in process_batch
webui-docker-auto-1 | script.process_batch(p, *script_args, **kwargs)
webui-docker-auto-1 | File "/stable-diffusion-webui/extensions/sd-webui-additional-networks/scripts/additional_networks.py", line 209, in process_batch
webui-docker-auto-1 | network, info = lora_compvis.create_network_and_apply_compvis(du_state_dict, weight_tenc, weight_unet, text_encoder, unet)
webui-docker-auto-1 | File "/stable-diffusion-webui/extensions/sd-webui-additional-networks/scripts/lora_compvis.py", line 83, in create_network_and_apply_compvis
webui-docker-auto-1 | for key, value in du_state_dict.items():
webui-docker-auto-1 | AttributeError: 'NoneType' object has no attribute 'items'
I chose a wrong way
>学習するとき、fine_tune.pyの代わりにtrain_network.pyを指定してください。ほぼすべてのオプション(モデル保存関係を除く)がそのまま使えます。そして「LoRAの学習のためのオプション」にあるようにLoRA関連のオプション(network_dimやnetwork_alphaなど)を追加してください。
> なお「latentsの事前取得」は行わなくても動作します。VAEから学習時(またはキャッシュ時)にlatentを取得するため学習速度は遅くなりますが、代わりにcolor_augが使えるようになります。
changed
Use train_network
higher learning rate
save as sefetansors
learning target is LoRA
higher save epochs(low storage)
remove --gradient_checkpointing
(speed up)
powershell(NAI) accelerate launch --num_cpu_threads_per_process 1 train_network.py `
--pretrained_model_name_or_path=model.ckpt `
--in_json meta_lat.json `
--train_data_dir=train_data `
--output_dir=lora_train1 `
--shuffle_caption `
--train_batch_size=1 `
--learning_rate=1e-4 `
--max_train_steps=10000 `
--use_8bit_adam --xformers `
--mixed_precision=bf16 `
--save_every_n_epochs=1000 `
--save_model_as=safetensors `
--network_module=networks.lora
powershellrunning training / 学習開始
num train images * repeats / 学習画像の数×繰り返し回数: 19
num reg images / 正則化画像の数: 0
num batches per epoch / 1epochのバッチ数: 19
num epochs / epoch数: 527
batch size per device / バッチサイズ: 1
total train batch size (with parallel & distributed & accumulation) / 総バッチサイズ(並列学習、勾配合計含む): 1
gradient accumulation steps / 勾配を合計するステップ数 = 1
total optimization steps / 学習ステップ数: 10000
~1.6 it/s
more memory is available
Abort and resetting
> まずgradient_checkpointingを外すと速度が上がります。ただし設定できるバッチサイズが減りますので、精度と速度のバランスを見ながら設定してください。
> バッチサイズを増やすと速度、精度が上がります。メモリが足りる範囲で、1データ当たりの速度を確認しながら増やしてください(メモリがぎりぎりになるとかえって速度が落ちることがあります)。
batch size=2
powershellrunning training / 学習開始
num train images * repeats / 学習画像の数×繰り返し回数: 19
num reg images / 正則化画像の数: 0
num batches per epoch / 1epochのバッチ数: 12
num epochs / epoch数: 834
batch size per device / バッチサイズ: 2
total train batch size (with parallel & distributed & accumulation) / 総バッチサイズ(並列学習、勾配合計含む): 2
gradient accumulation steps / 勾配を合計するステップ数 = 1
total optimization steps / 学習ステップ数: 10000
2.36 it/s
1.18h
あやまり。epochごとに待ち時間がある
6-7hかかった
safetensors apperas < 1MB!
bit higer at beginning
>train_network.pyでは--network_moduleオプションに、学習対象のモジュール名を指定します。LoRAに対応するのはnetwork.loraとなりますので、それを指定してください。
> なお学習率は通常のDreamBoothやfine tuningよりも高めの、1e-4程度を指定するとよいようです。
XY plot
>モデルのリストは選択肢の隣にあるボタンで取得できます。いずれかのモデルを Additional Networks の Model ? で選択しておいてください。そのモデルと同じフォルダにあるモデルの一覧が取得されます。