メインコンテンツへスキップ
見出し画像

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」リポジトリでの学習方法は、以下で紹介しています。



     
     

    npaka

     
     
    プログラマー。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガジェット。年2冊ペースで技術書を執筆。アニソン / カラオケ / ギター / 猫 twitter : @npaka123

    あなたへのおすすめ