Hugging Face DiffusersでControlNetをトレーニングする
Hugging Faceは、開発者が独自のControlNetモデルをトレーニングできるように、diffusersライブラリ内で詳細なガイドとトレーニングスクリプトを公開しました。ControlNetは、姿勢推定、深度マップ、スケッチなどの追加条件を生成プロセスに加えることで、拡散モデルを細かく制御できるニューラルネットワーク構造です。
3ステップのControlNetトレーニングワークフロー
Stable Diffusion用のカスタムControlNetをトレーニングするには、条件の計画、データセットの構築、トレーニングの実行という3つの主要フェーズがあります。
1. 条件の計画
最初のステップは、タスクに必要な具体的な条件付けを定義することです。これには、望ましい制御メカニズムを決定し、既存のモデルが標準画像をその特定の条件に変換できるかどうかを確認することが含まれます。例えば、Hugging Faceチームは、顔のランドマーク用モデルを作成し、Stable Diffusionが特定の表情やポーズに従えるようにすることを目指しました。
2. データセットの構築
ControlNetデータセットは、次の3つの列が必要です。
- Ground Truth Image: ターゲット画像(例:顔)。
- Conditioning Image: 条件を表す画像(例:可視化された顔のランドマークマスク)。
- Prompt: 画像を説明するテキストキャプション。
「Uncanny Faces」例では、チームはMicrosoftのFaceSyntheticsデータセット(10万枚の合成顔)を使用しました。既存のモデルでは顔を直接データセット固有のランドマーク形式に変換できなかったため、チームは最先端のSPIGAモデルを使用してiBUG形式の68点顔ランドマークを抽出し、これらのランドマークをイラスト化したマスクに変換し、BLIPキャプショニングで各画像の説明文を生成しました。
3. モデルのトレーニング
トレーニングは、diffusersのサンプルに含まれるtrain_controlnet.pyスクリプトで実行されます。チームは単一のA100 GPUを使用し、バッチサイズ4で3エポックのトレーニングを行いました。
トレーニングの観察と過学習
チームは、3エポックのトレーニングでは過学習が起こり、モデルがスタイルを無視し、実際の顔とは異なる概念(例:「猫」や「シュレック」を生成できない)を忘れることを発見しました。約1エポック(約2.5万ステップ)で収束し、その時点でモデルは過学習せずにポーズに正しく従うようになりました。FaceSyntheticsデータセットが合成画像で構成されているため、得られたモデルは写真のようにリアルな顔ではなく、「不気味」な3D風の顔を生成しました。
技術的実装とハードウェア最適化
トレーニング設定
train_controlnet.pyスクリプトは、出力を制御するためのいくつかの重要なパラメータを利用します。
pretrained_model_name_or_path: 基本となるStable Diffusionモデル(顔の描画品質向上のためにv2-1-baseが使用されました)。learning_rate: 例では1e-5に設定していますが、1e-4から2e-6の範囲が推奨されます。resolution: 条件画像とグラウンドトゥルース画像の両方を512x512に設定。validation_steps: 進捗を追跡するために、モデルが検証プロンプトと画像を実行する頻度を決定します。
低スペックGPU向けVRAM最適化
主要な例ではA100が使用されましたが、diffusersスクリプトはVRAMが少ないGPUでもトレーニングできるよう最適化をサポートしています。
| GPU VRAM | 必要な最適化 / パラメータ |
|---|---|
| 16GB | train_batch_size=1, gradient_accumulation_steps=4, gradient_checkpointing, および use_8bit_adam(bitsandbytes経由)。 |
| 12GB | 16GBのすべての最適化に加えて set_grads_to_none。 |
| 8GB | diffusersのGitHubトレーニングガイドに記載された具体的な設定。 |
バッチサイズを1にし、勾配蓄積ステップを4に設定することで、A100でのトレーニング時に使用した実効バッチサイズ4をシミュレートしつつ、メモリ使用量を大幅に削減できます。