Diffusers documentation

Textual Inversion

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Textual Inversion

Textual Inversionは、学習させたい対象の例示画像を数枚だけ用意するだけで、画像生成モデルをパーソナライズするための学習手法です。この手法は、提供した例示画像に一致するようにテキスト埋め込みを学習・更新することで機能します(新しい埋め込みは、プロンプト内で必ず使用しなければならない特別な単語に紐付けられます)。

学習済み埋め込みを用いた推論については、Textual inversionの推論を参照してください。

vRAMが限られたGPUで学習を行う場合は、学習コマンドでgradient_checkpointingとmixed_precisionパラメータを有効にすることを試してください。また、xFormersによるメモリ効率の高いアテンションを使用することで、メモリ使用量を削減することもできます。

このガイドでは、textual_inversion.py スクリプトを詳しく見ていき、その仕組みをより深く理解したうえで、ご自身のユースケースに合わせてどのようにカスタマイズできるかを解説します。

スクリプトを実行する前に、ソースからライブラリをインストールしていることを確認してください。

git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .

トレーニングスクリプトを含むサンプルフォルダに移動し、使用しているスクリプトに必要な依存関係をインストールします:

cd examples/textual_inversion
pip install -r requirements.txt

🤗 Accelerate は、複数 GPU/TPU での学習や混合精度学習を支援するためのライブラリです。ハードウェアや環境に基づいて、学習環境を自動的に設定します。詳細については、🤗 Accelerate の クイックツアー をご覧ください。

🤗 Accelerate の環境を初期化します:

accelerate config

設定を選択せずにデフォルトの🤗 Accelerate環境を設定するには:

accelerate config default

または、ノートブックのようにインタラクティブシェルをサポートしていない環境では、以下を使用できます。

from accelerate.utils import write_basic_config

write_basic_config()

最後に、独自のデータセットでモデルをトレーニングしたい場合は、トレーニング用のデータセットを作成するガイドを参照して、トレーニングスクリプトと互換性のあるデータセットの作成方法を確認してください。

以下のセクションでは、スクリプトの修正方法を理解するために重要な部分に焦点を当てていますが、スクリプトのすべての側面を詳細に説明するものではありません。さらに詳しく知りたい場合は、スクリプトをぜひお読みいただき、ご質問やご懸念事項があればお知らせください。

スクリプトのパラメータ

学習スクリプトには、学習実行をニーズに合わせて調整するための多くのパラメータがあります。すべてのパラメータとその説明は、parse_args() 関数にリストされています。適用可能な場合、Diffusers は学習バッチサイズや学習率などの各パラメータにデフォルト値を提供しますが、必要に応じて学習コマンド内でこれらの値を変更して構いません。

例えば、デフォルト値である1より多くの勾配蓄積ステップ数を増加させるには:

accelerate launch textual_inversion.py \
  --gradient_accumulation_steps=4

その他、指定すべき基本的かつ重要なパラメータには、以下が含まれます。

  • --pretrained_model_name_or_path: Hub 上のモデル名、または事前学習済みモデルへのローカルパス
  • --train_data_dir: 学習データセット(サンプル画像)を含むフォルダへのパス
  • --output_dir: 学習済みモデルを保存する場所
  • --push_to_hub: 学習したモデルを Hub にプッシュするかどうか
  • --checkpointing_steps: モデルの学習中にチェックポイントを保存する頻度です。学習が何らかの理由で中断された場合、学習コマンドに--resume_from_checkpointを追加することで、そのチェックポイントから学習を再開できます。
  • --num_vectors: 埋め込みを学習するためのベクトルの数。このパラメータを大きくするとモデルの学習精度が向上しますが、学習コストも増加します
  • --placeholder_token: 学習された埋め込みを紐付けるための特別な単語(推論時のプロンプトでこの単語を使用する必要があります)
  • --initializer_token: 学習対象のオブジェクトやスタイルを大まかに表す1語
  • --learnable_property: モデルを学習させて、新しい「スタイル」(例:ゴッホの絵画スタイル)や「オブジェクト」(例:あなたの犬)を学習させるかどうか

学習スクリプト

他の一部の学習スクリプトとは異なり、TextualInversionDataset は、データセットの作成に使用される独自のデータセットクラスです。画像サイズ、プレースホルダートークン、補間方法、画像のクロップの有無などをカスタマイズできます。データセットの作成方法を変更する必要がある場合は、TextualInversionDataset を修正できます。

次に、main() 関数に、データセットの前処理コードと学習ループが記載されています。

スクリプトは、tokenizer、schedulerとモデルを読み込むことから始まります:

# Load tokenizer
if args.tokenizer_name:
    tokenizer = CLIPTokenizer.from_pretrained(args.tokenizer_name)
elif args.pretrained_model_name_or_path:
    tokenizer = CLIPTokenizer.from_pretrained(args.pretrained_model_name_or_path, subfolder="tokenizer")

# Load scheduler and models
noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler")
text_encoder = CLIPTextModel.from_pretrained(
    args.pretrained_model_name_or_path, subfolder="text_encoder", revision=args.revision
)
vae = AutoencoderKL.from_pretrained(args.pretrained_model_name_or_path, subfolder="vae", revision=args.revision)
unet = UNet2DConditionModel.from_pretrained(
    args.pretrained_model_name_or_path, subfolder="unet", revision=args.revision
)

特殊なプレースホルダトークンがトークナイザに追加され、新しいトークンを考慮するために埋め込みが再調整されます。

次に、スクリプトはTextualInversionDatasetからデータセットを作成します。

train_dataset = TextualInversionDataset(
    data_root=args.train_data_dir,
    tokenizer=tokenizer,
    size=args.resolution,
    placeholder_token=(" ".join(tokenizer.convert_ids_to_tokens(placeholder_token_ids))),
    repeats=args.repeats,
    learnable_property=args.learnable_property,
    center_crop=args.center_crop,
    set="train",
)
train_dataloader = torch.utils.data.DataLoader(
    train_dataset, batch_size=args.train_batch_size, shuffle=True, num_workers=args.dataloader_num_workers
)

最後に、training loopは、ノイズ付き残差の予測から、特別なプレースホルダートークンの埋め込み重みの更新まで、それ以外のすべての処理を担当します。

トレーニングループの仕組みについてさらに詳しく知りたい場合は、デノイジングプロセスの基本的なパターンを解説しているパイプライン、モデル、スケジューラーの理解チュートリアルをご覧ください。

スクリプトを実行します

すべての変更が完了したか、デフォルトの設定で問題ない場合は、トレーニングスクリプトの起動準備が整いました! 🚀

このガイドでは、猫のおもちゃの画像をダウンロードしてディレクトリに保存します。ただし、必要に応じて独自のデータセットを作成して使用することもできます(学習用データセットの作成ガイドを参照)。

from huggingface_hub import snapshot_download

local_dir = "./cat"
snapshot_download(
    "diffusers/cat_toy_example", local_dir=local_dir, repo_type="dataset", ignore_patterns=".gitattributes"
)

環境変数MODEL_NAMEに Hub 上のモデル ID またはローカルモデルへのパスを、DATA_DIRに先ほど猫の画像をダウンロードしたパスを設定します。このスクリプトは、リポジトリに以下のファイルを作成して保存します。

  • learned_embeds.bin: サンプル画像に対応する学習済み埋め込みベクトル
  • token_identifier.txt: 特別なプレースホルダトークン
  • type_of_concept.txt: 学習対象の概念の種類(“object”または“style”)

完全なトレーニングの実行には、単一のV100 GPUで約1時間かかります。

スクリプトを実行する前に、もう1点だけ。トレーニングの進捗を追いかけたい場合は、トレーニング中に生成された画像を定期的に保存できます。トレーニングコマンドに次のパラメータを追加してください。

--validation_prompt="A <cat-toy> train"
--num_validation_images=4
--validation_steps=100
export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5"
export DATA_DIR="./cat"

accelerate launch textual_inversion.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --train_data_dir=$DATA_DIR \
  --learnable_property="object" \
  --placeholder_token="<cat-toy>" \
  --initializer_token="toy" \
  --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_cat" \
  --push_to_hub

トレーニングが完了すると、新しくトレーニングしたモデルを次のようにして推論に使用できます。

from diffusers import StableDiffusionPipeline
import torch

pipeline = StableDiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_textual_inversion("sd-concepts-library/cat-toy")
image = pipeline("A <cat-toy> train", num_inference_steps=50).images[0]
image.save("cat-train.png")

次のステップ

ご自身のTextual Inversionモデルの学習が完了したことをお祝いします!🎉 新しいモデルの使用方法について詳しく知るために、以下のガイドが役立つ可能性があります:

Update on GitHub