Our FP8 W8A8 tower defaults to a cuBLASLt GEMM, and the code justifies that
choice by asserting it mirrors vLLM. It does not. vLLM runs FlashInfer here.
The claim
src/vllm/model_executor/models/qwen3_5.cpp:1286-1288:
By DEFAULT the GEMM is cuBLASLt fp8 (vt::MatmulFp8CublasLt — mirrors vLLM's
nvjet_qqtst fp8 dense); VT_DENSE_CUBLASLT_FP8=0 selects the cutlass sm120
fp8 GEMM (vt::MatmulFp8Cutlass).
The measurement
From the pinned oracle's own startup log, captured on dgx.casa while serving
nvidia/Qwen3.6-35B-A3B-NVFP4@491c2f1e in its production graphed configuration
(vLLM 0.25.0, linear_backend='auto', six independent server starts):
6 Selected FlashInferFP8ScaledMMLinearKernel
Not cuBLASLt. Not CUTLASS. nvjet_* is a cuBLASLt kernel family — vLLM does
not call cuBLASLt for this at all, so "mirrors vLLM's nvjet_qqtst fp8 dense"
cannot be true as written.
Why it matters for #213
The FP8 tower is the second-largest mass in the 27B decode step. From the
per-kernel attribution:
| kernel |
calls/step |
ms/step |
share |
nvjet_sm121_qqsss_mma_64x128x128 |
48 |
18.51 |
16.2% |
nvjet_sm121_qqtst_mma_64x64x128 |
48 |
7.05 |
6.2% |
25.6 ms/step combined, ~26.7% of the step, reading 7.789 GiB of F8_E4M3
(5.156 linear_attn, 1.562 self_attn, 0.996 mlp). The 27B currently runs
0.843–0.861x against vLLM with a ~14.7 ms/step deficit, and the verified lever set
accounts for only about two thirds of it. A whole kernel family chosen on a false
premise, over a quarter of the step, is the largest unexamined structural
divergence left.
This is also a POL-MIRROR-VLLM matter, not only a performance one: AGENTS.md
says to mirror vLLM and to ground conclusions in the whole executing chain —
"FlashInfer, CUTLASS, cuBLASLt, DeepGEMM, torch/Inductor, generated code, and
local dispatch" — citing the file:line ported from. The comment cites a kernel
family the oracle never enters.
What is owed
- Correct the comment regardless of what follows. A false upstream claim in a
dispatch decision is how the next reader inherits the mistake.
- Establish what FlashInfer's fp8 scaled-MM actually does at decode M on this
GPU — the tile, the epilogue, the scaling granularity (per-tensor vs
per-channel vs per-token), and where activation quantisation happens — and
compare against MatmulFp8CutlassD / MatmulFp8CutlassPreQuantD and the
cuBLASLt heuristic we currently reach.
- Note a related gap already recorded:
cuda_matmul_fp8_cutlass.cu:125-129
has never compiled the M<=16 / M<=32 decode tile configs that vLLM's path
carries. So the earlier A/B that made cuBLASLt the default was run against a
CUTLASS arm missing exactly the small-M configs decode needs — the comparison
that chose the current default was not a fair one.
- Trace both sides with the same tool before any throughput claim, per
AGENTS.md: source inspection establishes candidates, matching traces establish
what ran.
Reproducing the evidence
Start the pinned oracle on either NVFP4 gate model in its production
configuration and grep the server log:
grep -o 'Selected [A-Za-z]*FP8[A-Za-z]*Kernel' <server.log>
Logs from the run above are on the gate host under
~/work/oracle-ssm-ab/q35/*server.log.
Refs #213.
Our FP8 W8A8 tower defaults to a cuBLASLt GEMM, and the code justifies that
choice by asserting it mirrors vLLM. It does not. vLLM runs FlashInfer here.
The claim
src/vllm/model_executor/models/qwen3_5.cpp:1286-1288:The measurement
From the pinned oracle's own startup log, captured on
dgx.casawhile servingnvidia/Qwen3.6-35B-A3B-NVFP4@491c2f1ein its production graphed configuration(vLLM 0.25.0,
linear_backend='auto', six independent server starts):Not cuBLASLt. Not CUTLASS.
nvjet_*is a cuBLASLt kernel family — vLLM doesnot call cuBLASLt for this at all, so "mirrors vLLM's nvjet_qqtst fp8 dense"
cannot be true as written.
Why it matters for #213
The FP8 tower is the second-largest mass in the 27B decode step. From the
per-kernel attribution:
nvjet_sm121_qqsss_mma_64x128x128nvjet_sm121_qqtst_mma_64x64x12825.6 ms/step combined, ~26.7% of the step, reading 7.789 GiB of F8_E4M3
(5.156
linear_attn, 1.562self_attn, 0.996mlp). The 27B currently runs0.843–0.861x against vLLM with a ~14.7 ms/step deficit, and the verified lever set
accounts for only about two thirds of it. A whole kernel family chosen on a false
premise, over a quarter of the step, is the largest unexamined structural
divergence left.
This is also a POL-MIRROR-VLLM matter, not only a performance one: AGENTS.md
says to mirror vLLM and to ground conclusions in the whole executing chain —
"FlashInfer, CUTLASS, cuBLASLt, DeepGEMM, torch/Inductor, generated code, and
local dispatch" — citing the
file:lineported from. The comment cites a kernelfamily the oracle never enters.
What is owed
dispatch decision is how the next reader inherits the mistake.
GPU — the tile, the epilogue, the scaling granularity (per-tensor vs
per-channel vs per-token), and where activation quantisation happens — and
compare against
MatmulFp8CutlassD/MatmulFp8CutlassPreQuantDand thecuBLASLt heuristic we currently reach.
cuda_matmul_fp8_cutlass.cu:125-129has never compiled the M<=16 / M<=32 decode tile configs that vLLM's path
carries. So the earlier A/B that made cuBLASLt the default was run against a
CUTLASS arm missing exactly the small-M configs decode needs — the comparison
that chose the current default was not a fair one.
AGENTS.md: source inspection establishes candidates, matching traces establish
what ran.
Reproducing the evidence
Start the pinned oracle on either NVFP4 gate model in its production
configuration and grep the server log:
Logs from the run above are on the gate host under
~/work/oracle-ssm-ab/q35/*server.log.Refs #213.