在 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選項:ALL、CPU_AND_GPU、CPU_ONLY、CPU_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取值:all、cpuOnly、cpuAndGPU、cpuAndNeuralEngine。- 編譯後的模型在應用程式啟動時載入更快,後續產生的延遲略有降低。
轉換自訂模型(自備模型)
如果您已微調或以其他方式客製化了 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 體驗開啟了可能性。