
2026/08/11 23:50
Apple Silicon と macOS VM を活用した llama.cpp による高速化された大規模言語モデルの推論
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Apple は、ゲストプロセスに対して GPU 機能の報告方法を補正することで、macOS の仮想マシンにおける大規模言語モデル(LLM)推論のパフォーマンスをネイティブ環境(bare-metal)に近づける研究用ツールを発表しました。本ツールは、プロセスごとの「Metal 能力シム」を採用し、仮想マシンが Apple ファミリー 9 GPU への対応をサポートしていることを報告するとともに、最大スレッドグループメモリを 32 KB から 64 KB に増加させます。これにより、llama.cpp は従来の標準仮想マシンでは利用不可能であった高度な Metal カーネル(SIMD グループ演算による削減、SIMD グループ行列、bfloat16)を選択できるようになります。M1 Ultra(48 コア GPU)、macOS 26.6.1、Tahoe Cua イメージ、Lume 0.5.1 を使用したテストにおいて、シムはワークロードによりますが、プロンプト処理速度ではネイティブ環境の約 98–100%、生成速度では 72–95%のパフォーマンスを達成しました。Meta の Muse Glimmer 30B の場合、64 GiB のゲスト環境において、プロンプト段階では約 7.5 倍、トークン生成段階では約 8.9 倍の高速化を実現しました。本アプローチは Apple の既存のパラ仮想化グラフィックスパスを利用しており(物理的な PCI 割り当てや VFIO は不使用)、プロセス単位でのスコープ化により堅牢な実行ファイルには影響を与えず、Lume および Cua と同一の許諾条件を持つ自由なライセンスで公開されています。Virtualization.framework 内の非公開の Metal 詳細に依存するため、本ツールは macOS のバージョンに対して敏感であり、実験的なローカル AI 研究向けです。
本文
Apple Silicon と macOS VM で LLM 推論を高速化する:llama.cpp を用いた実績(11〜16 倍の改善)
2026 年 8 月 11 日公開
著者:Francesco Bonacci および Johnny Franks
背景と課題:既存 VM の性能制限
- Cua が発表した macOS 仮想化スタック Lume を用いると、ホストの Apple GPU に基づく仮想 GPU が利用可能ですが、標準搭載の Tahoe VM では以下の問題が発生していました。
- 控えめな Metal 機能プロフィール(capability profile)を報告する。
: falsesupportsFamily- 最大スレッドグループメモリ:32 KB
- SIMD グループ行列サポート:不可
- llama.cpp が新しいカーネルを選択せず、より遅い GPU コード経路を実行していた。
- 控えめな Metal 機能プロフィール(capability profile)を報告する。
従来の問題点の概要
- アプリケーションは報告された情報に基づきカーネルやレンダリング経路を選択するため、本来の性能が発揮できていない状態でした。
- llama.cpp は「保守的な回答」によって、能力のある GPU パスから制限されていた。
解決策:プロセス固有の Metal 能力シム(Shim)の開発
軽量なプロセス固有の互換性レイヤー(シム)を開発し、特定のゲストプロセスのみに対して選択的な能力回答を変更します。
シムの仕組み
- アプリケーションと API の間に挿入される互換性レイヤーとして動作する「小さな Metal 能力シム」を開発した。
- 単一のゲストプロセス内で動作し、Metal 能力クエリーを傍受して回答を変更する。
- これにより、llama.cpp に新しい GPU カーネルの選択を促すことができる。
変更されるプロフィール(テスト済み)
| 能力項目 | 標準搭載ゲスト | テスト済みプロフィール |
|---|---|---|
(Apple Family) | false (利用不可) | true (利用可能,第 9 世代:1009) |
| 最大スレッドグループメモリ | 32 KB | 64 KB |
| SIMD グループ行列処理 | off | on |
| SIMD グループ削減処理 | off | on |
| bfloat16 | off | on |
- 影響範囲: 報告される「Apple ファミリー」と「スレッドグループメモリ上限」のみを変更。
- 他の値(Mac / Common Metal、ワーキングセットサイズなど)は標準設定のまま。
- 誤ったまたは欠落した構成情報はプロセスを標準の能力パス上に留めるよう機能する。
ベンチマーク結果:llama.cpp を用いたモデルテスト
1. TinyLlama 1.1B(M1 Ultra / macOS 26.6.1)
- 環境: 48 コア GPU を備えた Apple M1 Ultra、macOS 26.6.1。
- 使用モデル: TinyLlama 1.1B Chat Q4_K_M GGUF (公式 llama.cpp b10167)。
- ベンチマークコマンド:
llama-bench -m tinyllama-1.1b-chat-v1.0.Q4_K_M.gguf \ -p 512 -n 128 -r 10 -t 8 -ngl -1 -o json
比較結果(中位数:サンプル 10 件の平均)
| ワークロード | ホスト (Bare-metal) | 標準搭載ゲスト | ロック解除済みゲスト | ゲストでの向上率 | ロック解除済み / ホスト |
|---|---|---|---|---|---|
| プロンプト処理 (512 トークン) | 4,871.99 tok/s | 431.86 tok/s | 4,786.70 tok/s | 11.08× | 98.25% |
| トークン生成 (128 トークン) | 286.71 tok/s | 12.63 tok/s | 206.60 tok/s | 16.36× | 72.06% |
- プロンプト処理: ホスト環境(bare-metal)の結果にほぼ達し、98% の性能を発揮。
- トークン生成: VM のギャップが確認され、ホスト速度の約 72% に留まる。
生データには正確なイメージダイジェスト、モデルハッシュ値、コマンド、JSON 出力が含まれており、再現可能です。
2. Google Gemma 4 12B QAT Q4_0 モデル
- 環境: 同じ llama.cpp バイナリを使用。推測的デコードは無効化し、マルチモーダルプロジェクターをロードしない設定で比較。
- 結果:
| ワークロード | ホスト (Bare-metal) | 標準搭載ゲスト | ロック解除済みゲスト | ゲストでの向上率 | ロック解除済み / ホスト |
|---|---|---|---|---|---|
| プロンプト処理 (512 トークン) | 517.88 tok/s | 71.66 tok/s | 515.76 tok/s | 7.20× | 99.59% |
| トークン生成 (128 トークン) | 52.38 tok/s | 3.41 tok/s | 49.67 tok/s | 14.54× | 94.82% |
- Gemma 4 の証拠には、Google モデルの修正版と SHA-256 ハッシュ値が含まれています。
- 標準搭載およびロック解除済みのデータは、同一の無競争(uncontended)ウィンドウから取得しています。
3. Meta Muse Glimmer 30B Q4_K-M GGUF モデル
- 環境: 64 GiB のゲスト環境。llama.cpp b10359 を使用。
- 設定: 8 スレッドおよびフル GPU オフロード。テキスト専用テスト(Ollama やマルチモーダルは未使用)。
- 結果(llama-bench サンプル 3 件の中位数):
| ワークロード | 標準搭載ゲスト | ロック解除済みゲスト | ゲストでの向上率 | 標準搭載範囲 | ロック解除済み範囲 |
|---|---|---|---|---|---|
| プロンプト処理 (512 トークン) | 25.83 tok/s | 194.97 tok/s | 7.55× | 25.76-26.10 | 194.57-195.33 |
| トークン生成 (128 トークン) | 2.38 tok/s | 21.08 tok/s | 8.87× | 2.15-2.41 | 21.07-21.10 |
- 全プロセス正常終了。利用可能メモリの 98%、スワップゼロを維持。
- stderr: 標準搭載では Apple ファミリー 5 で SIMD/bfloat パスが無効、ロック解除済みではファミリー 9 で有効と報告。
注記: この結果はテキスト専用 GGUF に適用されます。Ollama のスループットやマルチモーダルコンポーネントに対する解釈には注意が必要です。
4. MLX-LM での検証(比較対象)
- 環境: MLX 0.32.0、mlx-community/Llama-3.2-3B-Instruct-4bit。
- 結果: 標準搭載 VM で既に高速なため、パフォーマンスは平坦化(変化なし)。
| ワークロード | 標準搭載ゲスト | ロック解除済みゲスト | 比率 |
|---|---|---|---|
| プロンプト処理 (512 トークン) | 1,656.55 tok/s | 1,665.47 tok/s | 1.005× |
| トークン生成 (128 トークン) | 172.09 tok/s | 170.86 tok/s | 0.993× |
- MLX はパラバーチャライズされたデバイスを通じて利用不可なレジデンスセットを要求するようになりましたが、リリース用シムは Apple ファミリー列挙子のみを変更し、Metal 3 を標準値に維持することで回避可能です。
他の仮想化ツールにおける同様の問題点
- Tart などの macOS 仮想化 CLI ツールでも、「macOS ゲスト内部でのグラフィックスおよび LLM パフォーマンスにおける GPU のパススルーが不可能」というオープンな問題が存在します。
- Apple の Virtualization.framework は、ホストが物理 GPU を制御する「パラバーチャル化(paravirtualization)」アーキテクチャを採用しており、x86 Linux 環境で一般的である VFIO/IOMMU ベースの「GPU パススルー」とは異なるモデルです。
Lume VM で試す:具体的な実装手順
ソースコードは
libs/lume/metal-capability-shim にあります。
1. アーテファクトのビルドと検証
cd libs/lume/metal-capability-shim ./Scripts/build.sh ./Scripts/verify.sh
2. VM での有効化(ホスト側)
VM を停止し、MacOS ユーザーによって起動される VM に対して不制限機能レベルを有効化し、再開します。
lume stop my-vm defaults write com.apple.gpusw.ParavirtualizedGraphics ForceUnrestrictedDeviceFeatureLevel -bool true lume run my-vm
3. ゲストへのインストールと起動
一致する dylib とプローブをゲストにコピーし、アクティベーションをプロセスに限定します。
lume ssh my-vm "DYLD_INSERT_LIBRARIES=/path/to/LumeMetalCapabilities-arm64.dylib \ LUME_METAL_APPLE_FAMILY_MAX=1009 /path/to/metal-capabilities 1009"
- 長期間動作するサーバーの場合: ワークロード固有の LaunchAgent を使用し、環境変数に
を設定してください。DYLD_INSERT_LIBRARIES - ロールバック: 環境変数を削除しワークロードを再起動することで、標準動作に戻ることができます。ホストのプリファレンスを復元するには、VM を停止し
を削除してから起動します。ForceUnrestrictedDeviceFeatureLevel
Lume ガイドには完全なテンプレート、チェックサムおよび検証手順、ロールバック手順が含まれています。
制限事項と注意点
- 実験的かつバージョン依存: シムはゲスト側の Metal 実装の詳細な非公開機能に依存しており、macOS リリースのいずれかで動作が変更される可能性があります。
- プロセス固有: 注入されたワークロードとその子プロセスのみを影響させます。ハードニング済みまたはプラットフォーム保護された実行可能ファイルはライブラリの注入を拒否する場合があります。
- 構成された能力プロフィール: テストで網羅した Apple ファミリー(9)の値のみを報告します。物理 GPU の能力発見はその範囲外です。
- 限定的な検証: 現在の証拠は、llama.cpp モデル、M1 Ultra ホストおよび Tahoe ゲスト上の MLX-LM 互換性ランのみをカバーしています。追加のチップやモデルについては個別のテストが必要です。
- VM のままである: 既存の Virtualization.framework レンダリングおよび仮想化制限は残存します。
まとめと今後の展望
主要な成果
- 狭い範囲の能力変更(2 つ)で、llama.cpp を用いた LLM の推論速度を劇的に向上させました。
- TinyLlama 1.1B: プロンプト処理 432→4,787 tok/s、生成 12→206 tok/s(最大 16.36 倍)。
- Gemma 4 12B: プロンプト処理 71→515 tok/s、生成 3→49 tok/s(最大 14.54 倍)。
- Muse Glimmer 30B: プロンプト処理 25→195 tok/s、生成 2→21 tok/s(最大 8.87 倍)。
- 各ワークロードは Apple の既存の GPU ブリッジ上で動作を維持しています。
コミュニティへの呼びかけ
- Lume は開発者のために macOS VM を実用的なものにする手段としてスタートしました。
- GitHub で Cua をスターし、シムを貴方のセットアップでテストしてください。
- ホストチップ、ホストおよびゲストバージョン、正確なワークロード、ならびに結果を開示するイシューを作成してください。
- 新しい組み合わせを検証したり、シムを改善したらプルリクエストを送ってください。
Metal や Virtualization.framework を担当する Apple エンジニアは、vz@trycua.com までご連絡ください。