使用 Hugging Face Diffusers 訓練 ControlNet

Hugging Face 已在 diffusers 函式庫中發布了詳細的指南與訓練腳本,讓開發者能夠訓練自己的 ControlNet 模型。ControlNet 是一種神經網路結構,透過加入額外條件(例如姿勢估計、深度圖或草圖)到生成過程中,實現對擴散模型的細緻控制。

三步驟 ControlNet 訓練工作流程

為 Stable Diffusion 訓練自訂的 ControlNet 包含三個主要階段:規劃條件、建立資料集以及執行訓練。

1. 規劃條件

第一步是定義任務所需的特定條件。這包括決定想要的控制機制,並確認是否有現有模型能將一般影像轉換為該條件。例如,Hugging Face 團隊的目標是建立一個臉部特徵點模型,使 Stable Diffusion 能夠遵循特定的臉部表情或姿勢。

2. 建立資料集

ControlNet 資料集需要三個特定欄位:

  • Ground Truth Image:目標影像(例如,臉部)。
  • Conditioning Image:代表條件的影像(例如,視覺化的臉部特徵點遮罩)。
  • Prompt:描述影像的文字說明。

在「Uncanny Faces」範例中,團隊使用了 Microsoft 的 FaceSynthetics 資料集,內含 10 萬張合成臉孔。由於沒有現有模型能直接將臉部轉換為資料集特定的特徵點格式,團隊採用了最先進的 SPIGA 模型提取 iBUG 格式的 68 點臉部特徵,將這些特徵點轉換為插圖遮罩,並使用 BLIP 產生每張影像的說明文字。

3. 訓練模型

訓練透過 diffusers 範例中提供的 train_controlnet.py 腳本進行。團隊使用單張 A100 GPU,訓練 3 個 epoch,批次大小為 4。

訓練觀察與過擬合

團隊發現訓練 3 個 epoch 會導致過擬合,模型開始忽略風格,且忘記與真實臉孔不同的概念(例如,無法在提示時產生「貓」或「史瑞克」)。在大約 1 個 epoch(約 25K 步)後即達到收斂,此時模型能成功遵循姿勢且不會過擬合。由於 FaceSynthetics 資料集為合成影像,最終模型產生的是「怪異」的 3D 風格臉孔,而非寫實的臉部。

技術實作與硬體最佳化

訓練設定

train_controlnet.py 腳本使用多個關鍵參數來控制輸出:

  • pretrained_model_name_or_path:基礎的 Stable Diffusion 模型(為了更好的臉部渲染,使用了 v2-1-base)。
  • learning_rate:範例設定為 1e-5,建議的範圍為 1e-42e-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,同時大幅降低記憶體負擔。

Sources