AI Navigate

4台の RTX PRO 6000 (SM120) 上で Qwen3.5-397B NVFP4 の全 MoE バックエンドを8時間以上ベンチマークしました。以下が分かったことです。

Reddit r/LocalLLaMA / 2026/3/12

💬 オピニオンDeveloper Stack & InfrastructureTools & Practical Usage

要点

  • 観測された最速の持続デコードは、SM120 上で Marlin TP=4 および Marlin W4A16 を用いた場合で 50.5 tok/s であり、130+ tok/s という主張と矛盾している。
  • MTP を有効化するか自動バックエンドに頼ると、一般的にスループットが低下し、Marlin TP=2+PP=2 は 49 tok/s、MTP 有効化の設定は約 39–40 tok/s。
  • いくつかのバックエンドはバグにより妨害されている。CUTLASS は大きな速度差を示す(最良 41 tok/s、最悪 26 tok/s、同じバグによる)、vLLM ネイティブ CUTLASS はゴミ出力、デフォルト TP=4 with auto backend もゴミ出力、SGLang 0.5.8 は NaN を返す。
  • 中央の障害は SM120 上の NVIDIA CUTLASS バグで、FP4 テンソルコア MoE ワークロードがハードウェア公称速度を達成できないため、改善を妨げている。
  • 本研究は 4 台の RTX PRO 6000 (Blackwell) マシンで 16 構成をカバーし、現実世界の性能を把握するため複数の Docker イメージ、フレームワーク、MTP/バックエンド、CUDA バージョン、カーネルパッチをテストした。

要点: 持続デコードで 50.5 tok/s が私が得られる最高値です、そして私はそれが SM120 ハードウェアで実際に誰かが得られる最高値だとほぼ確信しています — 130+ tok/s の主張が飛び交っているにもかかわらず。理由は? NVIDIA 自身の CUTLASS カーネルは自社のワークステーション GPU 上で壊れているからです。


セットアップ

  • 4台の RTX PRO 6000 Blackwell ワークステーション エディション(各 96GB GDDR7、合計 384GB)
  • SM 12.0 -- これはデスクトップ/ワークステーション用 Blackwell で、データセンター向けの B200 (SM 10.0) ではありません
  • PCIe Gen5、NVLinkなし
  • Threadripper 24C/48T、512GB DDR5
  • Windows 11 + WSL2
  • モデル: nvidia/Qwen3.5-397B-A17B-NVFP4(約 140GB、総パラメータ 397B、トークンあたり 17B のアクティブ)

テストした 16 の構成

利用可能なすべてをテストしました:複数の Docker イメージ、2つの推論フレームワーク、すべての MoE バックエンド、MTP のオン/オフ、異なる CUDA バージョン、EP/PP/TP の組み合わせ、そして十数個のカーネルパッチ。

構成 バックエンド TP MTP tok/s 判定
Marlin TP=4、MTPなし Marlin W4A16 4 いいえ 50.5 勝者
Marlin TP=2+PP=2 Marlin W4A16 2+PP2 いいえ 49 僅差の2位
Marlin + MTP=2 Marlin W4A16 4 はい 39-40 MTP によって遅くなる
CUTLASS Docker (最良ケース) FlashInfer CUTLASS 4 はい 41 80 個の高速カーネルをスキップ
CUTLASS Docker (最悪ケース) FlashInfer CUTLASS 4 はい 26 同じバグ、フォールバックはより悪い
vLLM ネイティブ CUTLASS CUTLASS 4 はい ~5 ゴミの出力
デフォルト TP=4 (自動バックエンド) CUTLASS 4 いいえ 6-7 ゴミの出力
SGLang 0.5.8 FlashInfer 4 -- NaN 文字通り NaN
エキスパート並列 Marlin 2+EP2 いいえ 1.4-2.6 PCIe 上での実行は推奨しません
TensorRT-LLM -- -- -- N/A アーキテクチャをサポートしていません
FlashInfer Sampler Marlin 4 いいえ 5.9 デフォルトから 8.6x の低下

すべてを阻害している NVIDIA のバグ

以下の点がこの状況を苛立たせます。RTX PRO 6000 には FP4 テンソルコアがあります。NVIDIA はこれらを使う NVFP4 量子化モデルを出荷します。CUTLASS ライブラリには MoE 推論のためにそれらを照らすべきグループ化 GEMM カーネルがあります。

しかし SM120 では、80 個の TMA ワープ専用の grouped GEMM 手法が初期化時にすべて失敗します。 すべてです。エラー:

Failed to initialize cutlass TMA WS grouped gemm. Error: Error Internal (cutlass_kernel_file_gemm_grouped_sm120_M128_BS_group2.generated.cu:60)

したがって native FP4 計算の代わりに Marlin を使うことになり、Marlin は FP4 重みを FP16 にデクオンタイズして標準の GEMM を実行します。理論的スループットの約半分を失います。

CUTLASS の issue #3096 を提出しました。NVIDIA からの返答はありません。

結論として、SM121(DGX Spark、Blackwell のもう一つのバリアント)は NVFP4 MoE を 356 TFLOPS で動作します。つまり SM12x も実現可能です — NVIDIA はまだ SM120 のタイル設定を検証していません。

なぜ MTP は状況を悪化させるのか

これは私を驚かせました。Multi-Token Prediction は役に立つはずですよね? Marlin を搭載した SM120 では、-22% の後退です:

  • MTPなし: 50.5 tok/s
  • MTP=2: 39.6 tok/s

MTP のドラフトはネイティブ FP4 活性化で訓練されています。Marlin は W4A16 のデクオンタイズを使用しており、活性化値は若干異なります。その結果、受け入れ率は 61–85% で、予想の 89% に対して低いです。推測と拒否のオーバーヘッドが利益を上回ります。

130 tok/s の主張について

コミュニティフォーラムの誰かが、同じハードウェアでカスタムの SGLang/vLLM フォークを用いて 130–150 tok/s を主張していました。私は両方のリポジトリを入手し、すべてのコミットを検証しました。

カーネルレベルの変更はゼロです。 これらのフォークは Python レベルの量子化設定、アテンションレジストリ、MTP 状態管理を変更します。同じ壊れた CUTLASS フォールバックを使用します。 同じ 80 TMA WS の戦術は失敗します。

50.5 tok/s で動作するコードからどうして 130 tok/s を得られるのでしょうか?最もありそうな説明は、実際の出力トークン数ではなく、推測されたトークン(提案されたものと拒否されたもの)をカウントしていることです。1000 以上のトークンのウォールクロック出力を測定すると、得られるのは 50.5 tok/s です。

もし誰かが SM120 で正しい出力を伴う 130+ tok/s の持続デコードを実際に達成しているなら、私の間違いを示してほしい。タイムスタンプ付きの生成ログを見せてください。

ここに到達するのに必要だったこと

50.5 tok/s に到達するには、FlashInfer と vLLM にまたがる12 のパッチが必要でした:

  • 7 件の FlashInfer パッチ: SM バージョンのチェック、計算能力のマッピング、GDC コンパイルフラグ、CuTe DSL アーキテクチャリスト
  • 5 件の vLLM パッチ: MoE バックエンド選択における is_device_capability_family(120) チェック

上流へ提出済み: - FlashInfer PR #2725 - vLLM PR #36453

実用的な意味

397B パラメータのモデルで 50.5 tok/s は実際に素晴らしく、ほとんどの人の Llama 70B セットアップより速いです。モデル品質も優れており、単一ユーザーのワークロードには非常に実用的です。

しかし、実際には 2-3 倍速くあるべきです。NVIDIA はこれを 2万ドル以上のプロ用 AI GPU として販売しています。NVFP4 モデルを提供しています。彼らがそれ向けに設計した推論パスは、それには適用されません。それはソフトウェアの制限ではなく、NVIDIA 自身のカーネルライブラリのバグであり、彼らはそれを認めていません。

このハードウェアを持つ人のための実用的な設定

```bash

重要な部分: Marlin を強制し、MTP を無効化

export VLLM_MOE_FORCE_MARLIN=1

vllm serve nvidia/Qwen3.5-397B-A17B-NVFP4 \ --tensor-parallel-size 4 \ --max-model-len 262144 \ --gpu-memory-utilization 0.95 \ --enable-chunked-prefill \ --enable-prefix-caching \ --kv-cache-dtype fp8_e4m3 \ --calculate-kv-scales

``` Don't use --enforce-eager (CUDA graphs help). Don't enable MTP. Don&apost try expert parallel on PCIe.


未解決の課題

他にも SM120 でこの戦いを戦っている人はいますか? MoE モデルを実行している他の RTX PRO 6000 / RTX 5090 の所有者の方からの声をぜひ聞かせてほしいです。