AI/ML実装チュートリアル集

Hugging Face DiffusersとLoRAで始めるStable Diffusionファインチューニング:個人画像を学習させる実践チュートリアル

Tags: Stable Diffusion, LoRA, ファインチューニング, 画像生成AI, Hugging Face Diffusers

導入

画像生成AIの進化は目覚ましく、中でもStable Diffusionはその汎用性と高性能から多くの注目を集めています。しかし、汎用モデルでは特定のキャラクターや人物、スタイルを正確に表現することは困難です。そこで、既存のモデルに少量の追加データを学習させることで、特定のコンセプトに特化させる「ファインチューニング」が重要になります。

この記事では、Hugging Faceが提供する強力なライブラリであるDiffusersと、効率的なファインチューニング手法であるLoRA (Low-Rank Adaptation) を組み合わせ、読者自身の画像をStable Diffusionモデルに学習させる実践的なチュートリアルを提供します。これにより、特定の人物やオブジェクトを特徴づけた画像を生成できるようになります。

この記事を通じて学習できること

環境構築

本チュートリアルでは、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

補足: bitsandbytesxformers は、GPUメモリの使用量を削減し、学習速度を向上させるために推奨されます。--index-url はPyTorchのバージョンとCUDAバージョンに合わせて変更してください。CPU環境の場合は、--index-url を指定せず、torch もCPU版をインストールします。bitsandbytesxformers はGPU専用ライブラリのため、CPU環境ではインストール不要です。

3. Accelerateの設定

Hugging Face accelerate は、分散学習や混合精度学習(fp16など)を容易にするためのツールです。初回使用時に設定が必要です。

accelerate config

対話形式で設定を求められます。基本的な設定は以下の通りです。

設定が完了すると、設定ファイルが生成されます。

実装手順(チュートリアル本体)

ここでは、Hugging Face DiffusersのDreambooth LoRAトレーニングスクリプトを用いて、特定の個人画像を学習させる手順を解説します。

1. データセットの準備

学習させる個人画像を用意します。画像は、多様な角度、表情、背景で10〜20枚程度あると良いでしょう。

  1. ディレクトリ構造の作成: 学習用画像と出力モデルを保存するディレクトリを作成します。

    bash mkdir -p lora_finetune_project/instance_images mkdir -p lora_finetune_project/output_models

  2. 学習用画像の配置: lora_finetune_project/instance_images ディレクトリに、用意した個人画像をすべて配置します。画像はすべて同じ解像度(例: 512x512ピクセル)にリサイズされていることが理想ですが、Diffusersのスクリプトは自動でリサイズ処理を行うため、必須ではありません。

  3. プロンプトの設計: ファインチューニングでは、学習する対象を識別するための「インスタンスプロンプト」と、その対象が属するカテゴリを示す「クラスプロンプト」を使用します。

    • インスタンスプロンプト: 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"

コマンド引数の解説

学習が開始されると、ターミナルにログが表示され、指定した 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.")

コード解説

  1. ライブラリのインポート: torchDiffusionPipeline, AutoPipelineForText2Image をインポートします。
  2. モデルパスの指定: ベースとなるStable DiffusionモデルのIDと、学習済みLoRAモデルが保存されているディレクトリのパスを指定します。
  3. パイプラインのロードと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に移動させます。
  4. プロンプトの定義:
    • prompt: 生成したい画像の指示を記述します。学習時に使用したインスタンスプロンプト (sks person) を含めることで、学習したコンセプトを呼び出します。具体的な状況やスタイルを追加することで、多様な画像を生成できます。
    • negative_prompt: 生成してほしくない要素を指定します。画像の品質向上に役立ちます。
  5. 画像生成:
    • pipe(prompt=prompt, ...).images[0] で画像を生成します。
    • num_inference_steps: 推論ステップ数。数値を大きくすると品質が向上する傾向がありますが、時間がかかります(一般的に20〜50程度)。
    • guidance_scale: プロンプトへの忠実度を制御します。数値を大きくするとプロンプトに忠実になりますが、多様性が失われる場合があります(一般的に7.0〜8.5程度)。
    • 生成された画像は指定したファイル名で保存されます。

動作確認と結果

上記のファインチューニングプロセスが正常に完了し、推論スクリプトを実行すると、generated_sks_person_*.png といったファイル名の画像が生成されます。

これらの画像は、学習させた個人(sks person)の特徴を反映しつつ、プロンプトで指定した「自転車に乗っている」「森の中」といったシチュエーションで生成されることを確認できます。例えば、以下のような出力が期待されます。

生成された画像の品質は、学習データの枚数、品質、学習ステップ数、学習率、そしてプロンプトの設計に大きく依存します。期待通りの結果が得られない場合は、これらのパラメータを調整することを検討してください。

応用例・発展的な内容

このチュートリアルで学んだLoRAファインチューニングは、様々な応用が可能です。

トラブルシューティング/FAQ

Q1: CUDA out of memory エラーが発生します。

A1: GPUメモリが不足している可能性があります。以下の対策を試してください。

Q2: 生成される画像が期待通りになりません。

A2: いくつかの要因が考えられます。

Q3: accelerate launch コマンドで train_dreambooth_lora.py が見つかりません。

A3: diffusers ライブラリが正しくインストールされていないか、accelerate がスクリプトを見つけられない可能性があります。

まとめ

本記事では、Hugging Face DiffusersとLoRA手法を用いて、Stable Diffusionモデルに個人画像をファインチューニングし、オリジナルの画像を生成する一連の手順を解説しました。環境構築からデータセットの準備、ファインチューニングの実行、そして学習済みモデルを用いた画像生成まで、実践的なステップを追体験いただけたことと存じます。

LoRAは、少ない計算リソースで効率的にモデルを特定のタスクに特化させることができる強力な手法です。この知識を活用することで、読者の皆様はご自身の創造性をさらに広げ、多様な画像生成AIの応用に取り組むことが可能になります。ぜひ、様々なコンセプトやスタイルでファインチューニングを試し、独自のAIアートワークや実用的な画像を生成してみてください。