Apple Silicon macOS VMs: Accelerating LLM Inference with Metal Capability Shim

透過解鎖 Metal 能力,macOS VM 中的 LLM 推論速度可提升 11-16 倍

在 macOS 客體機中使用 Apple 的 Virtualization.framework 透過 llama.cpp 執行大型語言模型 (LLM) 時,速度明顯慢於裸機性能,因為虛擬 GPU 回報的是保守的能力配置。透過使用進程範圍的相容性 shim 來回報較新的 Metal 能力,在 M1 Ultra 上,TinyLlama 1.1B 的提示詞處理 (prompt processing) 速度提升了 11.08xToken 生成速度提升了 16.36x

這種性能增益是因為 shim 允許 llama.cpp 選擇現代的 Metal 核心(例如 SIMD-group matrix 和 bfloat16 路徑),這些核心是主機硬體支援但虛擬裝置通常會隱藏的。

根本原因:半虛擬化 GPU 能力限制

Apple 的 Virtualization.framework 使用半虛擬化技術,其中客體機中的虛擬圖形裝置將工作提交給一個專門設計的驅動程式,由主機在實體 GPU 上執行。與某些 Linux 環境中使用的 PCI 直通 (VFIO) 不同,主機對硬體保持著嚴格的控制。

在原生的 macOS VM 中,虛擬裝置回報的能力配置大約相當於 Apple 5 世代系列,最大 threadgroup memory 僅為 32 KB。由於現代 Metal 應用程式會在執行時查詢裝置以選擇最有效率的核心,llama.cpp 會根據這些保守的報告預設使用較慢的舊版路徑,儘管底層的實體 Apple Silicon GPU 具備更強大的能力。

解決方案:進程範圍的 Metal 能力 Shim

為了繞過這些限制,Cua 開發了一個 Metal 能力 shim——這是一個插入應用程式與 API 之間相容層。此 shim 會攔截特定客體機進程的 Metal 能力查詢,並修改回傳值以解鎖高性能路徑。

關鍵能力變化

能力 原生客體機 解鎖後的配置
supportsFamily:1009 False True
SIMD-group matrix 關閉 開啟
SIMD-group reduction 關閉 開啟
bfloat16 關閉 開啟
Max threadgroup memory 32 KB 64 KB

該 shim 特別針對 Apple family 9 (1009) 回答 supportsFamily:,並將回報的最大 threadgroup memory 翻倍至 64 KB。這足以觸發 llama.cpp 選擇較新的 SIMD-group 和 bfloat16 路徑,而無需更改客體機核心或實體 GPU 分配。

性能基準測試

測試是在運行 macOS 26.6.1 的 Apple M1 Ultra (48-core GPU) 上進行的,客體機使用 Lume 0.5.1 中的 Tahoe 映像檔 (macOS 26.5.2)。

TinyLlama 1.1B (Q4_K_M)

工作負載 裸機主機 原生客體機 解鎖後的客體機 客體機加速比
Prompt processing (512 tok) 4,871.99 tok/s 431.86 tok/s 4,786.70 tok/s 11.08x
Token generation (128 tok) 286.71 tok/s 12.63 tok/s 206.60 tok/s 16.36x

解鎖後的 VM 在提示詞處理方面的速度達到了裸機速度的 98.25%。

Gemma 4 12B (QAT Q4_0)

工作負載 裸機主機 原生客體機 解鎖後的客體機 客體機加速比
Prompt processing (512 tok) 517.88 tok/s 71.66 tok/s 515.76 tok/s 7.20x
Token generation (128 tok) 52.38 tok/s 3.41 tok/s 49.67 tok/s 14.54x

MLX-LM 相容性

使用 MLX-LM 0.31.3 和 Llama-3.2-3B-Instruct-4bit 進行的測試顯示性能持平(約 1.0 倍率)。這表明 MLX-LM 在原生 VM 中已經在使用高效路徑,這有助於開發人員改進 shim,以避免請求半虛擬化裝置無法支援的常駐集 (residency sets)。

部署與實作

該 shim 作為研究成果發佈在 Cua 儲存庫的 libs/lume/metal-capability-shim 目錄中。實作需要以下步驟:

  1. 編譯 (Build):使用提供的建置腳本編譯特定架構的 dylibs。
  2. 主機配置 (Host Configuration):透過主機終端機啟用不受限的功能層級: defaults write com.apple.gpusw.ParavirtualizedGraphics ForceUnrestrictedDeviceFeatureLevel -bool true
  3. 注入 (Injection):在客體機中使用 DYLD_INSERT_LIBRARIES 啟動工作負載,將 shim 限制在該特定進程中。

限制與技術約束

  • 版本敏感性:該 shim 依賴於客體機私有的 Metal 實作細節,可能會隨著 macOS 版本更新而失效。
  • 進程範圍:它僅影響被注入的進程及其子進程;強化過的二進位檔可能會拒絕 library 注入。
  • 虛擬化開銷:雖然它解鎖了 GPU 核心,但它並不會消除 Virtualization.framework 橋接器固有的開銷。
  • 驗證範圍有限:目前的結果僅針對 M1 Ultra 和 Tahoe 客體機進行了驗證;其他 Apple Silicon 世代需要獨立測試。

社群觀點

技術用戶之間的討論強調,這並非針對所有 Mac 用戶的通用 llama.cpp 加速,而是專門為那些在 Virtualization.framework VM 中執行推論的使用者提供的修復。一些用戶質疑為什麼 Apple 在 VM 中限制 Metal 配置,指出硬體能力非常強大,但軟體抽象層卻非常保守。

Sources

相關