You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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_textis 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).
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.
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).
Your current environment
--enforce-eager, TP=1Qwen3.6-35B-A3B-FP8—model_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:
…and then selects DeepGemm anyway for the MoE layers:
The auto-disable sets
quant_config.use_deep_gemm = False(vllm/config/vllm.py), andqwen3_5_moe_textis present in_DEEPGEMM_BLACKWELL_EXCLUDED_MODEL_TYPES(
vllm/utils/deep_gemm.py) — so the denylist is doing its job. Butuse_deep_gemmappears to haveno references anywhere under
vllm/model_executor/layers/fused_moe/; the FP8 MoE backendselector honors only the
VLLM_USE_DEEP_GEMM/VLLM_MOE_USE_DEEP_GEMMenv vars. Net effect: thedenylist 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)todeep_gemm.py. Prior to that, the SM100-family gate meantDeepGemm 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
layers on SM120/121.
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_TYPESdenylist should gate the FP8 MoE backendselection as well as dense linear layers — i.e.
Fp8MoeBackendselection should consult the sameuse_deep_gemm/model-type exclusion rather than only the env vars.Workaround
--moe-backend triton(orVLLM_MOE_USE_DEEP_GEMM=0). We shipped--moe-backend triton.Related
reported on SM120 with a GB10/SM121 reproducer in the comments — likely the same fix area.
Note on SM121 specifically
On SM121 the alternatives to Triton for FP8 MoE all appear unusable, which is why
--moe-backend tritonis the only workaround we found: FLASHINFER_TRTLLM gated to SM100 (#43906), VLLM_CUTLASS hasno SM120/121 CollectiveBuilder (#43507), MARLIN produces corrupt output on GB10 (#49546), HUMMING
crashes at startup (#49554).