Hugging Face DiffusersとLoRAで始めるStable Diffusionファインチューニング:個人画像を学習させる実践チュートリアル
導入
画像生成AIの進化は目覚ましく、中でもStable Diffusionはその汎用性と高性能から多くの注目を集めています。しかし、汎用モデルでは特定のキャラクターや人物、スタイルを正確に表現することは困難です。そこで、既存のモデルに少量の追加データを学習させることで、特定のコンセプトに特化させる「ファインチューニング」が重要になります。
この記事では、Hugging Faceが提供する強力なライブラリであるDiffusersと、効率的なファインチューニング手法であるLoRA (Low-Rank Adaptation) を組み合わせ、読者自身の画像をStable Diffusionモデルに学習させる実践的なチュートリアルを提供します。これにより、特定の人物やオブジェクトを特徴づけた画像を生成できるようになります。
この記事を通じて学習できること
- Hugging Face Diffusersを用いたStable Diffusionのファインチューニング環境構築
- LoRA手法の基本的な理解と、その実践的な適用方法
- DreamboothとLoRAを組み合わせた個人画像学習データの準備方法
- 学習済みLoRAモデルを使ったオリジナルの画像生成手順
環境構築
本チュートリアルでは、Pythonの仮想環境を使用し、必要なライブラリをインストールします。GPU環境(NVIDIA CUDA対応GPU)が推奨されますが、CPUでも基本的な手順は追体験可能です。
1. Python仮想環境の準備
まず、Python 3.9以降のバージョンを使用することを推奨します。venv
を使用して新しい仮想環境を作成し、アクティブ化します。
# 仮想環境を作成
python -m venv lora_finetune_env
# 仮想環境をアクティブ化
# Linux / macOS
source lora_finetune_env/bin/activate
# Windows (PowerShell)
.\lora_finetune_env\Scripts\Activate.ps1
# Windows (Command Prompt)
.\lora_finetune_env\Scripts\activate.bat
2. 必要なライブラリのインストール
仮想環境をアクティブ化した後、以下のライブラリをインストールします。
# PyTorchのインストール(CUDA対応版を推奨)
# NVIDIA GPUの場合、公式ドキュメントを参照し、適切なCUDAバージョンを選択してください。
# 例: CUDA 11.8の場合
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# Diffusers, Transformers, Accelerateのインストール
pip install diffusers transformers accelerate
# 効率的な学習のための追加ライブラリ
# bitsandbytes: 量子化によるメモリ削減
# xformers: 高速化モジュール (NVIDIA GPUのみ)
pip install bitsandbytes==0.41.3 xformers==0.0.22 --index-url https://download.pytorch.org/whl/cu118
補足: bitsandbytes
と xformers
は、GPUメモリの使用量を削減し、学習速度を向上させるために推奨されます。--index-url
はPyTorchのバージョンとCUDAバージョンに合わせて変更してください。CPU環境の場合は、--index-url
を指定せず、torch
もCPU版をインストールします。bitsandbytes
や xformers
はGPU専用ライブラリのため、CPU環境ではインストール不要です。
3. Accelerateの設定
Hugging Face accelerate
は、分散学習や混合精度学習(fp16
など)を容易にするためのツールです。初回使用時に設定が必要です。
accelerate config
対話形式で設定を求められます。基本的な設定は以下の通りです。
In which compute environment are you running?
:This machine
Do you want to run your training on CPU only?
:no
(GPUがある場合)Do you want to use DeepSpeed?
:no
(今回は使用しません)Do you want to use Fully Sharded Data Parallel (FSDP)?
:no
Do you want to use Megatron-LM?
:no
What precision should be used during training?
:fp16
(推奨、GPUメモリが少ない場合も有効)
設定が完了すると、設定ファイルが生成されます。
実装手順(チュートリアル本体)
ここでは、Hugging Face DiffusersのDreambooth LoRAトレーニングスクリプトを用いて、特定の個人画像を学習させる手順を解説します。
1. データセットの準備
学習させる個人画像を用意します。画像は、多様な角度、表情、背景で10〜20枚程度あると良いでしょう。
-
ディレクトリ構造の作成: 学習用画像と出力モデルを保存するディレクトリを作成します。
bash mkdir -p lora_finetune_project/instance_images mkdir -p lora_finetune_project/output_models
-
学習用画像の配置:
lora_finetune_project/instance_images
ディレクトリに、用意した個人画像をすべて配置します。画像はすべて同じ解像度(例: 512x512ピクセル)にリサイズされていることが理想ですが、Diffusersのスクリプトは自動でリサイズ処理を行うため、必須ではありません。 -
プロンプトの設計: ファインチューニングでは、学習する対象を識別するための「インスタンスプロンプト」と、その対象が属するカテゴリを示す「クラスプロンプト」を使用します。
- インスタンスプロンプト:
a photo of sks person
sks
は、モデルが学習する「新しい概念」を識別するためのユニークなトークン(SKSはS(pecial) K(eyword) S(ystem)の略で、一般的に使用されるプレフィックスです)。person
は、学習対象のカテゴリです。
- クラスプロンプト:
a photo of a person
- これは汎用的な「人」の画像を生成するためのプロンプトで、モデルが特定のコンセプトに過学習するのを防ぐために利用されます(クラスの先読み推論)。
- インスタンスプロンプト:
2. LoRAファインチューニングの実行
Hugging Face Diffusersは、Dreambooth LoRAトレーニングのための便利なスクリプトを提供しています。このスクリプトは、diffusers
ライブラリのインストール時に同時にダウンロードされます。
以下のコマンドを実行して、ファインチューニングを開始します。
accelerate launch --mixed_precision="fp16" train_dreambooth_lora.py \
--pretrained_model_name_or_path="runwayml/stable-diffusion-v1-5" \
--instance_data_dir="lora_finetune_project/instance_images" \
--output_dir="lora_finetune_project/output_models" \
--instance_prompt="a photo of sks person" \
--resolution=512 \
--train_batch_size=1 \
--gradient_accumulation_steps=1 \
--learning_rate=1e-4 \
--lr_scheduler="constant" \
--lr_warmup_steps=0 \
--max_train_steps=500 \
--validation_prompt="a photo of sks person in a forest" \
--validation_epochs=50 \
--seed=42 \
--with_prior_preservation \
--prior_generation_prompt="a photo of a person" \
--prior_data_dir="lora_finetune_project/prior_images" \
--num_class_images=200 \
--not_cache_latents \
--lora_rank=4 \
--mixed_precision="fp16"
コマンド引数の解説
accelerate launch --mixed_precision="fp16"
:accelerate
を使用して、混合精度 (fp16
) でスクリプトを実行します。これにより、GPUメモリの使用量が削減され、学習が高速化されます。train_dreambooth_lora.py
: Diffusersに含まれるDreambooth LoRA学習スクリプトです。--pretrained_model_name_or_path="runwayml/stable-diffusion-v1-5"
: ベースとなるStable Diffusionモデルの指定です。Hugging Face Model Hub上のモデルIDを指定します。--instance_data_dir="lora_finetune_project/instance_images"
: 学習用インスタンス画像が格納されているディレクトリのパスです。--output_dir="lora_finetune_project/output_models"
: 学習済みモデルが保存されるディレクトリのパスです。--instance_prompt="a photo of sks person"
: インスタンスを識別するためのプロンプトです。sks
は学習対象を特定するユニークなトークンです。--resolution=512
: 学習画像の解像度です。Stable Diffusion v1.x系では512x512が標準です。--train_batch_size=1
: 1ステップあたりのバッチサイズです。GPUメモリが少ない場合は1に設定します。--gradient_accumulation_steps=1
: 勾配を蓄積するステップ数です。バッチサイズを実質的に増やす効果があります。GPUメモリが少ない場合にバッチサイズを1にし、これを増やすことで効果的に大きなバッチサイズを模倣できます。--learning_rate=1e-4
: 学習率です。LoRAではベースモデルの重みを更新しないため、通常のファインチューニングより高めの学習率を設定することが一般的です。--lr_scheduler="constant"
: 学習率スケジューラの種類です。constant
,linear
,cosine
などがあります。--lr_warmup_steps=0
: 学習率ウォームアップのステップ数です。--max_train_steps=500
: 最大学習ステップ数です。画像の枚数や品質に応じて調整します。通常、10〜20枚の画像であれば500〜1000ステップ程度が目安です。--validation_prompt="a photo of sks person in a forest"
: 学習中に検証画像を生成するためのプロンプトです。--validation_epochs=50
: 指定したエポックごとに検証画像を生成します。--seed=42
: 乱数シードを設定し、再現性を確保します。--with_prior_preservation
: 事前保存(Prior Preservation)を有効にします。これにより、クラスの過学習を防ぎ、多様な画像を生成できるようになります。--prior_generation_prompt="a photo of a person"
: 事前保存に使用するクラス画像を生成するためのプロンプトです。--prior_data_dir="lora_finetune_project/prior_images"
: 事前保存用のクラス画像が格納されるディレクトリです。存在しない場合は自動で生成されます。--num_class_images=200
: 事前保存用に生成するクラス画像の枚数です。--not_cache_latents
: 事前保存用の潜在表現をキャッシュしない設定です。メモリを節約します。--lora_rank=4
: LoRAのランク(次元数)です。値が大きいほど表現力が増しますが、ファイルサイズも大きくなります。一般的に4, 8, 16などが使われます。--mixed_precision="fp16"
: 学習時にFP16精度を使用します。
学習が開始されると、ターミナルにログが表示され、指定した output_dir
にモデルのチェックポイントが保存されます。
3. 学習済みLoRAモデルによる画像生成
ファインチューニングが完了したら、学習済みのLoRAモデルを使って新しい画像を生成します。
以下のPythonスクリプトを実行します。
import torch
from diffusers import DiffusionPipeline, AutoPipelineForText2Image
# ベースモデルと学習済みLoRAモデルのパスを指定
base_model_id = "runwayml/stable-diffusion-v1-5"
lora_model_path = "lora_finetune_project/output_models" # 学習済みLoRAモデルが保存されているディレクトリ
# パイプラインをロード
# AutoPipelineForText2Image を使用すると、自動的に適切なパイプラインが選択されます。
# LoRAモデルをロードする際には、base_model_idをpretrained_model_name_or_pathとして指定し、
# lora_model_pathをadapter_nameとして指定します。
pipe = AutoPipelineForText2Image.from_pretrained(
base_model_id,
torch_dtype=torch.float16,
variant="fp16" # VAEのfp16 variantを使用
)
pipe.load_lora_weights(lora_model_path, adapter_name="my_lora_adapter") # adapter_nameは任意
pipe.to("cuda") # GPUにモデルを移動
# プロンプトの定義
prompt = "a photo of sks person riding a bicycle in a park, intricate details, highly detailed, professional photography"
negative_prompt = "low quality, blurry, pixelated, bad anatomy, deformed"
# 画像生成
num_images = 3
for i in range(num_images):
image = pipe(prompt=prompt, negative_prompt=negative_prompt, num_inference_steps=30, guidance_scale=7.5).images[0]
image.save(f"generated_sks_person_{i+1}.png")
print(f"Generated image saved as generated_sks_person_{i+1}.png")
print(f"{num_images} images generated successfully.")
コード解説
- ライブラリのインポート:
torch
とDiffusionPipeline
,AutoPipelineForText2Image
をインポートします。 - モデルパスの指定: ベースとなるStable DiffusionモデルのIDと、学習済みLoRAモデルが保存されているディレクトリのパスを指定します。
- パイプラインのロードとLoRAの適用:
AutoPipelineForText2Image.from_pretrained
でベースモデルをロードします。torch_dtype=torch.float16
はGPUメモリを節約するために推奨されます。pipe.load_lora_weights(lora_model_path, adapter_name="my_lora_adapter")
で学習済みのLoRA重みをロードし、パイプラインに適用します。adapter_name
は、複数のLoRAモデルをロードする際に識別するために使用できます。pipe.to("cuda")
でモデルをGPUに移動させます。
- プロンプトの定義:
prompt
: 生成したい画像の指示を記述します。学習時に使用したインスタンスプロンプト (sks person
) を含めることで、学習したコンセプトを呼び出します。具体的な状況やスタイルを追加することで、多様な画像を生成できます。negative_prompt
: 生成してほしくない要素を指定します。画像の品質向上に役立ちます。
- 画像生成:
pipe(prompt=prompt, ...).images[0]
で画像を生成します。num_inference_steps
: 推論ステップ数。数値を大きくすると品質が向上する傾向がありますが、時間がかかります(一般的に20〜50程度)。guidance_scale
: プロンプトへの忠実度を制御します。数値を大きくするとプロンプトに忠実になりますが、多様性が失われる場合があります(一般的に7.0〜8.5程度)。- 生成された画像は指定したファイル名で保存されます。
動作確認と結果
上記のファインチューニングプロセスが正常に完了し、推論スクリプトを実行すると、generated_sks_person_*.png
といったファイル名の画像が生成されます。
これらの画像は、学習させた個人(sks person
)の特徴を反映しつつ、プロンプトで指定した「自転車に乗っている」「森の中」といったシチュエーションで生成されることを確認できます。例えば、以下のような出力が期待されます。
- 特定の人物が、指定した服装で公園を散歩している画像
- 学習させたペットが、異なる背景やポーズで描かれている画像
生成された画像の品質は、学習データの枚数、品質、学習ステップ数、学習率、そしてプロンプトの設計に大きく依存します。期待通りの結果が得られない場合は、これらのパラメータを調整することを検討してください。
応用例・発展的な内容
このチュートリアルで学んだLoRAファインチューニングは、様々な応用が可能です。
- 特定のスタイルやアートワークの学習: 漫画、イラスト、油絵などの特定のアートスタイルを学習させることで、そのスタイルで新しい画像を生成できるようになります。
- 製品イメージの生成: 特定の製品画像を学習させることで、異なる背景やシチュエーションでの製品画像を効率的に生成し、マーケティング素材の作成に活用できます。
- キャラクターデザイン: オリジナルのキャラクターを学習させ、様々なポーズ、表情、服装でそのキャラクターを描き出すことができます。
- SDXLモデルでのLoRA: Stable Diffusion XL (SDXL) はより高品質な画像を生成できます。Hugging Face DiffusersはSDXLモデルのLoRAファインチューニングもサポートしており、同様の手順で応用可能です。
- Webアプリケーションへの組み込み: 学習済みLoRAモデルをデプロイし、APIとしてWebアプリケーションから利用することで、ユーザーがオリジナルの画像を生成できるサービスを提供できます。
トラブルシューティング/FAQ
Q1: CUDA out of memory
エラーが発生します。
A1: GPUメモリが不足している可能性があります。以下の対策を試してください。
--train_batch_size
を1
に設定してください。--gradient_accumulation_steps
の値を増やしてください(例:2
や4
)。これにより、実質的なバッチサイズを維持しつつ、GPUメモリの使用量を減らせます。--mixed_precision="fp16"
を設定しているか確認してください。bitsandbytes
をインストールし、量子化学習を有効にしているか確認してください。xformers
をインストールし、高速化を有効にしているか確認してください。- バックグラウンドで実行中の他のGPUを使用するプロセスを終了してください。
Q2: 生成される画像が期待通りになりません。
A2: いくつかの要因が考えられます。
- 学習データの品質と量: 学習データの枚数が少なすぎる(10枚未満)、または画像の品質が低い、背景が一貫していないなどの問題がないか確認してください。多様な角度、表情、背景の画像を用意することが重要です。
- インスタンスプロンプト: インスタンスプロンプトが十分ユニークでない可能性があります。
sks
などのユニークな識別子を使用しているか確認してください。 - 学習ステップ数:
--max_train_steps
が少なすぎる可能性があります。画像の枚数に応じてステップ数を増やしてみてください(例: 20枚の画像で1000ステップ)。ただし、過学習には注意が必要です。 - 学習率:
--learning_rate
を調整してみてください。高すぎると学習が不安定になり、低すぎると学習が進みません。 - プロンプトの調整: 生成時のプロンプト(特にネガティブプロンプト)を調整し、より具体的な指示を与えることで品質が向上する場合があります。
Q3: accelerate launch
コマンドで train_dreambooth_lora.py
が見つかりません。
A3: diffusers
ライブラリが正しくインストールされていないか、accelerate
がスクリプトを見つけられない可能性があります。
pip install diffusers
が完了していることを確認してください。- スクリプトは
diffusers
のインストールディレクトリ内にあるため、通常はパスの心配は不要です。仮想環境が正しくアクティブ化されているか確認してください。 - または、GitHubからDiffusersリポジトリをクローンし、その中のスクリプトを直接指定することもできます。
bash git clone https://github.com/huggingface/diffusers.git cd diffusers/examples/dreambooth accelerate launch --mixed_precision="fp16" train_dreambooth_lora.py ...
まとめ
本記事では、Hugging Face DiffusersとLoRA手法を用いて、Stable Diffusionモデルに個人画像をファインチューニングし、オリジナルの画像を生成する一連の手順を解説しました。環境構築からデータセットの準備、ファインチューニングの実行、そして学習済みモデルを用いた画像生成まで、実践的なステップを追体験いただけたことと存じます。
LoRAは、少ない計算リソースで効率的にモデルを特定のタスクに特化させることができる強力な手法です。この知識を活用することで、読者の皆様はご自身の創造性をさらに広げ、多様な画像生成AIの応用に取り組むことが可能になります。ぜひ、様々なコンセプトやスタイルでファインチューニングを試し、独自のAIアートワークや実用的な画像を生成してみてください。