2024年6月30日日曜日
Stable Diffusionの呪文として使えそうな手の表現 (2)
2024年5月7日火曜日
SDXLのLoRAの学習時間、Epoch数について
一枚の画像当たり200回の学習が目安か
こちらも、おおよそ40エポックごろにtextencoder/unet両方の学習率の上昇が殆どなくなっているように見えます。つまり画像あたり、40エポックx5回繰り返し = 200回の学習がされたころに学習率が収まっているように見えます。
エポックを通じた画質の変化
こちらは,27エポックぐらいまで色彩が飛ぶ感じですね。そこから落ち着きが出る感じです。
2024年4月21日日曜日
作ったSDXLのLoRAをLoRA Block Weightで調整
A1111版のwebuiやwebui Forgeを使っている方は、Extentions->Install from URLで、URLに```https://github.com/hako-mikan/sd-webui-lora-block-weight.git‘‘‘と入力してインストール、UIの再起動をしてください。
2.ベースモデルとLoRA適用の画像を見比べる
題材としたベースモデルは bluePencilXL_v600.safetensors です。
次の最初の画像が、ベースモデルだけの画像。下の画像が、最初の画像とプロンプトなどは同じ条件にしたうえで、自作LoRAを動作させて出力させたものです。
人物自体はかなり私好みになっているのですが、全体的に体の立体感が無く、赤味のコントラストや、髪の毛・体のエッジが強すぎてちょっとベースモデルの良さを生かせていません。そこで次に分析をしていきます。
この機能を使うことで、モデルの層ごとのLoRAの効き具合を調べることができます。これを使って過剰にLoRAによる補正がかかっている層を探すことができます。
3.1 プロンプトにLoRA Block Weight用の呪文を入れる
プロンプト内でLoRAを記載している個所を
<lora:original_lora:1:1:lbw=XYZ>
のように1:lbw=という記載を追加します。1:がダブっているように見えますが合っています。(original_loraというのか仮称で、あなたが作ったLoRAのファイル名を入れてください。)
3.3 LBWを有効にし、Effective Block Analyzer を設定する。
下図の通りLBWを有効にして、LBW内のXYZ Plotで、「Effective Block Analyzer」を選択、Range, Blocksの各欄に、
Range:0,1
Blocks:12ALL
を記入し、あとはデフォルトのままとしてください。SD1.5の時に使ったことがある人は、あれ?17ALLではないのか、と思うかもしれませんが、SDXLでは12層しか適用されないのです
3.3 この状態で”Generate”を実行します。
4. 結果を見る
12枚+1枚の画像を出力し、最後に、グリッド画像が生成されます。これは12層の各層へのLoRAの適用をひとつずつOffにしてみた画像の列になります。
今回作ったLoRAでは、 BASE層のほか、特にOUT01層を0、つまりOUT01層へのLoRAによる上書きを無効にした場合の差分が大きいようです。特にOUT01層を0にした場合の絵は色味がビビッドでありながら全体的にグラデーションが柔らかく、また、描線も軽くなってベースモデルにかなり近い印象です。
つまり、私が作ったblue_pencil-XL用のこのLoRAはOUT01層に対してかなり強めの矯正をかけていて、それがバランスを崩させているということがわかります。
5.解析の結果をもとに、LoRAの重みを変える。
プロンプト内で先程1:lbw=としたところを、書き換えます。書き換えにあたって、影響が強かった層のウェイトを下げます。具体的には、先程の例でいうOUT01層のウェイトを少し下げます。ここでも少し特殊な記法で、
<lora:original_lora:1:1:lbw=1,1,1,1,1,1,1,0.8,1,1,1,1>
と記載します。赤字で0.8としたところがOUT01層に相当する箇所です。ちなみに画像はこちら。
いかがでしょう。人物の風味を残しつつ、色味や絵の雰囲気はベースモデルに近づいています。0にするのではなく、1より少し小さい0.8とか0.7とかに重みを軽くするだけでも大分変化が出ます。ちなみに赤字の箇所を0にするとこちら。↓
これはこれでかわいらしいですね。blue_pencil-XLは少し幼めな感じが得意なモデルで、それが強く出てます。
ちなみに、lbw=に続く数字の列は
lbw=BASE, IN04, IN05, IN07, IN08, MID, OUT00, OUT01,OUT02,OUT03, OUT04,OUT05
の各層への重みに対応しています。
5. その他
SDXLの場合[IN04,IN05],[IN07,IN08]、[OUT00,OUT01,OUT02]、[OUT03,OUT04,OUT05]を塊としてLoRAの重みによる顕著な変化の傾向が見られます。これは、SDXLのUnetで画像を生成していく際に、サイズが変更がかかる層ごとの区切りのようです。私は、この塊ごとにプリセットを用意して、XYZプロットを実行してLoRAの影響具合を確認しています。。
SD1.5に比べると、モデルの学習量がかなり疎な印象があります。SD1.5の時はどのモデルもどんなプロンプトでもそれなりの絵が出てきました。が、SDXLではモデルの得手不得手がはっきりしているような気がします。おそらく、SDXLで大きくなったネットワークに十分にデータをため込めていないのではと思いました。
LoRAで学習する際に、追加学習させようとした絵とモデルの知識がかけ離れている場合、今回のように特定の層にひずみをかけて適応が進むのだと思いました。
また、LoRAがSD1.5の時に比べると他のモデルに適用できないのもそのせいだと思います。 モデルごとにNWで学習がされている場所が異なり、LoRAが制御をかける箇所がモデルごとに異なるのだと思います。
いくつか試した中ではAnimagineXL3系モデルは、追加データをかなり厚く使って学習しておりLoRAも安定した出力が出る印象です。
今回使ったblue_pencil-XLはマージモデル(それでもかなりのモデルをマージしていますが)で今回の事象が顕著になったのかなと思いました。
2024年4月14日日曜日
8GBのGPUカード+Windows環境でSDXLのLoRA学習にチャレンジ
git clone https://github.com/kohya-ss/sd-scripts.gitcd sd-scriptspython -m venv venv.\venv\Scripts\activate
必要なライブラリを 入れていきます。
pip install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 --index-url https://download.pytorch.org/whl/cu118
pip install --upgrade -r requirements.txt
pip install xformers==0.0.22.post7 --index-url https://download.pytorch.org/whl/cu118
一部のファイルをコピーします。
cp .\bitsandbytes_windows\*.dll .\venv\Lib\site-packages\bitsandbytes\
cp .\bitsandbytes_windows\cextension.py .\venv\Lib\site-packages\bitsandbytes\cextension.py
cp .\bitsandbytes_windows\main.py .\venv\Lib\site-packages\bitsandbytes\cuda_setup\main.py
いくつかフォルダも掘っておきます
mkdir dataset
mkdir outputs
mkdir logs
3.データの準備
mkdir dataset
を実行します。その下に、1024x1024以上のサイズの画像と、キャプションをセットにしたデータを配置しますが、この例ではさらにサブフォルダに
10_class名
という名前のフォルダを作り、その下にデータを置きます。dataset.tomlを指定する方法もあるのですが、上記フォルダの先頭が示す、その画像に対する繰り返し回数を画像セットごとに指定できるので、私は旧来からのこの方法でデータを配置しています。
また、一つのサブフォルダ内の画像セットの縦横のピクセル数は同一である必要があります。なお、ぴったり1024x1024ある必要は、この例ではありません。
また、キャプションテキストファイルの拡張子は.captionとしています。キャプションを付与するタガーの使い方などはここでは省略します。
4.config.yamlファイルの準備
以下の内容の、config.yamlファイルを作ります。
command_file: nullcommands: nullcompute_environment: LOCAL_MACHINEdeepspeed_config: {}distributed_type: 'NO'downcast_bf16: 'no'dynamo_backend: 'NO'fsdp_config: {}gpu_ids: allmachine_rank: 0main_process_ip: nullmain_process_port: nullmain_training_function: mainmegatron_lm_config: {}mixed_precision: 'no'num_machines: 1num_processes: 1rdzv_backend: staticsame_network: truetpu_name: nulltpu_zone: nulluse_cpu: false
5.GPUメモリをできるだけ空ける
できるだけ、実行されているアプリを減らし、GPUメモリを空けます
- ブラウザ、常駐タスクを終了する。(タスクトレイアイコンも忘れずに)
- ディスプレイサイズを800x600にする
- 視覚効果を全部切る。(ウインドウマネージャが使うメモリを減らす)
特に3点目、PC-プロパティ-システム詳細設定-システムのプロパティ-パフォーマンスオプション-「パフォーマンスを優先する」
です。ここまでやると、かなり学習以外のGPUメモリの消費量を下げれると思います。私はこんな感じです。目標は、「専用GPUメモリ」だけをLoRAの学習に使わせることです。共有GPUメモリを使いだすととたんに学習に必要な時間が3~10倍になってしまいます。逆に、計算時間を我慢すれば、GPUメモリが少なくても共有GPUメモリの仕組みを使ってもう少し制約が少ないLoRAの学習ができないわけでもないです。
6. 学習の実行
以下のコマンドを実行します。bat,cmdファイルにしておいてもよいと思います。
accelerate launch --config_file=".\config.yaml" sdxl_train_network.py `
--pretrained_model_name_or_path="学習の対象にしたいチェックポイント.safetensors" `
--vae="(VAEのありかのフルパス)sdxl_vae.safetensors" `
--fp8_base `
--output_dir=".\outputs" `
--output_name=sdxl_test_lora `
--save_model_as=safetensors `
--prior_loss_weight=1.0 `
--max_train_steps=10 `
--learning_rate=1e-4 `
--optimizer_type="adafactor" `
--xformers `
--mixed_precision="fp16" `
--cache_latents_to_disk `
--enable_bucket `
--caption_extension=".caption" `
--gradient_checkpointing `
--save_every_n_epochs=1 `
--network_module=networks.lora `
--no_half_vae `
--network_dim=8 `
--network_alpha=2 `
--bucket_reso_steps=64 `
--logging_dir=".\logs" `
--max_train_epochs=2 `
--train_batch_size=3 `
--train_data_dir=".\dataset_tmp" --resolution="1024,1024" --min_bucket_reso=256 --max_bucket_reso=2048
ここではLoRAのRankのディメンジョン数を8、バッチサイズを3にしています。私の環境ではこれが限界でした。また、--fb8_base オプションが重要でして、これがあることで、必要GPUメモリがぐっと減らせます。学習をU-net部分に限定する --network_train_unet_only を指定する必要がなくなりました。
ちなみにこの設定の時の学習の状況は以下のような感じ。
まあ、ギリギリですかね。
さて、学習方法はこれで何とかつかめたのですが、なかなか良い感じの絵柄が生成できなくて困っています。しばらくパラメータを振ったりしていきたいと思います。
補足:Winodows環境では以下のワーニングが出てきます。tritonはWindowsではサポートされていないそうですが、無視しても大丈夫とのことです。
A matching Triton is not available, some optimizations will not be enabled. Error caught was: No module named 'triton'
2024年4月7日日曜日
ControlnetのtileでSDXL 1.0の高解像度化
- 使用モデル:bluePencilXL_v600
- プロンプト:1girl, best, japanese, pale blue casual dress, skinny body, Seductive expression, hotel bed room,smiling, black hair
- ネガティブプロンプト:nsfw, lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, artist name
- CFG Step:Steps: 23, Sampler: Euler a, CFG scale: 7.5
- Enableチェックボックスをチェック
- Conrol Typeで”Tile”を選択
- Preprocessorを選ぶ:これはSD1.5のものと同じでよいです。"tile_resample","tile_colorfix+sharp"など。私はどちらかというと"tile_resample"の方が好きです。絵が柔らかく仕上がります。
- Moldelを選ぶ:手順0.のダウンロード・ファイル配置が正しければ"bdsqlsz_controlllite_xl_tile_realistic"が選べると思います。
- TileOverlap:分割処理の際、処理を重ねるピクセル数。ここは64でよいと思います
- ScaleFactor:元のサイズの何倍の絵にするか。1024x1024の絵を2048x2048にしたいのでここでは”2"を選びます。小数点2桁で指定ができます
- Upscaler:お好みのアップスケーラを選びます。SD1.5と同じものが指定できます。私は4x-UltraSharp他は、SwinIR_4xやR-ESRGAN 4x+を選ぶことが多いです
2024年4月3日水曜日
Stable diffusion の呪文として、使えそうな手の表現
2024年2月23日金曜日
Stable Diffusion WebUI: ADetailerでの手の修正を考察する
metacarpal: (^メ゙タカーパル。^はアクセント位置) :中手骨(ちゅうしこつ)、拳を握ったときに指の付け根の出っ張りの骨。slender hand:スラッとした手
のように、影が消えて、手を侵食するようにウッドデッキの盛り上がりが生成されました。手が上書きされるほど変更がかけられるということは、薬指も生やせるのではないかと考えました。denoising strength を中心にパラメータの調整を試みました。
- 絵柄のクオリティを上げるために、txt2img本体のプロンプトで与えた品質に関するテキストも、ADetailerのプロンプトに与える。
- 大胆に修正をかけるためは、ADetailer denoising strengthの値を0.5以上の値を使う
- (この時、ADetailer inpaint only masked:にチェックを入れ、 上記の絵の場合(全体540x540)でADetailer inpaint paddingの値を 84px とデフォルトよりもだいぶ大きな値とした。)