使用 Diffusers 的 Stable Diffusion
TL;DR
Hugging Face 發布了一份使用 🤗 Diffusers 套件執行 Stable Diffusion v1‑4(以及後續版本)的指南,詳細說明了安裝、授權、推論程式碼以及底層的潛在擴散架構。
授權要求
Stable Diffusion 模型依據一項授權條款發佈,該條款 (1) 禁止非法或有害的生成,(2) 賦予使用者對生成結果的完整權利,同時要求其負責任使用,(3) 允許商業使用與模型權重的再分發,前提是將相同的限制傳遞給下游使用者。
使用 Diffusers 的快速入門
- 安裝所需套件:
pip install diffusers==0.10.2 transformers scipy ftfy accelerate
- 載入管線(示範 v1‑4;其他版本如 1.5、2、2.1 亦可類似使用):
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
pipe.to("cuda")
- 若 GPU 記憶體小於 10 GB,載入 fp16 檢查點:
pipe = StableDiffusionPipeline.from_pretrained(
"CompVis/stable-diffusion-v1-4", revision="fp16", torch_dtype=torch.float16
)
- 產生影像:
prompt = "a photograph of an astronaut riding a horse"
image = pipe(prompt).images[0]
- 透過為
torch.Generator設定種子並傳入管線,可獲得確定性的輸出。 guidance_scale參數(預設 7.5)控制無分類器指導;建議的取值介於 7 到 8.5 之間。- 去噪步數 (
num_inference_steps) 預設為 50;減少步數可加速生成,但會犧牲品質。 - 透過指定
height與width(皆須為 8 的倍數)可產生非方形影像。將其中一個維度設為 512,另一維度設為較大的 8 的倍數,通常可得到最佳效果。
了解 Stable Diffusion 的架構
Stable Diffusion 是一種 潛在擴散 模型,透過在壓縮的潛在空間(空間縮減 8×8,例如 512×512 圖像會變為 64×64 潛在張量)中運作,以降低記憶體與計算需求。它由三個核心組件構成:
- 變分自編碼器 (VAE) – 將圖像編碼為潛在向量,並將潛在向量解碼回像素空間;在推論時僅需解碼器。
- U‑Net – 為每個擴散步驟預測噪聲殘差;包含根據文字嵌入條件化的交叉注意力層。
- 文字編碼器 – 預訓練的 CLIP 文字模型 (
CLIPTextModel),將提示詞轉換為 77×768 的嵌入向量;在訓練期間編碼器保持凍結。
在推論時,隨機的潛在種子與文字嵌入會被送入 U‑Net,U‑Net 會使用排程器(預設 PNDM,亦可選擇 DDIM 或 K‑LMS)在約 50 步內迭代去噪潛在向量。最終的潛在向量再由 VAE 解碼,產生 512×512 的影像。
自訂管線
進階使用者可以透過 subfolder 參數,從模型倉庫載入個別元件(例如 VAE、排程器、UNet)以取代預設組件:
from diffusers import AutoencoderKL, UNet2DConditionModel, PNDMScheduler
vae = AutoencoderKL.from_pretrained("CompVis/stable-diffusion-v1-4", subfolder="vae")
unet = UNet2DConditionModel.from_pretrained("CompVis/stable-diffusion-v1-4", subfolder="unet")
scheduler = LMSDiscreteScheduler(beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear", num_train_timesteps=1000)
部落格中的範例展示了使用 K‑LMS 排程器、無分類器指導以及手動潛在向量處理的完整推論迴圈。
實用技巧
- 在記憶體受限的 GPU 上使用
torch.float16。 - 將
height/width設為 8 的倍數,以避免形狀不匹配。 - 提高
guidance_scale可加強對提示詞的遵循,但可能降低多樣性。 - 減少
num_inference_steps可加速產出;增加則可提升畫質。 - 管線會回傳一個 dictionary,其中包含
images與nsfw_content_detected標誌。
資源
- Colab 筆記本:https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/stable_diffusion.ipynb
- Diffusers 入門指南:https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/diffusers_intro.ipynb
- 註解式 Diffusion Model 部落格文章:https://huggingface.co/blog/annotated-diffusion
- Diffusers GitHub 倉庫:https://github.com/huggingface/diffusers
引用
@article{patil2022stable,
author = {Patil, Suraj and Cuenca, Pedro and Lambert, Nathan and von Platen, Patrick},
title = {Stable Diffusion with 🧨 Diffusers},
journal = {Hugging Face Blog},
year = {2022},
note = {https://huggingface.co/blog/stable_diffusion}
}