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

macOS VMにおけるLLM推論は、Metal機能を解放することで11-16倍高速化できる

AppleのVirtualization.frameworkを使用し、macOSゲスト内でllama.cppを介して大規模言語モデル(LLM)を実行すると、仮想GPUが保守的な機能プロファイルを表示するため、ベアメタル環境のパフォーマンスよりも大幅に低下します。プロセススコープの互換性シム(shim)を使用して、より新しいMetal機能を報告させることで、M1 Ultra上でのTinyLlama 1.1Bの推論速度が、プロンプト処理で11.08倍トークン生成で16.36倍向上しました。

このパフォーマンス向上は、ホストハードウェアがサポートしているものの、仮想デバイスが通常は隠している最新のMetalカーネル(SIMD-group matrixやbfloat16パスなど)をllama.cppが選択できるようにシムが実現するためです。

根本原因:準仮想化GPUの機能制限

AppleのVirtualization.frameworkは準仮想化を使用しており、ゲスト内の仮想グラフィックスデバイスが、ホストが物理GPU上で実行する専用ドライバにワークロードを送信します。一部のLinux環境で使用されるPCIパススルー(VFIO)とは異なり、ホストはハードウェアに対して厳格な制御を維持します。

標準のmacOS VMでは、仮想デバイスは最大スレッドグループメモリが32 KBのみの、Apple 5世代ファミリーに相当する機能プロファイルを表示します。最新のMetalアプリケーションは、最も効率的なカーネルを選択するために実行時にデバイスを照会するため、llama.cppは、基盤となる物理Apple Silicon GPUがはるかに高い能力を持っているにもかかわらず、これらの保守的な報告に基づき、低速なレガシーパスをデフォルトで使用してしまいます。

解決策:プロセススコープのMetal機能シム

これらの制限を回避するため、CuaはアプリケーションとAPIの間に挿入される互換性レイヤーであるMetal機能シムを開発しました。このシムは、特定のゲストプロセスに対してMetal機能の照会をインターセプトし、返される値を修正して、より高性能なパスを解放します。

主要な機能変更

Capability Stock Guest Unlocked Profile
supportsFamily:1009 False True
SIMD-group matrix Off On
SIMD-group reduction Off On
bfloat16 Off On
Max threadgroup memory 32 KB 64 KB

シムは、具体的にApple family 9 (1009) までのsupportsFamily:に回答し、報告される最大スレッドグループメモリを64 KBに倍増させます。これは、ゲストカーネルや物理GPUの割り当てを変更することなく、llama.cppにおいて新しいSIMD-groupやbfloat16パスの選択をトリガーするのに十分な量です。

パフォーマンス・ベンチマーク

テストは、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)

Workload Bare-metal Host Stock Guest Unlocked Guest Guest Speedup
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)

| Workload | Bare-metal Host | Stock Guest | Unlocked Guest | Guest Speedup | | :--- | :--- | :--- | :--- | :--- | :--- | | Prompt processing (512 tok) | 517.88 tok/s | 71.66 tok/s | 515.76 tok/s | 7.20x | | Token generation (128 tok) | 3.41 tok/s | 49.67 tok/s | 14.54x |

MLX-LM 互換性

MLX-LM 0.31.3とLlama-3.2-3B-Instruct-4bitを使用したテストでは、パフォーマンスは横ばいでした(比率 約1.0x)。これは、MLX-LMが標準のVMにおいて既に効率的なパスを利用していたことを示しており、開発者は準仮想化デバイスがサポートできないレジデンシーセットを要求しないようにシムを改良するのに役立ちました。

デプロイメントと実装

シムは、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を使用して、その特定のプロセスにシムを適用する範囲でゲスト内でワークロードを起動します。

制限事項および技術的制約

  • Version Sensitivity: シムはプライベートなゲストMetal実装の詳細に依存しており、macOSのリリース間で動作が停止する可能性があります。
  • Process Scope: 影響を受けるのは注入されたプロセスとその子プロセスのみです。強化されたバイナリはライブラリの注入を拒否する場合があります。
  • Virtualization Overhead: GPUカーネルを解放することはできますが、Virtualization.frameworkのブリッジによる固有のオーバーヘッドは解消されません。
  • Narrow Validation: 結果は現在、M1 UltraとTahoeゲストに対して検証済みです。他のApple Silicon世代については、個々のテストが必要です。

コミュニティの視点

技術的なユーザー間の議論では、これがすべてのMacユーザー向けの一般的なllama.cppの高速化ではなく、特にVirtualization.framework VM内で推論論理を実行しているユーザー向けの修正であるという点が強調されています。一部のユーザーは、なぜAppleがVMにおけるMetalプロファイルを制限しているのか疑問を視を向けており、ハードウェアは非常に高い能力を持っているものの、ソフトウェアの抽象化レイヤーが保守的すぎるという点を指摘しています。

Sources

関連