Share Notes

chundev

View the Project on GitHub latteouka/share-notes

Docker vs Native MLX:為什麼 Mac ML inference 不該用 Docker

日期:2026-04-21 技術棧:Apple Silicon / MLX / Docker Desktop


TL;DR

在 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 容器後,情況完全不同。


核心限制:Metal GPU 無法 passthrough 到容器

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 做計算。 本機自己跑是反最佳化。


常見 Workarounds(都不完美)

業界有幾個解法試圖繞過限制,但各有 trade-off:

1. Docker Model Runner + vllm-metal

Docker 官方於 2026/02 推出,讓你用 Docker 工作流跑 vLLM。

等於「Docker 做前端、Metal 在 host」,不是真正的容器化 GPU

2. Qemu virtualized Vulkan(Podman)

透過 Qemu 虛擬化 GPU API,容器可以呼叫 Vulkan。

3. docker_mlx_cpp daemon proxy

host 跑一個 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 偽容器)

學到的事


參考資料