chundev
日期:2026-04-21 技術棧:Apple Silicon / MLX / Docker Desktop
在 Mac 上跑 ML inference(TTS、LLM、vision model)時,Docker 容器無法直接存取 Metal GPU 或 Neural Engine,只能 CPU fallback,效能會降 10-20 倍。需要環境隔離時用 uv venv 取代 Docker,能保留 GPU 加速。
macOS Apple Silicon (M1-M4) 的 ML 加速靠兩個硬體:
Native Python 直接 import mlx 就能呼叫上述兩者。但放進 Docker 容器後,情況完全不同。
Docker Desktop on Mac 不是在 host 直接跑,而是在 LinuxKit VM 內跑 Linux 容器:
macOS (host) ← Metal / ANE 在這裡
└── Docker Desktop
└── LinuxKit VM ← Linux kernel
└── Container ← 只能看到 VM 暴露的硬體
Linux kernel 沒有 macOS Metal 驅動,VM 也無法直通 Apple GPU/ANE。 官方社群(ml-explore/mlx Discussion #3349)明確表態:
There is no GPU passthrough for Metal in containers.
同樣限制適用於:
以在 M4 Pro 上跑一個中文 TTS 模型合成 5500 字為例(根據社群 benchmark + native 實測推估):
| 環境 | 使用硬體 | 預估時間 | 相對 |
|---|---|---|---|
| Native MLX (M4 Pro) | Metal GPU + ANE | 5-10 分鐘 | baseline |
| Docker + CPU fallback | 僅 CPU | 1-3 小時 | 10-20× 慢 |
| 遠端 Linux + NVIDIA | CUDA | 3-7 分鐘 | 與 native 同級 |
Docker on Mac 的唯一合理用途:連到遠端 x86 + NVIDIA server 做計算。 本機自己跑是反最佳化。
業界有幾個解法試圖繞過限制,但各有 trade-off:
Docker 官方於 2026/02 推出,讓你用 Docker 工作流跑 vLLM。
等於「Docker 做前端、Metal 在 host」,不是真正的容器化 GPU。
透過 Qemu 虛擬化 GPU API,容器可以呼叫 Vulkan。
docker_mlx_cpp daemon proxyhost 跑一個 MLX daemon,容器透過 HTTP 呼叫 Metal 運算。
uv如果你只是想避免 Python 版本衝突或 package pollution(原本用 Docker 的主因),uv 已經能解:
uv venv --python 3.12 # 獨立 Python runtime
source .venv/bin/activate
uv pip install -r requirements.txt
✅ Python 版本隔離 ✅ package 隔離 ✅ 保留 Metal / ANE 加速 ✅ 啟動比 Docker 快數十倍 ✅ 無需 Linux VM overhead ✅ Apple 官方 MLX / PyTorch MPS / Core ML 都正常
Docker 的其他優點(檔案系統隔離、網路隔離)對本機 ML 開發並不重要。
| 情境 | 推薦方案 |
|---|---|
| Mac 本機跑 MLX / PyTorch MPS / Core ML | ✅ Native + uv venv |
| 需要 Linux-only 套件 + 不需要 GPU | Docker 可以 |
| 需要 NVIDIA CUDA | Docker + 遠端 GPU server |
| 部署到生產環境 | 生產用 Linux,Docker 放生產端 |
| 想用 Docker 工作流但跑 MLX | Docker Model Runner(host-native 偽容器) |
uv / conda / venv 對 Python 生態已經足夠