Skip to content

[Bug]: DeepGemm accuracy auto-disable (_DEEPGEMM_BLACKWELL_EXCLUDED_MODEL_TYPES) does not apply to the FP8 MoE path #50332

Description

@ryansummerskill

Your current environment

  • Hardware: NVIDIA GB10, SM121 / compute capability 12.1 (also relevant to SM120 generally)
  • vLLM 0.26.0 (standard PyPI wheel, aarch64), torch 2.11.0+cu130, --enforce-eager, TP=1
  • Model: Qwen3.6-35B-A3B-FP8model_type: **qwen3_5_moe_text**, 256-expert FP8 MoE

🐛 Describe the bug

vLLM correctly identifies that DeepGemm is inaccurate for this model type and logs so at startup:

WARNING [vllm.py:1008] Auto-disabled DeepGemm for model_type=qwen3_5_moe_text on Blackwell.
  DeepGemm E8M0 scale format causes accuracy degradation for this architecture.
  Falling back to CUTLASS. To disable DeepGemm globally, set VLLM_USE_DEEP_GEMM=0.

…and then selects DeepGemm anyway for the MoE layers:

INFO [fp8.py:405] Using DEEPGEMM Fp8 MoE backend out of potential backends:
  ['AITER', 'FLASHINFER_TRTLLM', 'FLASHINFER_CUTLASS', 'DEEPGEMM', 'TRITON', 'MARLIN', ...]

The auto-disable sets quant_config.use_deep_gemm = False (vllm/config/vllm.py), and
qwen3_5_moe_text is present in _DEEPGEMM_BLACKWELL_EXCLUDED_MODEL_TYPES
(vllm/utils/deep_gemm.py) — so the denylist is doing its job. But use_deep_gemm appears to have
no references anywhere under vllm/model_executor/layers/fused_moe/; the FP8 MoE backend
selector honors only the VLLM_USE_DEEP_GEMM / VLLM_MOE_USE_DEEP_GEMM env vars. Net effect: the
denylist covers dense linear layers only, and the MoE layers — where the accuracy concern for an MoE
model actually matters most — still run DeepGemm.

So the warning is truthful about dense layers and silently wrong about MoE.

Why this surfaced now

PR #43477 ("Enable DeepSeek V4 and GLM-5.1 on SM120", shipped v0.24.0) added
is_device_capability_family(120) to deep_gemm.py. Prior to that, the SM100-family gate meant
DeepGemm was never eligible on SM121, so this gap was latent. The FP8 MoE backend priority list
itself is unchanged — DeepGemm simply became eligible and started winning.

Consistent with this, the original accuracy fix #37804 reasoned that "MoE layers are unaffected
(already use FLASHINFER_TRTLLM)" — which holds on SM100 but not on SM121, where
FLASHINFER_TRTLLM is gated out (#43906).

Impact

  1. Accuracy — the exact degradation [Bug] DeepGemm E8M0 scale format causes accuracy degradation for Qwen3.5 FP8 on Blackwell #37804 set out to prevent still applies to this model's MoE
    layers on SM120/121.
  2. Performance — measurable on our hardware. Forcing Triton MoE (matching what vLLM 0.20.1
    selected) recovered most of a regression vs 0.20.1: median TPOT went 37.3 → 34.9ms at
    concurrency 1 and 43.7 → 39.3ms at concurrency 4 for this model.

Expected behavior

The _DEEPGEMM_BLACKWELL_EXCLUDED_MODEL_TYPES denylist should gate the FP8 MoE backend
selection as well as dense linear layers — i.e. Fp8MoeBackend selection should consult the same
use_deep_gemm/model-type exclusion rather than only the env vars.

Workaround

--moe-backend triton (or VLLM_MOE_USE_DEEP_GEMM=0). We shipped --moe-backend triton.

Related

Note on SM121 specifically

On SM121 the alternatives to Triton for FP8 MoE all appear unusable, which is why --moe-backend triton is the only workaround we found: FLASHINFER_TRTLLM gated to SM100 (#43906), VLLM_CUTLASS has
no SM120/121 CollectiveBuilder (#43507), MARLIN produces corrupt output on GB10 (#49546), HUMMING
crashes at startup (#49554).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions