使用 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;減少步數可加速生成,但會犧牲品質。
  • 透過指定 heightwidth(皆須為 8 的倍數)可產生非方形影像。將其中一個維度設為 512,另一維度設為較大的 8 的倍數,通常可得到最佳效果。

了解 Stable Diffusion 的架構

Stable Diffusion 是一種 潛在擴散 模型,透過在壓縮的潛在空間(空間縮減 8×8,例如 512×512 圖像會變為 64×64 潛在張量)中運作,以降低記憶體與計算需求。它由三個核心組件構成:

  1. 變分自編碼器 (VAE) – 將圖像編碼為潛在向量,並將潛在向量解碼回像素空間;在推論時僅需解碼器。
  2. U‑Net – 為每個擴散步驟預測噪聲殘差;包含根據文字嵌入條件化的交叉注意力層。
  3. 文字編碼器 – 預訓練的 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,其中包含 imagesnsfw_content_detected 標誌。

資源

引用

@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}
}

Sources