Apple SiliconとAMD GPUでQwen3.5をベンチマーク — ROCm vs Vulkanの結果は意外だった
自分のマシン間で推論性能を比較して、新しいMacBook ProをGPUサーバーと併せて持ち続ける価値があるかどうか判断したかった。実用的な比較――実モデル、実ワークロード、Apple Silicon vs AMD GPU、ROCm vs Vulkan――を探してみたが、合成ベンチマークか、単一マシンのレビュー以上のものはあまり見つからなかった。そこで自分でテストを行った。
セットアップ
ハードウェア: - MacBook Pro — M5 Max、48 GBユニファイド - Mac Studio — M1 Max、64 GBユニファイド - Fedora 43サーバー — Core Ultra 7 265K、192 GB DDR5、W7900(48GB、RDNA3、PCIe Gen4 x8)、R9700(32GB、RDNA4、PCIe Gen5 x8)¹
エンジン: Macではmlx-lm 0.31、Fedoraではllama.cpp — どちらもROCm 7.2ビルド(914eb5f、2026-03-25)と、AMDVLK Vulkanビルド(24d2ee0、2026-03-04)。 訂正: 元の投稿では、両方のFedoraバイナリをb5065として誤って記載していた。これは誤りだった。version: 1 の出力ではビルド番号は表示されない。実際のコミットは、上に示した通り最近の2026年ビルドである。EDIT 3でのMacBook Proのllama.cppテストは、Homebrewのb8500リリースを使用している。
モデル: Qwen3.5-35B-A3B(MoE、アクティブ3B)、Qwen3.5-27B(密)、Qwen3.5-122B-A10B(MoE、アクティブ10B)。いずれも4ビット(MLX 4bit / GGUF Q4_K_M)。
ベンチマーク: 実作業に基づくドメイン特化プロンプト(薬剤監視データ分析――コード生成、臨床推論、規制文書の作成、構造化抽出)。8Kコンテキストの7プロンプト+196Kまでのコンテキストスケーリングテスト。単一ユーザー、単一リクエスト、/no_think、temp 0.3。
結果: 生成速度(tok/s)— 8Kコンテキスト
Qwen3.5-35B-A3B(MoE、アクティブ3B)
| マシン | バックエンド | Gen tok/s |
|---|---|---|
| Fedora R9700 | AMDVLK Vulkan | 133.0 |
| MacBook Pro M5 Max | MLX | 128.0 |
| Fedora W7900 | AMDVLK Vulkan | 123.7 |
| Fedora W7900 | ROCm | 78.9 |
| Fedora R9700 | ROCm | 68.8 |
| Mac Studio M1 Max | MLX | 57.6 |
Qwen3.5-27B(密)
| マシン | バックエンド | Gen tok/s |
|---|---|---|
| Fedora W7900 | AMDVLK Vulkan | 31.8 |
| MacBook Pro M5 Max | MLX | 31.3 |
| Fedora R9700 | AMDVLK Vulkan | 30.6 |
| Fedora R9700 | ROCm | 25.2 |
| Fedora W7900 | ROCm | 24.4 |
| Mac Studio M1 Max | MLX | 15.0 |
プロンプト処理(tok/s、約2.9K入力)
| マシン | バックエンド | 35B-A3B PP | 27B PP |
|---|---|---|---|
| MacBook Pro M5 Max | MLX | 3,235 | 779 |
| Fedora R9700 | ROCm | 1,190 | 547 |
| Fedora W7900 | ROCm | 1,001 | 434 |
| Fedora R9700 | AMDVLK Vulkan | 1,030 | 244 |
| Fedora W7900 | AMDVLK Vulkan | 948 | 177 |
| Mac Studio M1 Max | MLX | 431 | 67 |
8KにおけるROCm vs Vulkan
AMDVLK Vulkanは、単一GPUワークロードの生成においてROCmを圧倒した:
| GPU | モデル | ROCm Gen | Vulkan Gen | Vulkanの優位 |
|---|---|---|---|---|
| R9700 | 35B-A3B | 68.8 | 133.0 | +93% |
| W7900 | 35B-A3B | 78.9 | 123.7 | +57% |
| W7900 | 27B | 24.4 | 31.8 | +30% |
| R9700 | 27B | 25.2 | 30.6 | +21% |
しかしROCmは、27Bの密モデルにおいて、全てのコンテキストサイズでプロンプト処理が3.5〜4倍速い。
コンテキストスケーリング: 単一GPU(W7900、32K割り当て)
35B-A3B(MoE)
| プロンプトトークン | ROCm PP | Vulkan PP | ROCm Gen | Vulkan Gen |
|---|---|---|---|---|
| 1,137 | 1,537 | 1,534 | 84.2 | 132.0 |
| 4,415 | 1,524 | 1,435 | 83.3 | 129.3 |
| 8,824 | 1,452 | 1,332 | 81.6 | 119.2 |
| 17,635 | 1,297 | 1,121 | 79.2 | 116.6 |
27B(密)
| プロンプトトークン | ROCm PP | Vulkan PP | ROCm Gen | Vulkan Gen |
|---|---|---|---|---|
| 1,137 | 704 | 171 | 26.2 | 36.1 |
| 4,415 | 720 | 167 | 25.6 | 34.9 |
| 8,824 | 684 | 164 | 25.1 | 33.8 |
| 17,635 | 611 | 153 | 24.5 | 30.6 |
パターン: コンテキストが大きくなるほど、ROCmのPP優位は増える。Vulkanの生成優位はコンテキストとともに縮むが、単一GPUでは16Kまでプラスのままだ。
要点
M5 Maxは速い。 MoEで128 tok/s、PPは3,235 tok/s。PCIeボトルネックのないユニファイドメモリは確かな利点。持つ価値がある。
ROCm > Vulkanだと決めつけない。 単一GPU推論では、AMDVLK Vulkanが生成で30〜93%速かった。両方をテストすべき。
しかしROCmは密モデルのPPを支配する — 3.5〜4倍速い。もしあなたのワークロードが長いコンテキスト入力(RAG、ドキュメント分析)なら、ROCmの「最初のトークンまでの時間(time-to-first-token)」の優位は非常に大きい。
PCIe帯域は重要です。 VRAMが少なくCU数も少ないにもかかわらず、Gen5 x8のR9700は、Gen4 x8のW7900に対してMoE生成で上回ります。
MoEはプロシューマ向けの最適解です。4ビットの35B-A3Bは、単一のAMD GPU上で123〜133 tok/sです。同程度のベンチマーク品質で比較すると、25〜32 tok/sの27B denseは明らかに遅くなっています。
注意点
- ドメイン固有のプロンプト — 医薬品安全性監視(ファーマコビジランス)のワークロードです。他のタスクでは結果が異なる可能性があります。
- PCIeスロットは同等ではありません — R9700はW7900の2倍の帯域です(Gen5 x8 vs Gen4 x8)。これによりGPU同士の比較がややこしくなります。
- RADVではなくAMDVLK — 近年のMesa 25.3+では、LLM推論向けにRADVが大幅に改善されています。結果が変わるかもしれません。
- 量子化が異なります — MLXの4-bitとGGUFのQ4_K_Mの間で異なります。
- シングルユーザーのみです。並行リクエストのテストは行っていません。
¹ 併せてW6800(32GB、RDNA2、Gen4 x4のチップセットスロット)もテストしましたが、Qwen3.5ではROCmをまったく実行できませんでした(Gated Delta Netのクラッシュ)。またVulkanの性能はx4チップセットリンクによって強くボトルネックされていました。わかりやすさのため、主要な表からは結果を省略しています:38.4 tok/s gen(35B-A3B)、18.0 tok/s gen(27B)。
ベンチマークのスクリプト、オーケストレーション、および本稿はClaude Code(Claude Opus 4.6)の協力を得て作成されました。私はテスト戦略とハードウェアの判断を指揮しました。Claudeはベンチマークのハーネスを作成し、モデルのダウンロードを管理し、SSH経由で全マシンに対してテストを実行し、ポストの下書きを作成しました。
編集: 122Bモデルでフルスイートを実行しました(デュアルGPU W7900+R9700、--split-mode layer)。パターンは反転します。ROCmがすべてを勝ち取ります:
| 指標 | ROCm | Vulkan | 勝者 |
|---|---|---|---|
| Gen tok/s(8K) | 45.7 | 40.5 | ROCm +13% |
| PP tok/s(2.9K) | 735 | 588 | ROCm +25% |
コンテキストスケーリング(8K〜16K)では、すべてにおいてROCmが+10〜23%で勝っていました。分岐点は:
| モデル | アクティブパラメータ | GPU | Genの勝者 | PPの勝者 |
|---|---|---|---|---|
| 35B-A3B(MoE) | 3B | Single | Vulkan +57-93% | ほぼ同率 |
| 27B(Dense) | 27B | Single | Vulkan +21-30% | ROCm 3.5-4x |
| 122B-A10B(MoE) | 10B | Dual | ROCm +13% | ROCm +15-25% |
TL;DR: 単一GPU、小さなモデル → Vulkan。複数GPU、大きなモデル → ROCm。
編集2: ご要望により、35B-A3Bで大きなコンテキストをテストしました。単一GPU(W7900、131K割り当て)とデュアルGPU(W7900+R9700、262K割り当て)です。
単一GPU(W7900)— 最大100Kコンテキスト
| コンテキスト(トークン) | ROCm PP | Vulkan PP | ROCm Gen | Vulkan Gen |
|---|---|---|---|---|
| 8,824 | 1,525 | 1,422 | 81.7 | 124.5 |
| 17,635 | 1,315 | 1,120 | 79.4 | 116.8 |
| 35,577 | 1,096 | 846 | 75.3 | 100.0 |
| 71,603 | 808 | 561 | 67.7 | 85.4 |
| 109,510 | 602 | 380 | 61.2 | 72.3 |
単一カードでは、すべてのコンテキストサイズ(最大100K)でVulkanが生成(generation)で勝ちますが、その差は8Kの+52%から100Kの+18%へと縮まります。ROCmのPP優位は、同範囲で+7%から+59%へと増えています。
デュアルGPU(W7900+R9700)— 最大196Kコンテキスト
| コンテキスト(トークン) | ROCm PP | Vulkan PP | ROCm Gen | Vulkan Gen |
|---|---|---|---|---|
| 8,824 | 2,148 | 2,072 | 74.8 | 82.1 |
| 35,577 | 1,679 | 1,380 | 69.2 | 70.3 |
| 71,603 | 1,447 | 782 | 63.2 | 59.4 |
| 109,510 | 854 | 563 | 58.0 | 48.3 |
| 143,695 | 665 | 432 | 53.8 | 42.6 |
| 215,917 | 523 | 301 | 46.7 | 34.3 |
デュアルGPUでは、生成(generation)の分岐点がコンテキスト約65K付近にあります。それより下ではVulkanの方がわずかに速くなります。それより上ではROCmが抜き、差が広がります。196KではROCmは生成で36%高速、PPで74%高速です。
インタラクティビティの崖
どのバックエンドでも、非常に大きなコンテキストではROCmとVulkanの両方が、急激に性能が劣化します。そしてインタラクティビティを殺すのは、プロンプト処理の低下です。デュアルGPUのVulkanでは、PPが8Kで2,072 tok/sから196Kで301 tok/sにまで落ちます。これは85%の低下です。つまり196Kトークンのプロンプトは、Vulkanでのtime-to-first-tokenだけで約12分かかり、ROCmでは約7分です。65Kでも、最初のトークンが出るまで50〜90秒待つことになります。生成速度も低下します(Vulkanで82→34 tok/s、ROCmで75→47 tok/s)が、大きなコンテキストが実運用で遅く感じる主因はPPのウォールクロックです。長いコンテキストのRAGやドキュメント解析を対話的に行う場合は、この点を見込んでください。ネイティブな262Kコンテキストは技術的にはサポートされていますが、128K以上での体験は8Kとはかなり異なります。
ROCm安定性に関する注記
ROCmは、65K+コンテキストでデフォルトのマルチスロット構成を使用した際、R9700でメモリアクセス違反によりクラッシュしました(Memory access fault by GPU node-1 on address 0x7fedadca1000. Reason: Page not present or supervisor privilege.)。クラッシュは、リクエスト間でのKVキャッシュのチェックポイント再利用の最中に発生しました。-np 1(単一の並列スロット)に制限することで解決しました。Vulkanは、最大196Kまでのすべてのコンテキストサイズで安定性の問題は一切ありませんでした。
大規模コンテキストでROCmがうまくいかないと言っていたコメントした人は正しかった——生の速度(65K未満ではVulkanが速いこと)と安定性(マルチスロットのクラッシュ)という両面で。だが、65Kより上では、安定性の問題を回避すればROCmは回復し、実際に生成で先行します。
編集 3: 元の比較が、MacではMLX 4-bit、fedoraではGGUF Q4_K_Mだった点は、公正に見ればそのとおりです。これらは異なる量子化フォーマットで、ファイルサイズも違うため、同じ条件での比較(りんご同士)ではありません。MacBook Proにllama.cpp b8500(Metal)をインストールし、まったく同じGGUFファイル(fedoraのマシンからコピーしたもの)を実行しました。
すべての環境で同じ llama.cpp GGUF Q4_K_M — 同一ファイル
Qwen3.5-35B-A3B(MoE)
| マシン | バックエンド | Gen tok/s | PP tok/s(2.9K) |
|---|---|---|---|
| Fedora R9700 | AMDVLK Vulkan | 133.0 | 1,030 |
| Fedora W7900 | AMDVLK Vulkan | 123.7 | 948 |
| MacBook Pro M5 Max | Metal(b8500) | 89.4 | 783 |
| Fedora W7900 | ROCm | 78.9 | 1,001 |
| Fedora R9700 | ROCm | 68.8 | 1,190 |
Qwen3.5-27B(Dense)
| マシン | バックエンド | Gen tok/s | PP tok/s(2.9K) |
|---|---|---|---|
| Fedora W7900 | AMDVLK Vulkan | 31.8 | 177 |
| Fedora R9700 | AMDVLK Vulkan | 30.6 | 244 |
| Fedora R9700 | ROCm | 25.2 | 547 |
| Fedora W7900 | ROCm | 24.4 | 434 |
| MacBook Pro M5 Max | Metal(b8500) | 23.7 | 171 |
同じGGUFファイルで、生成においても両モデルとも、Vulkan上のfedora GPUがM5 Maxに勝っています。元の投稿でMacBook Proが好成績だったのは、単にハードウェアの差だけではなく、Apple Siliconにおけるllama.cppよりもMLXの最適化面での優位によるところが大きいです。
MacBook ProでのMLX vs llama.cpp(別比較)
これらは異なる量子化フォーマットとファイルサイズを使っているため、純粋な速度比較ではなく「エンジン比較」です:
| モデル | MLX 4-bit Gen | llama.cpp Q4_K_M Gen | MLX Advantage |
|---|---|---|---|
| 35B-A3B | 128.0 | 89.4 | +43% |
| 27B | 31.3 | 23.7 | +32% |
MLXはApple Silicon上で大幅に高速ですが、MLX 4-bitモデルの方がQ4_K_MのGGUFよりも小さいため、その速度差を推論エンジンだけのせいにすることはできません。適切な比較には、同じサイズの量子化か、あるいは2つのフォーマット間のKLD driftのような品質指標が必要です。
編集 4: コメンターが指摘したとおり、W6800のROCmクラッシュはおそらくアーキテクチャ上の制限ではなく、ビルドの問題でした——彼らはROCmで、さらに古いGPU(Radeon Pro VII、gfx906)でもQwen3.5を動かしています。ビルド設定を確認し、次のことを確認しました:ROCmバイナリは AMDGPU_TARGETS=gfx1100;gfx1201 のみでコンパイルされており、gfx1030は一度も含まれていません。 gfx1030;gfx1100;gfx1201で再ビルドしたところ、W6800は今度はROCmで問題なく動作します。
W6800 ROCm vs Vulkan(修正版)
Qwen3.5-35B-A3B(MoE)
| バックエンド | Gen tok/s | PP tok/s(2.9K) |
|---|---|---|
| ROCm(gfx1030 build) | 58.3 | 1,359 |
| AMDVLK Vulkan | 38.4 | 534 |
| ROCm advantage | +52% | +155% |
Qwen3.5-27B(Dense)
| バックエンド | Gen tok/s | PP tok/s(2.9K) |
|---|---|---|
| ROCm | 19.3 | 316 |
| AMDVLK Vulkan | 18.0 | 143 |
| ROCm advantage | +7% | +121% |
W6800では、ROCmが生成とPPの両方でVulkanより速い——W7900/R9700の結果とは逆です。これは興味深いです。RDNA 2のカードはROCmの恩恵を受け、新しめのRDNA 3/4のカードはVulkanの恩恵を受けています。W6800はPCIe Gen4 x4のスロット上にもあるため、ボトルネックは主にPPであり、生成ではありません(モデルはVRAMに完全に収まるため、生成にPCIeの帯域は必要ありません)。
「RDNA 2はGated Delta NetモデルではROCmを動かせない」という当初の主張は誤りでした——ビルド構成のエラーだったのです。これを指摘してくれたコメンターに感謝します。
submitted by /u/neuromacmd[link] [comments]