Conversation
The MXFP4 experts-quant and grouped-GEMM kernels were compiled and gated for SM10x/11x only, so MXFP4 W4A4 MoE fell back to Marlin W4A16 on GeForce / RTX PRO Blackwell. CUTLASS resolves an identical block-scaled scale-factor layout for arch::Sm100 and arch::Sm120, so a single scale swizzle serves both families and both kernels can cover SM12x. - Parameterise the grouped GEMM on ArchTag through a new Mxfp4GroupGemmArchConfig trait. SM10x/11x keeps its dedicated 1-SM MXFP4 Ptr-Array schedule and fixed epilogue tile unchanged. SM12x has no MXFP4-specific Ptr-Array schedule tag, so it lets the builder derive the cooperative Ptr-Array block-scaled schedule from the pointer-typed StrideA and pick an epilogue tile that fits the tighter SMEM budget of a TMEM-less part. - Widen the experts-quant capability guard to include SM12x. - Compile both MXFP4 sources for SM12x. - Gate the MXFP4 MoE kernel tests on the compiled-capability query rather than a hardcoded SM family, so they exercise every Blackwell variant the wheel was built for instead of silently skipping. Signed-off-by: ayrnb <641876696@qq.com>
ayrnb
requested review from
AndreasKaratzas,
Harry-Chen,
LucasWilkinson,
WoosukKwon,
mgoin,
tlrmchlsmth,
yewentao256 and
zyongye
as code owners
August 5, 2026 12:23
Harry-Chen
reviewed
Aug 5, 2026
Member
|
Thanks! Have you compared the performance before / after switching implementation? |
Contributor
Author
Yes — measured on RTX PRO 5000 (SM120), CUDA 13.0, Qwen3-30B-A3B-Instruct-2507 MXFP4. I've updated the PR description with the full tables. TL;DR: prefill TTFT improves 7-65%. The decode workload shows a small regression (~1-2%). Still planning to tune it further, especially for decode. |
randomvariable
added a commit
to randomvariable/vllm
that referenced
this pull request
Aug 19, 2026
Port five upstream consumer-Blackwell capabilities so non-DSv4 workloads can serve on GB10 (sm_121, same family as RTX 5090 / RTX PRO 6000 sm_120): 1. TRTLLM fp8 MoE device gate -> SM_12x (upstream vllm-project#43911). 2. OAI Triton MoE capability window -> (9,0) <= cap < (13,0), covering SM120/SM121; kernels are pure Triton JIT with no sm90/sm10x-only instructions (upstream vllm-project#41028). 3. CUTLASS grouped GEMM w8a8 for SM120 (upstream vllm-project#43814): new grouped_mm_c3x_sm120.cu in FP4_SM120_SRCS, ENABLE_CUTLASS_MOE_SM120 dispatch + group_gemm_supported range in entry and _custom_ops.py. The CMake flag already existed (fork); this wires the kernel it promised. 4. NVFP4 grouped MoE pingpong schedule at per-expert M >= 512 (upstream vllm-project#46481): template<bool UsePingpong> on the sm120 entry; the fork's batch-invariance static_assert now pins each instantiation (cooperative stays the default/batch-invariant path). 5. CUTLASS MXFP4 W4A4 MoE on SM12x (upstream vllm-project#51158): mxfp4 kernels join FP4_SM120_SRCS; kernel/test files byte-match the PR head. Deferred (tracked on #48): vllm-project#46329 NVFP4 KV-cache enablement — fork files diverge 300-700 lines (nvfp4_ds_mla ABI, envs, flashinfer backend); needs a hand-merge plus GB10 GPU validation. vllm-project#50288's V-scale-swizzle fix is already contained in 46329's kernel. Verified: py files compile; pre-commit clean (clang-format applied); test_mxfp4_moe skips in this venv (no GPU/triton_kernels) — GPU validation rides the next Spark image build. Co-authored-by: OMP Agent <noreply@omp.local> Signed-off-by: Naadir Jeewa <naadir@randomvariable.co.uk>
randomvariable
added a commit
to randomvariable/vllm
that referenced
this pull request
Aug 23, 2026
Port five upstream consumer-Blackwell capabilities so non-DSv4 workloads can serve on GB10 (sm_121, same family as RTX 5090 / RTX PRO 6000 sm_120): 1. TRTLLM fp8 MoE device gate -> SM_12x (upstream vllm-project#43911). 2. OAI Triton MoE capability window -> (9,0) <= cap < (13,0), covering SM120/SM121; kernels are pure Triton JIT with no sm90/sm10x-only instructions (upstream vllm-project#41028). 3. CUTLASS grouped GEMM w8a8 for SM120 (upstream vllm-project#43814): new grouped_mm_c3x_sm120.cu in FP4_SM120_SRCS, ENABLE_CUTLASS_MOE_SM120 dispatch + group_gemm_supported range in entry and _custom_ops.py. The CMake flag already existed (fork); this wires the kernel it promised. 4. NVFP4 grouped MoE pingpong schedule at per-expert M >= 512 (upstream vllm-project#46481): template<bool UsePingpong> on the sm120 entry; the fork's batch-invariance static_assert now pins each instantiation (cooperative stays the default/batch-invariant path). 5. CUTLASS MXFP4 W4A4 MoE on SM12x (upstream vllm-project#51158): mxfp4 kernels join FP4_SM120_SRCS; kernel/test files byte-match the PR head. Deferred (tracked on #48): vllm-project#46329 NVFP4 KV-cache enablement — fork files diverge 300-700 lines (nvfp4_ds_mla ABI, envs, flashinfer backend); needs a hand-merge plus GB10 GPU validation. vllm-project#50288's V-scale-swizzle fix is already contained in 46329's kernel. Verified: py files compile; pre-commit clean (clang-format applied); test_mxfp4_moe skips in this venv (no GPU/triton_kernels) — GPU validation rides the next Spark image build. Co-authored-by: OMP Agent <noreply@omp.local> Signed-off-by: Naadir Jeewa <naadir@randomvariable.co.uk>
randomvariable
added a commit
to randomvariable/vllm
that referenced
this pull request
Aug 25, 2026
Port five upstream consumer-Blackwell capabilities so non-DSv4 workloads can serve on GB10 (sm_121, same family as RTX 5090 / RTX PRO 6000 sm_120): 1. TRTLLM fp8 MoE device gate -> SM_12x (upstream vllm-project#43911). 2. OAI Triton MoE capability window -> (9,0) <= cap < (13,0), covering SM120/SM121; kernels are pure Triton JIT with no sm90/sm10x-only instructions (upstream vllm-project#41028). 3. CUTLASS grouped GEMM w8a8 for SM120 (upstream vllm-project#43814): new grouped_mm_c3x_sm120.cu in FP4_SM120_SRCS, ENABLE_CUTLASS_MOE_SM120 dispatch + group_gemm_supported range in entry and _custom_ops.py. The CMake flag already existed (fork); this wires the kernel it promised. 4. NVFP4 grouped MoE pingpong schedule at per-expert M >= 512 (upstream vllm-project#46481): template<bool UsePingpong> on the sm120 entry; the fork's batch-invariance static_assert now pins each instantiation (cooperative stays the default/batch-invariant path). 5. CUTLASS MXFP4 W4A4 MoE on SM12x (upstream vllm-project#51158): mxfp4 kernels join FP4_SM120_SRCS; kernel/test files byte-match the PR head. Deferred (tracked on #48): vllm-project#46329 NVFP4 KV-cache enablement — fork files diverge 300-700 lines (nvfp4_ds_mla ABI, envs, flashinfer backend); needs a hand-merge plus GB10 GPU validation. vllm-project#50288's V-scale-swizzle fix is already contained in 46329's kernel. Verified: py files compile; pre-commit clean (clang-format applied); test_mxfp4_moe skips in this venv (no GPU/triton_kernels) — GPU validation rides the next Spark image build. Co-authored-by: OMP Agent <noreply@omp.local> Signed-off-by: Naadir Jeewa <naadir@randomvariable.co.uk>
randomvariable
added a commit
to randomvariable/vllm
that referenced
this pull request
Aug 29, 2026
Port five upstream consumer-Blackwell capabilities so non-DSv4 workloads can serve on GB10 (sm_121, same family as RTX 5090 / RTX PRO 6000 sm_120): 1. TRTLLM fp8 MoE device gate -> SM_12x (upstream vllm-project#43911). 2. OAI Triton MoE capability window -> (9,0) <= cap < (13,0), covering SM120/SM121; kernels are pure Triton JIT with no sm90/sm10x-only instructions (upstream vllm-project#41028). 3. CUTLASS grouped GEMM w8a8 for SM120 (upstream vllm-project#43814): new grouped_mm_c3x_sm120.cu in FP4_SM120_SRCS, ENABLE_CUTLASS_MOE_SM120 dispatch + group_gemm_supported range in entry and _custom_ops.py. The CMake flag already existed (fork); this wires the kernel it promised. 4. NVFP4 grouped MoE pingpong schedule at per-expert M >= 512 (upstream vllm-project#46481): template<bool UsePingpong> on the sm120 entry; the fork's batch-invariance static_assert now pins each instantiation (cooperative stays the default/batch-invariant path). 5. CUTLASS MXFP4 W4A4 MoE on SM12x (upstream vllm-project#51158): mxfp4 kernels join FP4_SM120_SRCS; kernel/test files byte-match the PR head. Deferred (tracked on #48): vllm-project#46329 NVFP4 KV-cache enablement — fork files diverge 300-700 lines (nvfp4_ds_mla ABI, envs, flashinfer backend); needs a hand-merge plus GB10 GPU validation. vllm-project#50288's V-scale-swizzle fix is already contained in 46329's kernel. Verified: py files compile; pre-commit clean (clang-format applied); test_mxfp4_moe skips in this venv (no GPU/triton_kernels) — GPU validation rides the next Spark image build. Co-authored-by: OMP Agent <noreply@omp.local> Signed-off-by: Naadir Jeewa <naadir@randomvariable.co.uk>
randomvariable
added a commit
to randomvariable/vllm
that referenced
this pull request
Aug 29, 2026
Port five upstream consumer-Blackwell capabilities so non-DSv4 workloads can serve on GB10 (sm_121, same family as RTX 5090 / RTX PRO 6000 sm_120): 1. TRTLLM fp8 MoE device gate -> SM_12x (upstream vllm-project#43911). 2. OAI Triton MoE capability window -> (9,0) <= cap < (13,0), covering SM120/SM121; kernels are pure Triton JIT with no sm90/sm10x-only instructions (upstream vllm-project#41028). 3. CUTLASS grouped GEMM w8a8 for SM120 (upstream vllm-project#43814): new grouped_mm_c3x_sm120.cu in FP4_SM120_SRCS, ENABLE_CUTLASS_MOE_SM120 dispatch + group_gemm_supported range in entry and _custom_ops.py. The CMake flag already existed (fork); this wires the kernel it promised. 4. NVFP4 grouped MoE pingpong schedule at per-expert M >= 512 (upstream vllm-project#46481): template<bool UsePingpong> on the sm120 entry; the fork's batch-invariance static_assert now pins each instantiation (cooperative stays the default/batch-invariant path). 5. CUTLASS MXFP4 W4A4 MoE on SM12x (upstream vllm-project#51158): mxfp4 kernels join FP4_SM120_SRCS; kernel/test files byte-match the PR head. Deferred (tracked on #48): vllm-project#46329 NVFP4 KV-cache enablement — fork files diverge 300-700 lines (nvfp4_ds_mla ABI, envs, flashinfer backend); needs a hand-merge plus GB10 GPU validation. vllm-project#50288's V-scale-swizzle fix is already contained in 46329's kernel. Verified: py files compile; pre-commit clean (clang-format applied); test_mxfp4_moe skips in this venv (no GPU/triton_kernels) — GPU validation rides the next Spark image build. Co-authored-by: OMP Agent <noreply@omp.local> Signed-off-by: Naadir Jeewa <naadir@randomvariable.co.uk>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Purpose
Enable CUTLASS MXFP4 W4A4 MoE on SM12x (GeForce / RTX PRO Blackwell). Previously, MXFP4 experts-quant and grouped-GEMM kernels were compiled and gated for SM10x/11x only, so MXFP4 W4A4 MoE silently fell back to Marlin W4A16 on consumer / prosumer Blackwell parts.
Changes
mxfp4_blockwise_moe_kernel.cu: AddMxfp4GroupGemmArchConfig<Arch>trait.SM10x/11x keeps its dedicated 1-SM MXFP4 schedule unchanged. SM12x uses
KernelScheduleAuto/EpilogueScheduleAuto/EpilogueTileAuto—the CUTLASS SM120 builder auto-selects the cooperative Ptr-Array
block-scaled schedule from the pointer-typed
StrideAand picks anepilogue tile that fits the tighter SMEM budget.
mxfp4_experts_quant.cu: Widen capability guard>= 100 && < 120→>= 100 && < 130. SM100/SM120 share the same block-scaled SF layout.CMakeLists.txt: Add both MXFP4 sources toFP4_SM120_SRCS.test_mxfp4_moe.py: Replace hardcodedis_device_capability_family(100)skip with runtime
mxfp4_experts_quant_supported()query, same predicateCutlassExpertsMxfp4uses.Test Result
Environment: RTX PRO 5000 (SM120), CUDA 13.0, Qwen3-30B-A3B-Instruct-2507 MXFP4
Throughput
Prefill
E2E
Accuracy
Running GSM8K evaluation: 1319 questions, 5-shot
Evaluating: 100%|███████████████████████████████████████████████████████████████████████████████████| 1319/1319 [02:13<00:00, 9.88it/s]
Results:
Accuracy: 0.875
Invalid responses: 0.000
Total latency: 133.454 s
Questions per second: 9.884
Total output tokens: 200389
Output tokens per second: 1501.558
Essential Elements of an Effective PR Description Checklist
supported_models.mdandexamplesfor a new model.