Skip to content

The FP8 tower's cuBLASLt default rests on a false premise: vLLM selects FlashInferFP8ScaledMMLinearKernel, not nvjet/cuBLASLt (26.7% of the 27B decode step) #252

Description

@localai-bot

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

  1. Correct the comment regardless of what follows. A false upstream claim in a
    dispatch decision is how the next reader inherits the mistake.
  2. 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.
  3. 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.
  4. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions