使用 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-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,同時大幅降低記憶體負擔。