広告
広告

AUTOMATIC1111 の Dream Booth の使い方

カテゴリ:deeplearning

目次

正則化画像の必要性

Parameters

Advanced

Concepts

A Few Dreambooth Observations and Tips, Leafier Closer Shots With the New Vae File (higher CFG)

モデルの圧縮(脱水)

LORA

kohya 版 LoRA を使う

sd_dreambooth_extension で LORA を使う

概要

Dreambooth は元のモデルが描けないオブジェクトも学習させて描けるようになる。ただし、追加して学習させられない。A というオブジェクトを学習させたモデルに B というオブジェクトを追加で学習させると A が影響を受けてあいまいになってしまう。なので Dreambooth で複数の概念を学習させるには同時に学習させなければならない。

Extension の Dreambooth は以下のように動作する。

  1. cpkt を Diffuser 形式に変換(変換されたモデルは models/dreambooth にある)
  2. ShivamShrirao の Dreambooth を実行
  3. cpkt に変換

正則化画像の必要性

sks guitar という Instance プロンプトで sks にギターの柄を学習させたいとする。このとき正則化画像がないと、sks にどのような内容が学習されるかわからない。sks と guitar と両方の語の概念が変更されるからだ。ここで guitar という Class プロンプトで正則化画像も使って学習させると、guitar という語の概念を修正できるので、sks に guitar 以外の概念を学習させられる。

prior-preservation loss

正則化画像は過学習と language-drift(語の意味の変化)を防ぐ効果がある。正則化画像がないと Instance prompt に含めた語の意味が変化してしまう。

インストール

Extensions としてインストールする。

webui-user.bat の 'set COMMANDLINE_ARGS=' の下の行に以下を追加して webui を再起動する。

set TORCH_COMMAND=pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 --extra-index-url https://download.pytorch.org/whl/cu116

Create Model

ckpt を Diffuser 形式に変換する。

Parameters

Training Steps

ステップ数を指定する。Training Epochs より優先されるので、エポック数を使う場合は空欄にする。

Training Epochs

エポック数を指定する。Basic Dreambooth Guide によると、100 epoch(Instance 画像枚数 * 100)は必要になる。

Scale learning rate

GPU 数、gradient accumulation steps、バッチサイズで学習率をスケールするかどうか。

Warmup Steps

適応学習率を導入した最適化アルゴリズムは学習の初期段階では適応学習率自体の分散が極端に大きくなってしまいとんでもなく大きい値を取りかねない。Warmupとは学習の初期段階を通常よりも小さな学習率で始め、学習が進むにつれて徐々に通常の学習率まで上げていくヒューリスティックな手法

Center Crop

ターゲット解像度にリサイズする前にセンタークロップするかどうか。

Apply Horizontal Flip

画像をランダムに左右反転する。左右非対称のオブジェクトを学習させる場合はチェックを外す。

Concepts List

設定を書いた JSON ファイル。複数の概念を同時に学習させるときに使う。。 設定できるのは instance prompt, class prompt, instance data dir, class data dir のみ。

Concepts タブの方がより詳細な設定ができる。

Advanced

Batch size

学習の並列実行数。

Class batch size

正則化画像の並列生成数。

Use CPU Only (SLOW)

CPU で計算する。必要メモリは 48 GB 以上。32 GB だとアプリをすべて終了させないとスワッピングが起こる。8bit Adam と同時に使えない。

Use 8bit Adam

チェックを入れると、精度は悪化するが VRAM を節約できる。

Mixed Precision bf16

bf16 は fp16 より指数のビットを多く割り当てたもの。fp16 よりディープニューラルネットワークをトレーニングするのに向いているらしい。しかし実行できるハードウェアは限られている。

Memory Attention

Comparison of speed and VRAM of different attention optimizations #230 によると xformers と flash_attention はメモリ使用量に大差がない(150MB 差)ので、flash_attention を使用する理由がない。

  • default:最も早いが、VRAM 使用量が多い
  • xformers:速度、VRAM 使用量ともに普通
  • flash_attention:最も遅いが、VRAM 使用量が最も少ない

Don't cache latents

VAE の出力をキャッシュしない設定。チェックすると VRAM が節約できる。

Train Text Encoder

Text Encoder も同時に学習させると顔の品質が上がる。チェックを外すと VRAM が節約できる。

Train EMA

最終イテレーションで過学習になるのを防ぐために、指数移動平均(exponential moving average weight)を使う。品質が上がるが学習時に VRAM を余計に使用する。

Prior Loss Weight

正則化画像の loss の重み。通常は1を指定する。

Pad Tokens

75 トークンになるようにプロンプト埋める。

gradient checkpointing

速度は遅くなるが VRAM を節約するオプション。

Concepts

Instance prompt

画像生成時に呼び出すときに使う語を含んだプロンプト。呼び出すときに使う語は1トークンでモデルで使われてないものがいい。たとえば shs sts scs cpc coc cic msm nen usu ici lvl。複雑なプロンプトを入れてはいけない。複雑なプロンプトを入れてしまうと、Class prompt を設定しても語の意味が変化(language-drift)してしまう。キャラの場合 shs girl 等になる。

[filewords] を入れると、Textual Inversion や Hypernetwork でやるように、画像ファイル名の txt ファイルに書かれたプロンプトを使う。

Instance prompt は prior preservation を行う場合にのみ必要になる。

Class prompt

正則化画像を説明するプロンプト。プロンプトはモデルが認識できるものでないと意味がない。Instance prompt が shs girl の場合、Class prompt は girl になる。

[filewords] を入れると、Textual Inversion や Hypernetwork でやるように、画像ファイル名の txt ファイルに書かれたプロンプトを使う。

prior preservation を行わないなら空白でいい。

Instance prompt と class prompt の例

Training objects #19では Instance prompt に "sks guiter"、class prompt に "guiter"、を入力して学習させた例がある。この例では sks にギターの柄のみが学習されている。

DiffusersベースのDreamboothの精度をさらに上げる(Windows対応、VRAM 12GB)#学習用画像の準備で学習用画像と正則化画像との例が見れる。

Classification dataset directory

正則化画像(Class prompt で説明されている画像)を入れておくディレクトリ。Class prompt が入力されていて、このディレクトリの欄が空白の場合は /models/dreambooth/MODELNAME/classifiers/ に画像を生成して使用する。

Existing Prompt Contents

[filewords] を使う場合に使う。[filewords] に含まれるコンテンツ内容を指定する。

Instance Prompt と Class Prompt とは制約がある。Instance Prompt は常に Instance Token と Class Token とがセットでなければならない。Class Prompt には Instance Token が入っていてはならない。Existing Prompt Contents は キャプションファイルに Instance Token と Class Token とが入っているかどうかで、キャプションファイルの内容を加工してプロンプトとして使う。

Description

キャプションファイルに Class Token がある場合は、Class Token の前に Instance Token を挿入して Instance Prompt として使う。Class Prompt はそのまま使う。

Instance Token + Description

Instance Token の後ろに Class Token を挿入したものを Instance Prompt として使う。Class Prompt は Instance Token を Class Token に置き換えたものを使う。

Class Token + Description

Class Token の前に Instance Token を挿入して Instance Prompt として使う。Class Prompt はそのまま使う。

Instance Token + Class Token + Description

そのまま Instance Prompt に使う。Class Prompt は Instance Token を削除して使う。

コード

finetune_utils.py#L40-L61

Instance Token

画像生成時に呼び出すときに使う語のみを指定する。画像生成時に呼び出すときに使う語が sls なら sls のみを指定する。a photo of sls や sls dog 等は間違い。Instance prompt に [filewords] が含まれている時のみ機能する。

Class Token

Instance token と同じだが、こちらは複数のタグを指定できる。class prompt に [filewords] が含まれている時のみ機能する。

Instance Token と Class Token の使い方

Instance token に sks、Class token に a woman, woman が指定されているとする。このとき [filewords] が a photo of a woman や a photo of a man and a woman だったとすると、学習時とサンプル画像作成時にそれぞれ a photo of sks woman と a photo of a man and sks woman に置換されて実行される。正則化画像生成時にはこの機能は働かない。

Total Number of Class/Reg Images

用意した正則化画像の 10 倍程度を指定する。prior preservation を行わないなら0を指定する。

学習の再開

Load Params をクリックすると、入力パラメーターを復元してくれる。

外部リンク

DiffusersベースのDreamBoothの精度をさらに上げる(Windows対応、VRAM 12GB)

Dreambooth-Stable-Diffusion

ShivamShrirao/diffusers

Stable Diffusion Tutorial Part 1: Run Dreambooth in Gradient Notebooks

DreamBooth fine-tuning example

A Few Dreambooth Observations and Tips, Leafier Closer Shots With the New Vae File (higher CFG)

用意する画像

  • 20 枚以上のアップ画像
  • 4枚以上の胴+顔画像
  • 4枚以上の全身画像
  • 1枚以上の着座画像

注意すること

  • 高解像の画像を集める
  • 汎用性を上げるには、背景やライティング、髪型、表情など多くの画像を集める必要がある
  • 魚眼レンズ効果を好まない場合は、魚眼レンズで撮影された画像は避ける
  • シミやそばかすのある写真は加工する。そうしないと不自然な画像を生成するようになる
  • クラス名は a で始める(a dog, a girl など)。そうすると複数のインスタンスを生成するのを防げる(dog という class prompt で学習させると、dog で複数の犬を描くようになる)
  • 正則化画像は厳選する。a girl で生成しても a girl に関係のない画像が生成されるので、関係ない画像は除去する

避けたほうがいいこと

  • ピンボケ画像は使わない
  • 顔の近くに手がある画像は、手を学習してしまうので避けた方がいい
  • 枠のある画像は、枠を学習してしまうので避ける
  • ボケが強すぎる写真は避ける

そのほか

512x512 より大きいサイズでの出力を予定している場合、大きい解像度の画像(たとえば 640x640)の画像で学習させると品質が上がる。

60 枚の画像と、2,000 枚の "person" 正則化画像とで 6,000 ステップで学習させた場合、高い CFG を設定しても画像が破綻しづらくなった。

Dehydrate and Rehydrate ckpt model

Dreambooth で作成したモデルを1GB 未満に圧縮する。

LORA

LORA のファイルサイズが小さいのは U-Net の一部のみ fine tune するのと、差分情報だけ出力するからだ。さらにその差分情報を低ランクの行列Aと行列Bとに分解して、AとBとをそれぞれ fine tune する。AとBとの合計サイズは差分情報より小さい。

LORA は U-Net 全体を fine tune するのではなく、トランスフォーマーモデルのアテンション層(Q, K, V, O)だけを fine tune する。

kohya 版 LoRA を使う

環境構築

間違えやすいポイント

  • Python 3.10.x を使う
  • 学習前に venv を有効にする
  • 学習画像のディレクトリ構造
  • 仮想メモリの容量不足
学習画像のディレクトリ構造

--train_data_dir には ./任意のディレクトリ/training、--reg_data_dir には ./任意のディレクトリ/reg を指定する。10_AAA や 10_BBB を指定するのではない。

任意のディレクトリ─┬─training─┬─10_AAA
          │      └─10_BBB
          │
          └─reg  ─┬─10_AAA
              └─10_BBB
ページングファイル不足のエラーが出る

Windowsの設定->システム->詳細情報->システムの詳細設定->パフォーマンス[設定]->仮想メモリ[変更] で仮想メモリの最大値を 80GB(80,000MB)程度に設定する。

学習方法

以下の設定の場合、VRAM 使用量は 6.2GB だった。RAM が 16GB の場合ページングファイル不足エラーが出る。学習中は 10 GB 程度 RAM を消費するため、ほかのアプリを起動させていると 16GB では RAM が不足することがある。

accelerate launch --num_cpu_threads_per_process 12 train_network.py --pretrained_model_name_or_path= --train_data_dir= --output_dir=./lora_train1/ --reg_data_dir= --prior_loss_weight=1.0 --resolution=512,512 --train_batch_size=1 --learning_rate=1e-4 --max_train_steps=400 --use_8bit_adam --xformers --mixed_precision=fp16 --save_every_n_epochs=1 --save_model_as=safetensors --clip_skip=2 --seed=42 --color_aug --network_module=networks.lora

AUTOMATIC1111 で Kohya 版の .pt ファイルを使う場合はsd-webui-additional-networksを使う。

外部リンク

kohya_sd-scripts_intro(Google Colab 使用)

LoRA Training Guide

sd_dreambooth_extension で LORA を使う

設定を切り詰めれば VRAM8GBでも実行できる。

vram 8g
VRAM8GB で実行する設定例

Parameters タブの Advanced で Use LORA にチェックを入れると使える。設定方法は Dreambooth と同じ。

出力

学習結果の差分ファイル(.pt)が出力される。差分ファイルは models/lora/ に出力される。

差分ファイルの適用

  1. Dreambooth タブの Create Model タブで適用したいモデルを Diffuser 形式に変換する
  2. Model と Lora Model とそれぞれ選択して、Generate Ckpt を押す

外部リンク

ローカルの学習入門#Lora

Low-rank Adaptation for Fast Text-to-Image Diffusion Fine-tuning

デモページ

AI を自分好みに調整できる、追加学習まとめ ( その5: LoRA)


広告
広告