在 Apple Silicon 上使用 Stable Diffusion Core ML – 如何執行與最佳化

TL;DR

Hugging Face 發布了針對 Apple Silicon 的 Core ML 版本 Stable Diffusion(v1.4、v1.5、v2‑base、v2.1‑base),可在本機執行,並提供了 Python 與 Swift 推論腳本以及即用型的 Mac App Store 應用程式。


可用的 Core ML 檢查點

  • Stable Diffusion v1.4 – 轉換模型位於 apple/coreml-stable-diffusion-v1-4
  • Stable Diffusion v1.5 – 轉換模型位於 apple/coreml-stable-diffusion-v1-5
  • Stable Diffusion v2 base – 轉換模型位於 apple/coreml-stable-diffusion-2-base
  • Stable Diffusion v2.1 base – 轉換模型位於 apple/coreml-stable-diffusion-2-1-base

所有檢查點皆託管於 Hugging Face Hub,且可在任何 Apple Silicon 裝置上使用 CPU、GPU 或 Apple Neural Engine(NE)執行。提供不同的變體(注意力實作與封裝方式)以符合硬體與語言特定需求。


效能變體與建議

  • 注意力實作original(僅支援 CPU/GPU,有時較快) vs. split_einsum(相容於 CPU、GPU 與 NE)。請依裝置能力選擇。
  • 封裝方式packages 用於 Python 推論;compiled 用於 Swift(將大型 UNet 拆分為多個 .mlmodelc 檔案,以符合 iOS/iPadOS 相容性)。
  • 最佳基準 – 在搭載 macOS Ventura 13.1 Beta 4 的 MacBook Pro (M1 Max,32 GPU 核心,64 GB 記憶體)上,使用 original 注意力與全部運算單元時,Stable Diffusion v1.4 可在 18 秒 內產生一張影像。

⚠️ 注意 macOS Ventura 13.1 引入了執行這些模型所需的 Core ML 改進;較舊的 macOS 版本可能會產生全黑影像或執行速度較慢。


Python 推論工作流程

前置條件

pip install huggingface_hub
pip install git+https://github.com/apple/ml-stable-diffusion

下載檢查點

from huggingface_hub import snapshot_download
from pathlib import Path

repo_id = "apple/coreml-stable-diffusion-v1-4"
variant = "original/packages"
model_path = Path("./models") / (repo_id.split('/')[-1] + "_" + variant.replace('/', '_'))
snapshot_download(repo_id, allow_patterns=f"{variant}/*", local_dir=model_path, local_dir_use_symlinks=False)
print(f"Model downloaded at {model_path}")

執行推論

python -m python_coreml_stable_diffusion.pipeline \
  --prompt "a photo of an astronaut riding a horse on mars" \
  -i models/coreml-stable-diffusion-v1-4_original_packages \
  -o ./output.png \
  --compute-unit ALL \
  --seed 93
  • --compute-unit 選項:ALLCPU_AND_GPUCPU_ONLYCPU_AND_NE
  • 若要使用其他檢查點,加入 --model-version <hub-id>(例如 runwayml/stable-diffusion-v1-5)。

Swift 推論工作流程

下載已編譯的檢查點

from huggingface_hub import snapshot_download
from pathlib import Path

repo_id = "apple/coreml-stable-diffusion-v1-4"
variant = "original/compiled"
model_path = Path("./models") / (repo_id.split('/')[-1] + "_" + variant.replace('/', '_'))
snapshot_download(repo_id, allow_patterns=f"{variant}/*", local_dir=model_path, local_dir_use_symlinks=False)
print(f"Model downloaded at {model_path}")

執行推論

git clone https://github.com/apple/ml-stable-diffusion
cd ml-stable-diffusion
swift run StableDiffusionSample \
  --resource-path models/coreml-stable-diffusion-v1-4_original_compiled \
  --compute-units all \
  "a photo of an astronaut riding a horse on mars"
  • --compute-units 取值:allcpuOnlycpuAndGPUcpuAndNeuralEngine
  • 編譯後的模型在應用程式啟動時載入更快,後續產生的延遲略有降低。

轉換自訂模型(自備模型)

如果您已微調或以其他方式客製化了 Stable Diffusion 模型(例如 DreamBooth、Textual Inversion),必須自行執行 Apple 的轉換腳本。請參考 Apple 倉庫中的官方說明:https://github.com/apple/ml-stable-diffusion#converting-models-to-coreml


後續步驟與社群機會

  • 建置原生 macOS、iPhone 與 iPad 應用程式,讓影像生成完全在裝置上完成。
  • 在 Swift 中整合更多 scheduler,以加速抽樣。
  • 將管線擴展至其他生成任務(例如 inpainting、upscaling)。
  • 探索量化與其他最佳化手段,進一步降低延遲與記憶體使用量。

發布的 Core ML 檢查點與工具降低了開發者在 Apple Silicon 上使用 Stable Diffusion 的門檻,為隱私保護、離線的生成式 AI 體驗開啟了可能性。

Sources