見出し画像

Google Colab ではじめる Textual Inversion

「Diffusers」の「textual_inversion.py」を使った「Textual Inversion」を試したのでまとめました。

・Stable Diffusion v1.4
・Diffusers v0.3.0

1. Textual Inversion

「Textual Inversion」は、3~5枚の画像を使ってファインチューニングを行う手法です。「Stable Diffusion」のモデルに、独自のオブジェクトや画風を覚えさせることができます。

今回は、「Diffusers」の「textual_inversion.py」を使います。書くべきコード量も、GPUのメモリ消費量も少なくて良い感じです。

2. ライセンスの確認

以下のモデルカードにアクセスして、ライセンスを確認し、「Access Repository」を押し、「Hugging Face」にログインして(アカウントがない場合は作成)、同意します。

3. 学習用画像の準備

ファインチューニングには、3〜5枚の学習用画像が必要です。

・画像サイズ は512×512。
・Exifで回転してない画像。
・最良の結果を得るには約 3~5個の画像。
 
使用する画像の枚数が多すぎると、モデルが収束しない場合がある。
・画像には共通のコンテキスト情報が含まれている必要がある。
 ・オブジェクト : 同じオブジェクトを異なる視点から写す。
 ・画風 : 配色とアートスタイルを一貫させる。

4. ファインチューニングの実行

Colabでファインチューニングを行う手順は、次のとおりです。

(1) 新規のColabノートブックを開き、「GPU」を選択 (ハイメモリでなくてOK)。
GPUのメモリが16GB以上 (以下は16280MiB) であることを確認します。

# GPUの確認 
!nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.32.03    Driver Version: 460.32.03    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla P100-PCIE...  Off  | 00000000:00:04.0 Off |                    0 |
| N/A   33C    P0    27W / 250W |      0MiB / 16280MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

(2) Googleドライブのマウントと作業フォルダへの移動。
あらかじめGoogleドライブのマイドライブ直下に「work」フォルダを作成しておきます。

# Googleドライブのマウントと作業フォルダへの移動
from google.colab import drive
drive.mount('/content/drive')
%cd '/content/drive/My Drive/work'

(3) パッケージのインストール。

# パッケージのインストール 
!pip install diffusers[training] accelerate transformers

(4) HuggingFaceにログイン。
リンク先でトークンをコピーして、テキストフィールドに入力し、Loginボタンを押します。

# HuggingFaceにログイン
from huggingface_hub import notebook_login
notebook_login()

(5) 「HuggingFace Accelerate」のセットアップ。
single GPUの設定 (0, 0, NO, NO, NO) を行います。

# HuggingFace Accelerateの初期化
!accelerate config
In which compute environment are you running? ([0] This machine, [1] AWS (Amazon SageMaker)): 0
Which type of machine are you using? ([0] No distributed training, [1] multi-CPU, [2] multi-GPU, [3] TPU [4] MPS): 0
Do you want to run your training on CPU only (even if a GPU is available)? [yes/NO]:NO
Do you want to use DeepSpeed? [yes/NO]: NO
Do you wish to use FP16 or BF16 (mixed precision)? [NO/fp16/bf16]: NO

「HuggingFace Accelerate」については以下で簡単に解説してます。

(6) workフォルダ直下のinputsフォルダに学習用画像を配置。

(7) diffusersリポジトリのクローン。
diffusersリポジトリ内のexamplesを利用します。

# diffusersリポジトリのクローン
!git clone https://github.com/huggingface/diffusers.git

(8) ファインチューニングの実行。
今回は、「画風」を学習させてみます。フレースホルダートークンは<sorami>、初期トークンはcomicとします。P100で2時間ほどかかりました。

# 学習の実行
!accelerate launch ./diffusers/examples/textual_inversion/textual_inversion.py \
  --pretrained_model_name_or_path="CompVis/stable-diffusion-v1-4" \
  --use_auth_token \
  --train_data_dir="inputs" \
  --learnable_property="style" \
  --placeholder_token="<sorami>" \
  --initializer_token="comic" \
  --resolution=512 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --max_train_steps=3000 \
  --learning_rate=5.0e-04 \
  --scale_lr \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --output_dir="textual_inversion_sorami"

--learnable_property」には、画風 (style) と オブジェクト (object) どちらを学習させるかを指定します。
--placeholder_token」には、 学習した新しい概念を表す単語であるプレースホルダトークンを指定します。他の単語と衝突しないように<>を付加することが推奨されます。
--initializer_token」には、学習開始時の学習する概念の初期値となる初期化トークンを指定します。

5. 推論の実行

Colabで推論を行う手順は、次のとおりです。

(1) StableDiffusionパイプラインの準備。

import torch
from diffusers import StableDiffusionPipeline

# StableDiffusionパイプラインの準備
pipe = StableDiffusionPipeline.from_pretrained(
    "./textual_inversion_sorami",
    torch_dtype=torch.float16
    ).to("cuda")

(2) 推論の実行。
今回は、猫耳メイド(cute cat ear maid of <sorami> style)で画像生成してみました。

from torch import autocast

# プロンプト
prompt = "cute cat ear maid of <sorami> style"

# 推論の実行
with autocast("cuda"):
    image = pipe(
        prompt, 
        num_inference_steps=50, 
        guidance_scale=7.5
        ).images[0]
image.save("output.png")

(3) 生成した画像の確認。
左端のフォルダアイコンでファイル一覧を表示し、output.pngをダブルクリックします。

6. APIリファレンス

「textual_inversion.py」のパラメータは、次のとおりです。

・-h, --help : ヘルプ
・--pretrained_model_name_or_path [PATH] : 事前学習モデルのパス
 ・CompVis/stable-diffusion-v1-4
 ・hakurei/waifu-diffusion
・--tokenizer_name [NAME] : トークナイザー名
・--train_data_dir [DIR] : 入力画像フォルダのパス
・--placeholder_token [PLACEHOLDER_TOKEN] : プレースホルダトークン。学習した新しい概念を表す単語。他の単語と衝突しないように<>を付加することが推奨される
・--initializer_token [INITIALIZER_TOKEN] : 初期トークン。学習開始時の学習する概念の初期値
・--learnable_property [LEARNABLE_PROPERTY] : オブジェクト(object) or 画風 (style)
・--repeats [REPEATS] : 学習データの繰り返し回数
・--output_dir [OUTPUT_DIR] : 出力フォルダのパス
・--seed [SEED] : 乱数シード
・--resolution [RESOLUTION] : 入力画像の解像度 (512)
・--center_crop : リサイズ時に画像を中央配置するかどうか
・--train_batch_size [TRAIN_BATCH_SIZE] : バッチサイズ
・--num_train_epochs [NUM_TRAIN_EPOCHS] : 学習エポック数。学習ステップ数指定時はそちらを優先
・--max_train_steps [MAX_TRAIN_STEPS] : 学習ステップ数 (3000〜7000)
・--gradient_accumulation_steps [GRADIENT_ACCUMULATION_STEPS] : backward/updateパスを実行する前に蓄積する更新ステップ数
・--learning_rate [LEARNING_RATE] : 学習率の初期値
・--scale_lr : GPUの数、勾配累積ステップ、バッチサイズによって学習率をスケーリング
・--lr_scheduler [LR_SCHEDULER] : scheduler種別
    ・cosine
    ・cosine_with_restarts
    ・polynomial
    ・constant
    ・constant_with_warmup
・--lr_warmup_steps [LR_WARMUP_STEPS] : lr schedulerのウォームアップステップ数
・--adam_beta1 [ADAM_BETA1] : Adam optimizerのbeta1
・--adam_beta2 [ADAM_BETA2] : Adam optimizerのbeta2
・--adam_weight_decay [ADAM_WEIGHT_DECAY] : Weight decay
・--adam_epsilon [ADAM_EPSILON] : Adam optimizerのepsilon
・--logging_dir [LOGGING] : ログフォルダのパス
・--use_auth_token : 「huggingface-cli login」で指定したトークンの利用
・--push_to_hub : ModelHubにパブリッシュするかどうか
・--hub_token HUB_TOKEN : ModelHubへのパブリッシュで利用するトークン
・--hub_model_id HUB_MODEL_ID : ModelHubへのパブリッシュで利用するID
・--mixed_precision {no,fp16,bf16} : 混合精度を使用するかどうか
・--local_rank [LOCAL_RANK] : 分散学習で利用するlocal_rank

7. 参考

・Textual InversionによるUgly Sonicの復活


・DreamBoothとTextual Inversionの比較

・22/09/18 Stable Diffusionの追加トレーニングについてのサーベイ

・22/09/26 Stable Diffusion追加学習の記録

8. 関連

「Textual Inversion」リポジトリでの学習方法は、以下で紹介しています。



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