見出し画像

SDXL LoRAのTextEncoderの有無の比較

Stable Diffusion XLがまだ普及していない頃に、「SDXLはText Encoderが二つあり挙動がよくわかっていないためunetのみ推奨」とされていました。そういうことでTextEncoder(以降TE)の有無を比較します。

キャラクターLoRA

学習コマンド(TE込み):

accelerate launch --num_cpu_threads_per_process 1 sdxl_train_network.py --pretrained_model_name_or_path "G:\sd\models\Stable-diffusion\sdxl\animagine-xl-3.1.safetensors" --train_data_dir "D:\sd_train\Train\kotonoha\train" --output_dir "G:\sd\models\lora\sdxl" --network_module "lycoris.kohya" --network_args "algo=lora" "dora_wd=True" "conv_dim=0" "conv_alpha=0" --xformers --gradient_checkpointing --persistent_data_loader_workers --no_metadata --cache_latents --cache_latents_to_disk --max_data_loader_n_workers 1 --enable_bucket --save_model_as "safetensors" --lr_scheduler_num_cycles 3 --mixed_precision "fp16" --learning_rate 1 --resolution 1024 --train_batch_size 2 --max_train_epochs 3 --network_dim 8 --network_alpha 2 --shuffle_caption --keep_tokens 1 --save_every_n_epochs 1 --optimizer_type "prodigy" --optimizer_args "betas=0.9,0.99" "eps=1e-08" "weight_decay=0" "d0=1e-06" "decouple=False" "d_coef=1" "use_bias_correction=False" "safeguard_warmup=True" --lr_warmup_steps 150 --output_name "kotonoha_dora_v4" --save_precision "fp16" --lr_scheduler "cosine_with_restarts" --min_bucket_reso 512 --max_bucket_reso 2048 --caption_extension ".txt" --seed 42 --logging_dir "D:\sd_train\logs" --dataset_config "D:\sd_train\Train\kotonoha\kotonoha.toml" --fp8_base --loss_type "smooth_l1" --huber_c 0.1 --huber_schedule "snr"

画像左から順にLoRA無し、TE込み、TE込みのTEを無効化、Unetのみ

比較1

TE込みが最も品質が高い。Unetのみもまあまあ再現。TE込みのTEを無効化したものは雰囲気の似た別人になってしまった。

比較2

TE込みが最も再現度が高い。Unetのみもまあまあ再現。TE込みのTE無効化は…誰だお前?

比較3

茜ちゃんと同様。

画風

二回学習とマージをしました。

2.0がTextEncoder込み、unetonlyがUnetのみ

比較4

unetオンリーでは微妙に画風の再現度が低下した。TE込みのseed:3333がはずれと化した。

比較5

大きな違いはない。TEの学習かなり緩めにしたからそんなもんか。

比較6

unetオンリーでは傘の形状がおかしい。seed:3333はblue hair, black hairを無視して髪が白っぽくなった。

比較7

大きな違い無し。勝手にヘイローが生えるがデータセット側の問題。

まとめ

Text Encoder込みでも何の問題もなく、SD1.5と同じ感覚で作成できます。
UNetのみでは、再現度が低下したり、指示を無視したり崩れやすくなったりします。したがってText Encoder込みで学習すべきでしょう。

この記事が気に入ったらサポートをしてみませんか?