Skip to content

feat(cake_alpha_moe): add optimized Blackwell W8A8 expert up/down compute - #4287

Merged
yyihuang merged 11 commits into
flashinfer-ai:mainfrom
xslingcn:alphamoe-sm100
Sep 13, 2026
Merged

yyihuang merged 11 commits into
flashinfer-ai:mainfrom
xslingcn:alphamoe-sm100

Conversation

@xslingcn

@xslingcn xslingcn commented Jul 31, 2026

Copy link
Copy Markdown
Member

📌 Description

Add the SM100a/SM103a AlphaMoE W8A8 compute API alphamoe_fp8_block_scale_aligned_moe and offline alphamoe_interleave_gated_weights helper. The compute call fuses gate/up projection, SwiGLU, intermediate FP8 requantization and down projection over an existing aligned route plan, accumulating into BF16 output without a global intermediate.

Final W8 kernel performance (v46)

Measured CUDA: f37119c07d56. Test-only head 106dede4b7f5 fixes down-reference post-dot scaling; CUDA, exact assertions and tolerances are unchanged. GB300 replay: all 9 original tests pass.

CI: pre-commit/API/docs pass. Separate validation: all 23 executed non-VR200 jobs pass (22 required). W8: 9/9 on B200/GB200/GB300 x CUDA12.9/13.0 (54/54); dedicated multi-GPU/node suites are separate. GitHub CI is running (10 passed, 3 active). Appendix is historical.

S=stock SGLang Triton; C=candidate; O=old public export; W=source launcher. W/C is export parity. S runtime: 5407ec1a7dfee227a408702addcc15007ec7f126. CUDA SHA256 C: 237a9b44549fa82fb3f7833ee51df76dd08d0927fc22674bc62c77c2182429b1; O: 9be0cee09c84bf5dfd41fd65c5fe705761d614172dff6e147dd1e4a9584573ea (separate JIT, same flags/ABI).

Same FP8 codes/scales, weights/routes to BF16. S times GEMM1, SwiGLU, intermediate FP8 quantization, GEMM2, combine (5 kernels); C/O/W fuse all five (1 kernel). us sum GPU durations; CPU gaps excluded. Input quantization, backend route alignment, weight conversion, allocation, JIT, warmup and per-sample output resets are untimed. Rounding/accumulation differ.

GB300/SM103a, 1 GPU, strict cold-L2 CUPTI, no fallback. Per arm: 5 warmups, 30 samples/round, 5 paired rounds/shape; odd C,S,O,W; even W,O,S,C. Rows=30-sample medians; summary durations=5-row medians; ratios=median paired ratios. All 2400 samples audited.

Fixtures: N=2I=256; scale blocks128x128; routing balancedness0.8. A8/A128: M8/128,K7168,E257,k9,shared,scale2.5,seeds28101/28102. Q8/Q128: M8/128,K2048,E512,k10,no shared,scale1,seeds28103/28104. Q uses Qwen geometry; fixtures are not real-request correctness.

S: BM/BN/BK=64/128/128,group-M=32,4 warps,3 stages,no up/down TMA or separate down config. C/O/W BM=8; C:192 threads,3 stages; z=2 iff M<=8 and K>=4096, else 1; y=1; disjoint Z output columns.

Summary (us; ratios >1 favor C):

Case S C O W S/C O/C W/C
A8 98.511 71.856 102.928 71.744 1.371632 1.431553 1.000446
A128 351.488 204.288 206.385 204.656 1.719928 1.009867 1.001257
Q8 45.696 26.257 26.416 26.288 1.740560 1.006090 1.000610
Q128 185.856 106.047 106.096 105.520 1.750188 1.001057 0.995176

All 20 paired rounds:

Case r S C O W S/C O/C W/C
A8 1 98.480 71.696 102.976 71.728 1.373577 1.436287 1.000446
A8 2 98.432 71.616 102.928 71.680 1.374441 1.437221 1.000894
A8 3 98.560 71.856 102.864 71.744 1.371632 1.431523 0.998441
A8 4 98.512 71.888 102.912 71.951 1.370354 1.431553 1.000883
A8 5 98.511 72.016 102.928 71.744 1.367914 1.429248 0.996230
A128 1 350.639 204.288 206.241 204.544 1.716398 1.009560 1.001253
A128 2 351.552 204.399 206.224 204.656 1.719928 1.008931 1.001257
A128 3 351.488 204.192 206.479 204.448 1.721363 1.011200 1.001254
A128 4 351.520 204.128 206.386 204.912 1.722057 1.011059 1.003843
A128 5 351.425 204.368 206.385 204.848 1.719570 1.009867 1.002346
Q8 1 45.712 26.192 26.432 26.288 1.745266 1.009163 1.003665
Q8 2 45.728 26.272 26.432 26.352 1.740560 1.006090 1.003045
Q8 3 45.696 26.240 26.401 26.256 1.741463 1.006117 1.000610
Q8 4 45.680 26.257 26.416 26.176 1.739760 1.006075 0.996934
Q8 5 45.632 26.336 26.336 26.288 1.732685 1.000000 0.998177
Q128 1 183.713 105.984 106.096 105.856 1.733398 1.001057 0.998792
Q128 2 185.584 106.047 105.921 105.488 1.750008 0.998807 0.994724
Q128 3 186.337 106.128 105.936 105.504 1.755776 0.998191 0.994120
Q128 4 186.064 106.031 106.208 105.520 1.754808 1.001665 0.995176
Q128 5 185.856 106.192 106.337 106.015 1.750188 1.001361 0.998333

All 20 S/C>1. Q128 O/C<1 in rounds 2,3 (median 1.001057); W/C median 0.995176: export overhead, no significance claim.

SUCCESS/exit 0: submit-to-terminal 93.530691s, physical 93.431010s, harness 71.991005s.

FP32 scales: ((a*b)*r)*s becomes ((a*r)*s)*b (a=activation,b=W2,r=gated route,s=routed scale), not bit-identical. Qwen validates z1; H7168/z2 has performance evidence only.

Final Qwen correctness (v46)

4xGB300,TP4/EP1; Qwen/Qwen3-Next-80B-A3B-Instruct-FP8@c5f5f263bdd5cc134092897864e8905d8fe7b928. Fixed AlphaMoE router: stock Triton experts B vs final W8 C (independent W8 attribution).

Independent audit: B=C=1259/1314 (95.8143%), delta 0; 7 gains/7 losses. Unchanged gates pass: both>=0.95,C-B>=-0.005. Five-shot GSM8K questions/prompts/references and wire/SDK inputs match. Each side: 1314 successful HTTP responses; 0 failures/retries/invalid/empty answers. Empty answers count wrong; paired outputs/HTTP receipts retained.

Runtime and CUDA identities are above. Dataset SHA256:3730d312f6e3440559ace48831e51066acaca737f6eabec99bccb9e4b3c39d14.

Four TP ranks: actual router kernels in B/C; kernel_alpha_moe_w8a8_up_down in C. Real requests: H2048/I128/E512/k10/BM8,z1. C kernel-M discrete sets (count;min,max): decode(49;8,512), eager(97;515,911), prefill(28;64,16384). Exact sets/token counts retained; graph M denotes real-request replay geometry. Integrity passes.

API B/C: 62.166970/50.689964s; harness 1448.686871s; physical turnaround 1460.407082s. Correctness wall times, not serving throughput or kernel timing.

Separate GB300 sanitizer replays preserve real eager inputs/layout: M1/H2048/I128/E512/k10/BM8,scale1,rank0/layer0,z1. Synccheck: 0 errors (23.510655s physical); racecheck: 0 hazards/errors/warnings (25.081664s). Scope excludes z2, graphs and other ranks. Capture: 545.017671s physical, 536.014468s harness, 513.267672s startup, 3.942568s request; no new accuracy/performance run.

Retained pre-optimization measurements and review history

The following unchanged record describes the earlier implementation and its original validation revisions. Its references to the current head or final results apply to that historical record, not the new revision above.

Real SGLang E2E correctness: PASS on the Qwen3-Next FP8 workload below. Holding AlphaMoE routing fixed and replacing Triton expert compute with this W8A8 compute gives 1263/1314 → 1260/1314 correct (96.1187% → 95.8904%, −0.2283 percentage points). Both sides exceed the unchanged 95% threshold and the paired drop is within 0.5 percentage points. The separate stock-to-combined comparison is 1261/1314 → 1260/1314; it is reported separately from W8A8 attribution. The retained audit checks all real question/prompt pairs, HTTP responses, runtime shapes and actual kernels on all four TP ranks. Full per-repeat serving results below retain the combined-path C128 regression.

Current head: 6818acabd7600e1cc6d13331dfa73c86f86c4947. The measured W8A8 implementation at f12b7d47f14c94fae8d3d44cc01e16c6eddd26f8, exercised in c6407025a445d0d6c3bcfd28a7326456b17e4387, is unchanged in this head, including its bindings and registration. The later main merge is source-equivalence evidence; these remain the original real-model measurements, with their exact runtime revisions recorded below. The measured public revision was based on main aeab8e964bb76675012a2bd2b72bec06502af48a. Older historical measurements remain labelled separately and do not validate the current implementation.

New kernel measurements on 2026-09-13 UTC use the retained combined FlashInfer checkout f5c95353d3723360c55c6af313afd09bbd8bfdac; this API implementation is unchanged in the current PR head. This is a new GPU performance measurement, separate from the retained real-model correctness run.

W8A8 fused expert-compute GPU performance

Hardware: NVIDIA GB300; one GPU per measurement. Five paired rounds per shape, 30 cold-L2 samples per arm per round, strict CUPTI activity tracing without timing-backend fallback. Each round has 5 explicit warmup invocations per arm. Compilation, autotuning, fixture allocation and output reset are outside the recorded intervals.

GPU sum is the sum of correlated kernel durations. GPU span is the first-to-last correlated activity interval and includes inter-kernel gaps; it can therefore include delays between host submissions. They are different measurements and are reported separately. Speedup = baseline duration / candidate duration; below 1× is a regression. Summary durations are medians of five round medians, and summary speedups are medians of the five paired ratios.

No separate SM-clock observations were retained by this W8A8 runner; no fixed-clock or clock-normalized comparison is claimed.

These deterministic performance fixtures reuse the retained generators. They are not real-model accuracy evidence; the separate real-model SGLang E2E correctness section remains authoritative. Five rounds are repeated workload samples, not five independent service starts.

Baseline: stock SGLang Triton prequantized/prealigned MoE compute sequence, using the stock selected configuration. Candidate: one fused W8A8 expert-compute kernel. Both receive the same FP8 activation codes, scales, FP32 route weights and logical expert weights. Input quantization, route alignment and static weight-layout conversion are outside both boundaries. Baseline GEMM1, SwiGLU, intermediate FP8 quantization, GEMM2 and combination are all measured; the candidate fuses this work. Each implementation retains its own intermediate rounding and accumulation behavior. The stock routine retains its ordinary intermediate-allocation calls; CPU gaps affect span but not summed GPU durations.

Qwen geometry uses routed scaling 1.0 and no shared expert. E=257 geometry uses routed scaling 2.5 and one shared expert. FP8 weight blocks are 128×128; activation quantization groups are 128. Per-shape stock default/tuned configuration selected by the existing stock dispatcher is recorded below; no new tuning search is performed by this runner.

Shape Baseline GPU sum (µs) Candidate GPU sum (µs) Sum speedup Baseline GPU span (µs) Candidate GPU span (µs) Span speedup
M=8, H=2048, I=128, E=512, top-k=10, BM=8, shared=0 45.776 26.016 1.7608× 261.776 26.016 10.1119×
M=128, H=2048, I=128, E=512, top-k=10, BM=8, shared=0 185.663 105.920 1.7529× 328.016 105.920 3.0968×
M=8, H=7168, I=128, E=257, top-k=9, BM=8, shared=1 98.416 104.176 0.9444× 255.328 104.176 2.4502×
M=128, H=7168, I=128, E=257, top-k=9, BM=8, shared=1 352.192 206.145 1.7102× 415.056 206.145 2.0131×

Every paired round

Each duration below is the median of 30 samples; all raw sample distributions and correlated activity identities are retained in the audit artifacts.

Shape / round Baseline GPU sum (µs) Candidate GPU sum (µs) Sum speedup Baseline GPU span (µs) Candidate GPU span (µs) Span speedup
M=8, H=2048, I=128, E=512, top-k=10, BM=8, shared=0 / 1 45.776 25.888 1.7682× 279.424 25.888 10.7936×
M=8, H=2048, I=128, E=512, top-k=10, BM=8, shared=0 / 2 45.696 26.080 1.7521× 268.784 26.080 10.3061×
M=8, H=2048, I=128, E=512, top-k=10, BM=8, shared=0 / 3 45.792 26.096 1.7548× 254.449 26.096 9.7505×
M=8, H=2048, I=128, E=512, top-k=10, BM=8, shared=0 / 4 45.808 26.016 1.7608× 254.255 26.016 9.7730×
M=8, H=2048, I=128, E=512, top-k=10, BM=8, shared=0 / 5 45.728 25.888 1.7664× 261.776 25.888 10.1119×
M=128, H=2048, I=128, E=512, top-k=10, BM=8, shared=0 / 1 184.192 105.967 1.7382× 334.208 105.967 3.1539×
M=128, H=2048, I=128, E=512, top-k=10, BM=8, shared=0 / 2 184.704 105.600 1.7491× 333.279 105.600 3.1561×
M=128, H=2048, I=128, E=512, top-k=10, BM=8, shared=0 / 3 186.208 106.080 1.7554× 327.904 106.080 3.0911×
M=128, H=2048, I=128, E=512, top-k=10, BM=8, shared=0 / 4 186.512 105.664 1.7651× 326.913 105.664 3.0939×
M=128, H=2048, I=128, E=512, top-k=10, BM=8, shared=0 / 5 185.663 105.920 1.7529× 328.016 105.920 3.0968×
M=8, H=7168, I=128, E=257, top-k=9, BM=8, shared=1 / 1 98.624 104.176 0.9467× 283.904 104.176 2.7252×
M=8, H=7168, I=128, E=257, top-k=9, BM=8, shared=1 / 2 98.592 104.160 0.9465× 243.856 104.160 2.3412×
M=8, H=7168, I=128, E=257, top-k=9, BM=8, shared=1 / 3 98.416 104.209 0.9444× 251.984 104.209 2.4181×
M=8, H=7168, I=128, E=257, top-k=9, BM=8, shared=1 / 4 98.303 104.095 0.9444× 262.128 104.095 2.5181×
M=8, H=7168, I=128, E=257, top-k=9, BM=8, shared=1 / 5 98.320 104.208 0.9435× 255.328 104.208 2.4502×
M=128, H=7168, I=128, E=257, top-k=9, BM=8, shared=1 / 1 352.192 205.935 1.7102× 409.648 205.935 1.9892×
M=128, H=7168, I=128, E=257, top-k=9, BM=8, shared=1 / 2 351.952 206.047 1.7081× 404.225 206.047 1.9618×
M=128, H=7168, I=128, E=257, top-k=9, BM=8, shared=1 / 3 351.904 206.176 1.7068× 416.192 206.176 2.0186×
M=128, H=7168, I=128, E=257, top-k=9, BM=8, shared=1 / 4 353.073 206.145 1.7127× 419.777 206.145 2.0363×
M=128, H=7168, I=128, E=257, top-k=9, BM=8, shared=1 / 5 352.912 206.176 1.7117× 415.056 206.176 2.0131×

Stock configuration and activity counts

  • M=8, H=2048, I=128, E=512, top-k=10, BM=8, shared=0; seed 28103; kernel counts per sample {"candidate": [1], "stock": [5]}; stock configuration {"alignment_block_m": 64, "config": {"BLOCK_SIZE_K": 128, "BLOCK_SIZE_M": 64, "BLOCK_SIZE_N": 128, "GROUP_SIZE_M": 32, "num_stages": 3, "num_warps": 4}, "down_config": null, "down_tma": false, "plan_extent": 4864, "up_tma": false}.
  • M=128, H=2048, I=128, E=512, top-k=10, BM=8, shared=0; seed 28104; kernel counts per sample {"candidate": [1], "stock": [5]}; stock configuration {"alignment_block_m": 64, "config": {"BLOCK_SIZE_K": 128, "BLOCK_SIZE_M": 64, "BLOCK_SIZE_N": 128, "GROUP_SIZE_M": 32, "num_stages": 3, "num_warps": 4}, "down_config": null, "down_tma": false, "plan_extent": 29376, "up_tma": false}.
  • M=8, H=7168, I=128, E=257, top-k=9, BM=8, shared=1; seed 28101; kernel counts per sample {"candidate": [1], "stock": [5]}; stock configuration {"alignment_block_m": 64, "config": {"BLOCK_SIZE_K": 128, "BLOCK_SIZE_M": 64, "BLOCK_SIZE_N": 128, "GROUP_SIZE_M": 32, "num_stages": 3, "num_warps": 4}, "down_config": null, "down_tma": false, "plan_extent": 3520, "up_tma": false}.
  • M=128, H=7168, I=128, E=257, top-k=9, BM=8, shared=1; seed 28102; kernel counts per sample {"candidate": [1], "stock": [5]}; stock configuration {"alignment_block_m": 64, "config": {"BLOCK_SIZE_K": 128, "BLOCK_SIZE_M": 64, "BLOCK_SIZE_N": 128, "GROUP_SIZE_M": 32, "num_stages": 3, "num_warps": 4}, "down_config": null, "down_tma": false, "plan_extent": 16320, "up_tma": false}.

The two successful timing steps took 49.199 s and 50.666 s physical execution (99.865 s total); their first-start-to-final-end turnaround was 512.419 s, including the intervening additional-shape submission. These are separate from the microsecond GPU intervals above.

Public contract and review fixes

  • FP8 E4M3 activations [M,K] with FP32 per-token group-128 scales; FP8 weights with FP32 128×128 block scales. Gate/up rows use the provided eight-row interleave.
  • K % 128 == 0; combined gate/up width N % 256 == 0; block_m >= 8 and divisible by eight. These are API constraints, not claims that every admitted shape has model-accuracy coverage.
  • An omitted output is zero-allocated; supplied BF16 output is an initial accumulator. Cross-CTA BF16 reduce-add order is nondeterministic.
  • Aligned routes use token/route flattened IDs and a device active extent. The binding now checks sorted_token_ids.numel() >= expert_ids.numel() * block_m, including inactive capacity.
  • A CUDA device guard selects the input tensor's device before descriptor creation and launch.
  • All-zero activation blocks use unit scale so quantization and dequantization preserve zero without 0 * infinity. Every nonzero block retains the original scale calculation. The device source consequently is no longer described as byte-identical to the original export.
  • Public exports, backend/compute-capability metadata, JIT/AOT registration, and both APIs' fi_trace descriptions are included. JIT uses only requested exact SM100a/SM103a targets; SM100a requires CUDA ≥12.8 and SM103a CUDA ≥12.9.
  • Existing reference tests dequantize weights only for active experts to reduce memory use. The review suggestion to add an extra accumulation-order tolerance to the final strict-equality assertion was not adopted; numerical acceptance has not been loosened.

Real-model evaluation scope and acceptance

The SGLang integration is sgl-project/sglang#34072. Its W8 path is explicitly limited to Qwen3-Next FP8, BF16 activations, TP4/EP1, E512/H2048/I_local128/routed_top_k10/BM8, no expert all-to-all, and separate shared experts. It rejects unsupported routing/activation options, full torch.compile, and speculative decoding.

The evaluation used the pinned real Qwen checkpoint, the canonical full GSM8K 5-shot chat workload, identical baseline/candidate prompts, temperature zero, and retained per-question answers. Candidate accuracy was required to remain ≥0.95 and the paired accuracy delta ≥−0.005. Triton, router-only with Triton expert compute, and the combined AlphaMoE backend were measured separately. Shapes came only from live requests after health, with eager/graph receipts and GPU kernel execution evidence. No hand-authored tensor case or microbenchmark was counted as model correctness.

Performance reporting requires every baseline/candidate workload repeat, ratio, TTFT/TPOT, and available memory metrics. Five workload repeats are not described as five independent server restarts.

Recorded real-model E2E results

The following reports identify the evaluated source and model revisions. They retain every serving repeat, failed gate and unavailable metric. Historical reports remain separately labeled below.

Qwen W8A8 attribution, holding the AlphaMoE router fixed (graph)

Model: Qwen/Qwen3-Next-80B-A3B-Instruct-FP8 at c5f5f263bdd5cc134092897864e8905d8fe7b928. SGLang: 5407ec1a7dfee227a408702addcc15007ec7f126; FlashInfer: c6407025a445d0d6c3bcfd28a7326456b17e4387.

Comparison: AlphaMoE router + Triton MoE → AlphaMoE router + W8A8 MoE. TP4 / EP1 / DP1, execution mode graph, speculative decoding disabled, shared-expert fusion disabled on both sides.

FP8 checkpoint with the fixed 0.95 acceptance threshold. The retained five-shot scorer preserves the historical evaluation protocol; current SGLang default registrations use sgl-eval instead.

Resolved server setting Baseline Candidate
moe_runner_backend triton flashinfer_alphamoe
attention_backend triton triton
prefill_attention_backend None None
decode_attention_backend None None
kv_cache_dtype auto auto
chunked_prefill_size 16384 16384
mem_fraction_static 0.7 0.7
cuda_graph_config {'decode': {'backend': 'full', 'bs': [1, 2, 4, 8, 12, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, 448, 464, 480, 496, 512], 'full_prefill_max_req': None, 'full_prefill_prefix_chunk_tokens': None, 'max_bs': 512, 'tc_compiler': 'eager'}, 'prefill': {'backend': 'breakable', 'bs': [4, 8, 12, 16, 20, 24, 28, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 832, 896, 960, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4608, 5120, 5632, 6144, 6656, 7168, 7680, 8192, 8704, 9216, 9728, 10240, 10752, 11264, 11776, 12288, 12800, 13312, 13824, 14336, 14848, 15360, 15872, 16384], 'full_prefill_max_req': None, 'full_prefill_prefix_chunk_tokens': None, 'max_bs': 16384, 'tc_compiler': 'eager'}} {'decode': {'backend': 'full', 'bs': [1, 2, 4, 8, 12, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, 448, 464, 480, 496, 512], 'full_prefill_max_req': None, 'full_prefill_prefix_chunk_tokens': None, 'max_bs': 512, 'tc_compiler': 'eager'}, 'prefill': {'backend': 'breakable', 'bs': [4, 8, 12, 16, 20, 24, 28, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 832, 896, 960, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4608, 5120, 5632, 6144, 6656, 7168, 7680, 8192, 8704, 9216, 9728, 10240, 10752, 11264, 11776, 12288, 12800, 13312, 13824, 14336, 14848, 15360, 15872, 16384], 'full_prefill_max_req': None, 'full_prefill_prefix_chunk_tokens': None, 'max_bs': 16384, 'tc_compiler': 'eager'}}

This comparison holds the AlphaMoE router fixed and isolates replacing the Triton MoE computation with AlphaMoE W8A8.

GSM8K uses the repository's retained five-shot chat scorer (sglang.test.simple_eval_mixed_prefix_gsm8k.GSM8KEval), all 1,314 held-out examples (the first five of the 1,319-example split supply the examples), temperature 0, top-p 1, and a 2,048-token generation limit. Both variants receive the same prompts and references.

Metric Baseline Candidate Change
Correct / evaluated 1263 / 1314 1260 / 1314 -3 questions
Accuracy 0.961187 0.958904 -0.2283 percentage points
Invalid answer parses 0 0
GSM8K API runtime (s) 54.85 49.01

Accuracy gate: PASS. Both accuracies must be at least 0.95, and candidate minus baseline must be ≥ −0.005. The candidate gained 6 questions and lost 9; a passing accuracy gate does not assert bitwise equality or zero accuracy loss.

End-to-end kernel verification: PASS. This additionally requires complete server/request evidence and actual GPU kernel traces for each AlphaMoE variant in this comparison.

Performance

Five fixed-workload repetitions run per server variant and are paired by repeat ID and seed. They are not five independent server launches. All repeats are included. Throughput speedup is candidate output tokens/s divided by baseline output tokens/s; values below 1 are regressions. TTFT, TPOT and request E2E columns are per-repeat medians in milliseconds; lower is better.

Workload: 1024 input / 512 output tokens, 1,024 requests per repeat.

Concurrency Repeat Baseline output tok/s Candidate output tok/s Speedup TTFT B → C (ms) TPOT B → C (ms) E2E B → C (ms)
32 1 3600.96 4145.22 1.1511× 305.18 → 418.72 8.28 → 6.66 4572.73 → 3963.22
32 2 3576.56 4118.20 1.1514× 290.00 → 408.89 8.32 → 6.75 4576.59 → 3975.70
32 3 3569.70 4115.10 1.1528× 283.50 → 418.02 8.37 → 6.72 4598.48 → 3993.60
32 4 3596.07 4139.69 1.1512× 295.33 → 425.59 8.28 → 6.68 4556.68 → 3965.68
32 5 3569.92 4123.11 1.1550× 294.05 → 406.05 8.33 → 6.73 4577.83 → 3975.12
64 1 5566.76 6453.25 1.1592× 556.52 → 781.30 10.47 → 8.49 5885.69 → 5063.53
64 2 5536.31 6449.45 1.1649× 435.59 → 769.43 10.62 → 8.42 5887.46 → 5065.06
64 3 5519.01 6426.75 1.1645× 437.51 → 697.30 10.58 → 8.46 5934.70 → 5078.82
64 4 5535.61 6443.33 1.1640× 570.39 → 840.72 10.52 → 8.33 5875.06 → 5072.09
64 5 5537.93 6415.55 1.1585× 460.49 → 942.88 10.58 → 8.49 5889.05 → 5067.80
128 1 8408.49 8920.52 1.0609× 872.12 → 1392.23 13.58 → 11.53 7804.26 → 7328.25
128 2 8358.83 8914.45 1.0665× 861.38 → 1477.78 13.74 → 11.51 7799.41 → 7330.97
128 3 8350.30 8851.62 1.0600× 743.39 → 1482.56 13.78 → 11.77 7779.44 → 7343.11
128 4 8438.90 8897.23 1.0543× 875.43 → 1458.07 13.54 → 11.75 7702.39 → 7283.14
128 5 8385.25 8835.57 1.0537× 869.88 → 1474.67 13.65 → 11.83 7746.61 → 7322.19
Concurrency Mean baseline output tok/s Mean candidate output tok/s Median paired speedup Candidate wins
32 3582.64 4128.26 1.1514× 5 / 5
64 5539.13 6437.67 1.1640× 5 / 5
128 8388.35 8883.88 1.0600× 5 / 5

Performance gate: PASS. Every concurrency must have median paired speedup ≥ 1, and at least one must win all five paired repetitions.

Memory and execution evidence

Memory values below are resident-device snapshots after health/model/graph startup or after the named phase. They include model, KV cache and allocator reservations; they are not peak measurements or isolated CUDA Graph allocations.

Snapshot Baseline per-device MiB Candidate per-device MiB
after health 208962, 209026, 209026, 208706 264772, 264842, 264842, 264522
after accuracy 211710, 211774, 211774, 211454 264772, 264842, 264842, 264522
after performance 209658, 209718, 209718, 209398 265444, 265554, 265554, 265234

Post-health GSM8K dispatch/capture receipts observed execution modes: decode_graph_replay, eager, prefill_graph_replay. Startup capture and fixed-workload performance requests are excluded from this coverage.

Observed AlphaMoE runtime shapes below come from those request receipts. Kernel M is the submitted kernel geometry, or the registered capture geometry when a real request replayed that graph. Dispatch M includes graph padding; real tokens are the actual request tokens before that padding. Each column lists its observed values separately, not a Cartesian product of supported shapes. An inclusive range contains only consecutive values that were all observed; missing values are not inferred. The stock baseline has no AlphaMoE kernel shape records.

Variant Execution Kernel E H I local Routed top-k Block M Observed kernel M Observed dispatch M Observed real tokens
router_only decode_graph_replay alphamoe_fused_router 512 2048 not applicable 10 8 4, 8, 12, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, 448, 464, 480, 496, 512 4, 8, 12, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, 448, 464, 480, 496, 512 4–26, 28, 30–43, 46, 48, 50–69, 71–78, 80–81, 83, 85–88, 90–91, 95–98, 100, 103–104, 106, 108, 110, 112–114, 116, 118–119, 123–127, 129, 131, 134–135, 137–138, 140, 143–145, 148–149, 153–157, 162, 164, 167, 170, 172, 176–177, 179, 184–187, 191, 195–199, 205, 210, 212, 214, 218, 222–223, 226, 229, 231, 234, 236, 239, 241–242, 245, 249, 251, 256, 258, 262, 267, 269, 272, 275–276, 280, 282, 288, 292, 294, 296, 299–300, 303, 306, 310, 313–314, 316, 320, 324, 328, 331, 334, 336, 340, 342–344, 348, 351–352, 354, 358, 362, 366, 369–370, 375, 377, 380, 385, 388, 394–395, 399, 405, 409, 411–412, 420, 422–423, 429, 432, 437, 443, 446, 448, 452, 455, 458, 465, 468, 476, 481, 487–489, 494, 501, 508, 511
router_only eager alphamoe_fused_router 512 2048 not applicable 10 8 514, 518, 523, 526, 530, 535–536, 545, 551, 558, 562, 565, 572, 579, 584, 586, 589, 592, 598, 605, 611, 617, 620, 624, 630, 636, 643, 648, 656, 660, 667, 673, 677, 681, 686, 689, 691, 696, 700, 703, 710, 713, 721, 727, 731, 736, 741, 746, 749, 753, 760, 765, 767, 771, 776, 782, 787, 793, 796, 803, 806, 809, 813, 818, 823, 826, 830–831, 833, 837, 846, 850, 856, 859, 866, 869, 873, 879, 884, 887, 894, 899, 902–911 514, 518, 523, 526, 530, 535–536, 545, 551, 558, 562, 565, 572, 579, 584, 586, 589, 592, 598, 605, 611, 617, 620, 624, 630, 636, 643, 648, 656, 660, 667, 673, 677, 681, 686, 689, 691, 696, 700, 703, 710, 713, 721, 727, 731, 736, 741, 746, 749, 753, 760, 765, 767, 771, 776, 782, 787, 793, 796, 803, 806, 809, 813, 818, 823, 826, 830–831, 833, 837, 846, 850, 856, 859, 866, 869, 873, 879, 884, 887, 894, 899, 902–911 514, 518, 523, 526, 530, 535–536, 545, 551, 558, 562, 565, 572, 579, 584, 586, 589, 592, 598, 605, 611, 617, 620, 624, 630, 636, 643, 648, 656, 660, 667, 673, 677, 681, 686, 689, 691, 696, 700, 703, 710, 713, 721, 727, 731, 736, 741, 746, 749, 753, 760, 765, 767, 771, 776, 782, 787, 793, 796, 803, 806, 809, 813, 818, 823, 826, 830–831, 833, 837, 846, 850, 856, 859, 866, 869, 873, 879, 884, 887, 894, 899, 902–911
router_only prefill_graph_replay alphamoe_fused_router 512 2048 not applicable 10 8 80, 96, 112, 128, 144, 176, 192, 208, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 832, 896, 2048, 4096, 4608, 5120, 5632, 6144, 7680, 10752, 12288, 16384 80, 96, 112, 128, 144, 176, 192, 208, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 832, 896, 2048, 4096, 4608, 5120, 5632, 6144, 7680, 10752, 12288, 16384 69, 73–75, 77–79, 83, 86, 102–103, 113–115, 142, 171, 173, 186, 195, 202, 239, 250, 253, 262, 271, 275, 278, 298, 302, 304, 313, 340, 342, 344–346, 370, 378, 390, 421, 424, 431, 441, 455–456, 460, 467, 480, 484–485, 487, 496, 504, 510, 515, 527–528, 530, 541, 546, 548, 557, 589, 593–594, 618, 635, 637, 647, 653–654, 661, 666, 671, 677, 682, 691, 695, 730, 738, 745, 753, 797, 799, 853, 867, 880, 883, 1799, 3884, 3887, 4230, 4254, 4353, 4606, 4846, 5286, 5724, 7178, 10416, 10574, 11848, 16384
combined decode_graph_replay alphamoe_fp8_block_scale_aligned_moe 512 2048 128 10 8 4, 8, 12, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, 448, 464, 480, 496, 512 4, 8, 12, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, 448, 464, 480, 496, 512 4–37, 39, 42–51, 54–60, 62–64, 66–68, 70–75, 77, 80–82, 84, 86–87, 89–91, 93–94, 96, 98–100, 102, 104–105, 108, 110, 114–116, 118, 121, 124, 126, 128–129, 132, 136, 139, 142–143, 146, 148–150, 153–154, 156–157, 159, 163, 165, 168, 170–171, 174, 176, 178, 184, 186–187, 189, 191–192, 196–197, 199–200, 202, 205, 207, 210, 214–215, 218, 222, 226, 228, 230–231, 233, 239, 242–243, 246–247, 250, 253, 257, 261, 263, 266–267, 270, 273–274, 277, 279, 283, 285, 287, 290, 294, 296, 298, 300, 304, 306–307, 309, 311, 316, 318, 321, 324, 328, 331, 336, 339–340, 344, 347, 349, 351–352, 355–356, 359, 365, 367, 369, 372, 375, 377, 379, 383, 386, 388, 392, 394, 397, 401, 403, 406, 411, 415, 422, 429, 436, 440–441, 443–444, 448, 454, 458, 463, 469, 473, 476, 480, 487, 491, 499, 502, 504, 507, 509
combined decode_graph_replay alphamoe_fused_router 512 2048 128 10 8 4, 8, 12, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, 448, 464, 480, 496, 512 4, 8, 12, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, 448, 464, 480, 496, 512 4–37, 39, 42–51, 54–60, 62–64, 66–68, 70–75, 77, 80–82, 84, 86–87, 89–91, 93–94, 96, 98–100, 102, 104–105, 108, 110, 114–116, 118, 121, 124, 126, 128–129, 132, 136, 139, 142–143, 146, 148–150, 153–154, 156–157, 159, 163, 165, 168, 170–171, 174, 176, 178, 184, 186–187, 189, 191–192, 196–197, 199–200, 202, 205, 207, 210, 214–215, 218, 222, 226, 228, 230–231, 233, 239, 242–243, 246–247, 250, 253, 257, 261, 263, 266–267, 270, 273–274, 277, 279, 283, 285, 287, 290, 294, 296, 298, 300, 304, 306–307, 309, 311, 316, 318, 321, 324, 328, 331, 336, 339–340, 344, 347, 349, 351–352, 355–356, 359, 365, 367, 369, 372, 375, 377, 379, 383, 386, 388, 392, 394, 397, 401, 403, 406, 411, 415, 422, 429, 436, 440–441, 443–444, 448, 454, 458, 463, 469, 473, 476, 480, 487, 491, 499, 502, 504, 507, 509
combined eager alphamoe_fp8_block_scale_aligned_moe 512 2048 128 10 8 518, 521, 526, 534, 540, 542, 546, 552, 561, 566, 574, 578, 585, 591, 594, 597, 603, 607, 613, 619, 625, 630, 636, 642, 650, 658–659, 662, 667, 673, 679, 683, 686, 689–690, 693, 696, 701, 706, 709, 712, 718, 723, 728, 732, 739, 746, 751, 756, 759–760, 762, 767, 769, 773, 782, 785, 789, 799, 806, 808, 810, 814, 817, 820, 826, 831, 834, 837, 840, 847, 853, 860, 864, 871, 874, 879, 883, 886, 890, 896, 899, 901–911 518, 521, 526, 534, 540, 542, 546, 552, 561, 566, 574, 578, 585, 591, 594, 597, 603, 607, 613, 619, 625, 630, 636, 642, 650, 658–659, 662, 667, 673, 679, 683, 686, 689–690, 693, 696, 701, 706, 709, 712, 718, 723, 728, 732, 739, 746, 751, 756, 759–760, 762, 767, 769, 773, 782, 785, 789, 799, 806, 808, 810, 814, 817, 820, 826, 831, 834, 837, 840, 847, 853, 860, 864, 871, 874, 879, 883, 886, 890, 896, 899, 901–911 518, 521, 526, 534, 540, 542, 546, 552, 561, 566, 574, 578, 585, 591, 594, 597, 603, 607, 613, 619, 625, 630, 636, 642, 650, 658–659, 662, 667, 673, 679, 683, 686, 689–690, 693, 696, 701, 706, 709, 712, 718, 723, 728, 732, 739, 746, 751, 756, 759–760, 762, 767, 769, 773, 782, 785, 789, 799, 806, 808, 810, 814, 817, 820, 826, 831, 834, 837, 840, 847, 853, 860, 864, 871, 874, 879, 883, 886, 890, 896, 899, 901–911
combined eager alphamoe_fused_router 512 2048 128 10 8 518, 521, 526, 534, 540, 542, 546, 552, 561, 566, 574, 578, 585, 591, 594, 597, 603, 607, 613, 619, 625, 630, 636, 642, 650, 658–659, 662, 667, 673, 679, 683, 686, 689–690, 693, 696, 701, 706, 709, 712, 718, 723, 728, 732, 739, 746, 751, 756, 759–760, 762, 767, 769, 773, 782, 785, 789, 799, 806, 808, 810, 814, 817, 820, 826, 831, 834, 837, 840, 847, 853, 860, 864, 871, 874, 879, 883, 886, 890, 896, 899, 901–911 518, 521, 526, 534, 540, 542, 546, 552, 561, 566, 574, 578, 585, 591, 594, 597, 603, 607, 613, 619, 625, 630, 636, 642, 650, 658–659, 662, 667, 673, 679, 683, 686, 689–690, 693, 696, 701, 706, 709, 712, 718, 723, 728, 732, 739, 746, 751, 756, 759–760, 762, 767, 769, 773, 782, 785, 789, 799, 806, 808, 810, 814, 817, 820, 826, 831, 834, 837, 840, 847, 853, 860, 864, 871, 874, 879, 883, 886, 890, 896, 899, 901–911 518, 521, 526, 534, 540, 542, 546, 552, 561, 566, 574, 578, 585, 591, 594, 597, 603, 607, 613, 619, 625, 630, 636, 642, 650, 658–659, 662, 667, 673, 679, 683, 686, 689–690, 693, 696, 701, 706, 709, 712, 718, 723, 728, 732, 739, 746, 751, 756, 759–760, 762, 767, 769, 773, 782, 785, 789, 799, 806, 808, 810, 814, 817, 820, 826, 831, 834, 837, 840, 847, 853, 860, 864, 871, 874, 879, 883, 886, 890, 896, 899, 901–911
combined prefill_graph_replay alphamoe_fp8_block_scale_aligned_moe 512 2048 128 10 8 80, 96, 112, 128, 144, 160, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 832, 896, 960, 1024, 1536, 15872, 16384 80, 96, 112, 128, 144, 160, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 832, 896, 960, 1024, 1536, 15872, 16384 67, 69–70, 86, 89, 95, 106, 115–116, 131, 152, 178, 184, 190, 194, 200, 202, 205–207, 211–212, 221, 227, 250, 255, 281, 288, 292, 296, 308, 317, 332, 338, 353, 361, 376, 378, 387, 394, 397, 399, 402, 411, 413, 429, 435, 447, 451–452, 461, 464, 471, 473, 476, 487–488, 494, 514, 536, 556, 574, 577, 583, 585, 619, 629, 641, 655, 666–667, 681, 695, 717, 719, 726, 749, 766, 772, 788, 822, 826, 844, 863, 911, 981, 1296, 15461, 16384
combined prefill_graph_replay alphamoe_fused_router 512 2048 128 10 8 80, 96, 112, 128, 144, 160, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 832, 896, 960, 1024, 1536, 15872, 16384 80, 96, 112, 128, 144, 160, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 832, 896, 960, 1024, 1536, 15872, 16384 67, 69–70, 86, 89, 95, 106, 115–116, 131, 152, 178, 184, 190, 194, 200, 202, 205–207, 211–212, 221, 227, 250, 255, 281, 288, 292, 296, 308, 317, 332, 338, 353, 361, 376, 378, 387, 394, 397, 399, 402, 411, 413, 429, 435, 447, 451–452, 461, 464, 471, 473, 476, 487–488, 494, 514, 536, 556, 574, 577, 583, 585, 619, 629, 641, 655, 666–667, 681, 695, 717, 719, 726, 749, 766, 772, 788, 822, 826, 844, 863, 911, 981, 1296, 15461, 16384

GPU execution witness: PASS. After unprofiled measurements, one stored real GSM8K prompt was replayed with a 32-token limit under SGLang's GPU/CUPTI profiler. This request is excluded from accuracy and performance. Required actual CUDA kernel symbols in all four TP traces: kernel_alpha_moe_fused_router, kernel_alpha_moe_w8a8_up_down.

Resumed execution and physical turnaround

The Qwen campaign spans workload submissions: an earlier submission reached its time limit, and the combined router/W8A8 variant resumed with a restarted server. Completed GSM8K outputs and sealed serving measurements were retained; the resume executed the unfinished serving repetitions and GPU profiling. The audit revalidated the retained evidence against the same model, source, runtime and evaluation contract.

There are five workload repetitions per concurrency and variant, paired by repeat ID and seed. These are not five independent server processes or restarts. The contributing attempts below show exactly where the recorded phases ran; restarting a server does not add a repetition.

Qwen variant Contributing server attempt GSM8K phase Serving repetitions GPU profiling phase
baseline 1 recorded 15 not recorded in this attempt
router_only 1 recorded 15 recorded
combined 1 recorded 8 not recorded in this attempt
combined 2 retained from earlier attempt 7 recorded

Physical timing covers the entire three-variant Qwen campaign, including startup, interrupted work and cleanup. It is shared across the Qwen comparison tables, not a separate cost for each pair.

  • Total physical execution across 2 submissions: 8550.42 s.
  • Physical turnaround from first submission start to final submission completion, including intervening gaps: 8774.24 s.
  • Latest harness invocation alone: 1294.00 s; this is not the campaign total.

GSM8K API runtime and the per-repeat serving request latencies above are the measured workload results. They are reported separately from physical turnaround; interrupted, unsealed measurements are excluded from the performance table.

Qwen combined router and W8A8 versus stock MoE (graph)

Model: Qwen/Qwen3-Next-80B-A3B-Instruct-FP8 at c5f5f263bdd5cc134092897864e8905d8fe7b928. SGLang: 5407ec1a7dfee227a408702addcc15007ec7f126; FlashInfer: c6407025a445d0d6c3bcfd28a7326456b17e4387.

Comparison: stock MoE backend → AlphaMoE router + W8A8 MoE. TP4 / EP1 / DP1, execution mode graph, speculative decoding disabled, shared-expert fusion disabled on both sides.

FP8 checkpoint with the fixed 0.95 acceptance threshold. The retained five-shot scorer preserves the historical evaluation protocol; current SGLang default registrations use sgl-eval instead.

Resolved server setting Baseline Candidate
moe_runner_backend triton flashinfer_alphamoe
attention_backend triton triton
prefill_attention_backend None None
decode_attention_backend None None
kv_cache_dtype auto auto
chunked_prefill_size 16384 16384
mem_fraction_static 0.7 0.7
cuda_graph_config {'decode': {'backend': 'full', 'bs': [1, 2, 4, 8, 12, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, 448, 464, 480, 496, 512], 'full_prefill_max_req': None, 'full_prefill_prefix_chunk_tokens': None, 'max_bs': 512, 'tc_compiler': 'eager'}, 'prefill': {'backend': 'breakable', 'bs': [4, 8, 12, 16, 20, 24, 28, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 832, 896, 960, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4608, 5120, 5632, 6144, 6656, 7168, 7680, 8192, 8704, 9216, 9728, 10240, 10752, 11264, 11776, 12288, 12800, 13312, 13824, 14336, 14848, 15360, 15872, 16384], 'full_prefill_max_req': None, 'full_prefill_prefix_chunk_tokens': None, 'max_bs': 16384, 'tc_compiler': 'eager'}} {'decode': {'backend': 'full', 'bs': [1, 2, 4, 8, 12, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, 448, 464, 480, 496, 512], 'full_prefill_max_req': None, 'full_prefill_prefix_chunk_tokens': None, 'max_bs': 512, 'tc_compiler': 'eager'}, 'prefill': {'backend': 'breakable', 'bs': [4, 8, 12, 16, 20, 24, 28, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 832, 896, 960, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4608, 5120, 5632, 6144, 6656, 7168, 7680, 8192, 8704, 9216, 9728, 10240, 10752, 11264, 11776, 12288, 12800, 13312, 13824, 14336, 14848, 15360, 15872, 16384], 'full_prefill_max_req': None, 'full_prefill_prefix_chunk_tokens': None, 'max_bs': 16384, 'tc_compiler': 'eager'}}

This comparison changes both routing and MoE computation; its accuracy or speedup cannot be attributed to W8A8 alone.

GSM8K uses the repository's retained five-shot chat scorer (sglang.test.simple_eval_mixed_prefix_gsm8k.GSM8KEval), all 1,314 held-out examples (the first five of the 1,319-example split supply the examples), temperature 0, top-p 1, and a 2,048-token generation limit. Both variants receive the same prompts and references.

Metric Baseline Candidate Change
Correct / evaluated 1261 / 1314 1260 / 1314 -1 questions
Accuracy 0.959665 0.958904 -0.0761 percentage points
Invalid answer parses 0 0
GSM8K API runtime (s) 110.65 49.01

Accuracy gate: PASS. Both accuracies must be at least 0.95, and candidate minus baseline must be ≥ −0.005. The candidate gained 7 questions and lost 8; a passing accuracy gate does not assert bitwise equality or zero accuracy loss.

End-to-end kernel verification: PASS. This additionally requires complete server/request evidence and actual GPU kernel traces for each AlphaMoE variant in this comparison.

Performance

Five fixed-workload repetitions run per server variant and are paired by repeat ID and seed. They are not five independent server launches. All repeats are included. Throughput speedup is candidate output tokens/s divided by baseline output tokens/s; values below 1 are regressions. TTFT, TPOT and request E2E columns are per-repeat medians in milliseconds; lower is better.

Workload: 1024 input / 512 output tokens, 1,024 requests per repeat.

Concurrency Repeat Baseline output tok/s Candidate output tok/s Speedup TTFT B → C (ms) TPOT B → C (ms) E2E B → C (ms)
32 1 3931.74 4145.22 1.0543× 258.66 → 418.72 7.68 → 6.66 4181.76 → 3963.22
32 2 3903.13 4118.20 1.0551× 245.61 → 408.89 7.72 → 6.75 4197.90 → 3975.70
32 3 3896.20 4115.10 1.0562× 234.99 → 418.02 7.74 → 6.72 4218.70 → 3993.60
32 4 3920.03 4139.69 1.0560× 250.85 → 425.59 7.66 → 6.68 4181.58 → 3965.68
32 5 3903.24 4123.11 1.0563× 256.73 → 406.05 7.70 → 6.73 4178.47 → 3975.12
64 1 6066.99 6453.25 1.0637× 439.97 → 781.30 9.77 → 8.49 5411.06 → 5063.53
64 2 6067.16 6449.45 1.0630× 399.88 → 769.43 9.78 → 8.42 5381.46 → 5065.06
64 3 6046.65 6426.75 1.0629× 355.60 → 697.30 9.83 → 8.46 5416.43 → 5078.82
64 4 6101.55 6443.33 1.0560× 350.43 → 840.72 9.75 → 8.33 5342.81 → 5072.09
64 5 6057.65 6415.55 1.0591× 350.76 → 942.88 9.82 → 8.49 5380.58 → 5067.80
128 1 9436.00 8920.52 0.9454× 652.36 → 1392.23 12.31 → 11.53 6912.17 → 7328.25
128 2 9495.66 8914.45 0.9388× 594.71 → 1477.78 12.29 → 11.51 6879.95 → 7330.97
128 3 9392.04 8851.62 0.9425× 639.30 → 1482.56 12.40 → 11.77 6945.49 → 7343.11
128 4 9517.56 8897.23 0.9348× 643.29 → 1458.07 12.23 → 11.75 6852.26 → 7283.14
128 5 9413.79 8835.57 0.9386× 647.43 → 1474.67 12.36 → 11.83 6902.31 → 7322.19
Concurrency Mean baseline output tok/s Mean candidate output tok/s Median paired speedup Candidate wins
32 3910.87 4128.26 1.0560× 5 / 5
64 6068.00 6437.67 1.0629× 5 / 5
128 9451.01 8883.88 0.9388× 0 / 5

Performance gate: FAIL. Every concurrency must have median paired speedup ≥ 1, and at least one must win all five paired repetitions.

Memory and execution evidence

Memory values below are resident-device snapshots after health/model/graph startup or after the named phase. They include model, KV cache and allocator reservations; they are not peak measurements or isolated CUDA Graph allocations.

Snapshot Baseline per-device MiB Candidate per-device MiB
after health 207126, 207192, 207192, 206872 264772, 264842, 264842, 264522
after accuracy 214248, 214312, 214312, 213992 264772, 264842, 264842, 264522
after performance 207814, 207880, 207880, 207560 265444, 265554, 265554, 265234

Post-health GSM8K dispatch/capture receipts observed execution modes: decode_graph_replay, eager, prefill_graph_replay. Startup capture and fixed-workload performance requests are excluded from this coverage.

Observed AlphaMoE runtime shapes below come from those request receipts. Kernel M is the submitted kernel geometry, or the registered capture geometry when a real request replayed that graph. Dispatch M includes graph padding; real tokens are the actual request tokens before that padding. Each column lists its observed values separately, not a Cartesian product of supported shapes. An inclusive range contains only consecutive values that were all observed; missing values are not inferred. The stock baseline has no AlphaMoE kernel shape records.

Variant Execution Kernel E H I local Routed top-k Block M Observed kernel M Observed dispatch M Observed real tokens
combined decode_graph_replay alphamoe_fp8_block_scale_aligned_moe 512 2048 128 10 8 4, 8, 12, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, 448, 464, 480, 496, 512 4, 8, 12, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, 448, 464, 480, 496, 512 4–37, 39, 42–51, 54–60, 62–64, 66–68, 70–75, 77, 80–82, 84, 86–87, 89–91, 93–94, 96, 98–100, 102, 104–105, 108, 110, 114–116, 118, 121, 124, 126, 128–129, 132, 136, 139, 142–143, 146, 148–150, 153–154, 156–157, 159, 163, 165, 168, 170–171, 174, 176, 178, 184, 186–187, 189, 191–192, 196–197, 199–200, 202, 205, 207, 210, 214–215, 218, 222, 226, 228, 230–231, 233, 239, 242–243, 246–247, 250, 253, 257, 261, 263, 266–267, 270, 273–274, 277, 279, 283, 285, 287, 290, 294, 296, 298, 300, 304, 306–307, 309, 311, 316, 318, 321, 324, 328, 331, 336, 339–340, 344, 347, 349, 351–352, 355–356, 359, 365, 367, 369, 372, 375, 377, 379, 383, 386, 388, 392, 394, 397, 401, 403, 406, 411, 415, 422, 429, 436, 440–441, 443–444, 448, 454, 458, 463, 469, 473, 476, 480, 487, 491, 499, 502, 504, 507, 509
combined decode_graph_replay alphamoe_fused_router 512 2048 128 10 8 4, 8, 12, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, 448, 464, 480, 496, 512 4, 8, 12, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, 448, 464, 480, 496, 512 4–37, 39, 42–51, 54–60, 62–64, 66–68, 70–75, 77, 80–82, 84, 86–87, 89–91, 93–94, 96, 98–100, 102, 104–105, 108, 110, 114–116, 118, 121, 124, 126, 128–129, 132, 136, 139, 142–143, 146, 148–150, 153–154, 156–157, 159, 163, 165, 168, 170–171, 174, 176, 178, 184, 186–187, 189, 191–192, 196–197, 199–200, 202, 205, 207, 210, 214–215, 218, 222, 226, 228, 230–231, 233, 239, 242–243, 246–247, 250, 253, 257, 261, 263, 266–267, 270, 273–274, 277, 279, 283, 285, 287, 290, 294, 296, 298, 300, 304, 306–307, 309, 311, 316, 318, 321, 324, 328, 331, 336, 339–340, 344, 347, 349, 351–352, 355–356, 359, 365, 367, 369, 372, 375, 377, 379, 383, 386, 388, 392, 394, 397, 401, 403, 406, 411, 415, 422, 429, 436, 440–441, 443–444, 448, 454, 458, 463, 469, 473, 476, 480, 487, 491, 499, 502, 504, 507, 509
combined eager alphamoe_fp8_block_scale_aligned_moe 512 2048 128 10 8 518, 521, 526, 534, 540, 542, 546, 552, 561, 566, 574, 578, 585, 591, 594, 597, 603, 607, 613, 619, 625, 630, 636, 642, 650, 658–659, 662, 667, 673, 679, 683, 686, 689–690, 693, 696, 701, 706, 709, 712, 718, 723, 728, 732, 739, 746, 751, 756, 759–760, 762, 767, 769, 773, 782, 785, 789, 799, 806, 808, 810, 814, 817, 820, 826, 831, 834, 837, 840, 847, 853, 860, 864, 871, 874, 879, 883, 886, 890, 896, 899, 901–911 518, 521, 526, 534, 540, 542, 546, 552, 561, 566, 574, 578, 585, 591, 594, 597, 603, 607, 613, 619, 625, 630, 636, 642, 650, 658–659, 662, 667, 673, 679, 683, 686, 689–690, 693, 696, 701, 706, 709, 712, 718, 723, 728, 732, 739, 746, 751, 756, 759–760, 762, 767, 769, 773, 782, 785, 789, 799, 806, 808, 810, 814, 817, 820, 826, 831, 834, 837, 840, 847, 853, 860, 864, 871, 874, 879, 883, 886, 890, 896, 899, 901–911 518, 521, 526, 534, 540, 542, 546, 552, 561, 566, 574, 578, 585, 591, 594, 597, 603, 607, 613, 619, 625, 630, 636, 642, 650, 658–659, 662, 667, 673, 679, 683, 686, 689–690, 693, 696, 701, 706, 709, 712, 718, 723, 728, 732, 739, 746, 751, 756, 759–760, 762, 767, 769, 773, 782, 785, 789, 799, 806, 808, 810, 814, 817, 820, 826, 831, 834, 837, 840, 847, 853, 860, 864, 871, 874, 879, 883, 886, 890, 896, 899, 901–911
combined eager alphamoe_fused_router 512 2048 128 10 8 518, 521, 526, 534, 540, 542, 546, 552, 561, 566, 574, 578, 585, 591, 594, 597, 603, 607, 613, 619, 625, 630, 636, 642, 650, 658–659, 662, 667, 673, 679, 683, 686, 689–690, 693, 696, 701, 706, 709, 712, 718, 723, 728, 732, 739, 746, 751, 756, 759–760, 762, 767, 769, 773, 782, 785, 789, 799, 806, 808, 810, 814, 817, 820, 826, 831, 834, 837, 840, 847, 853, 860, 864, 871, 874, 879, 883, 886, 890, 896, 899, 901–911 518, 521, 526, 534, 540, 542, 546, 552, 561, 566, 574, 578, 585, 591, 594, 597, 603, 607, 613, 619, 625, 630, 636, 642, 650, 658–659, 662, 667, 673, 679, 683, 686, 689–690, 693, 696, 701, 706, 709, 712, 718, 723, 728, 732, 739, 746, 751, 756, 759–760, 762, 767, 769, 773, 782, 785, 789, 799, 806, 808, 810, 814, 817, 820, 826, 831, 834, 837, 840, 847, 853, 860, 864, 871, 874, 879, 883, 886, 890, 896, 899, 901–911 518, 521, 526, 534, 540, 542, 546, 552, 561, 566, 574, 578, 585, 591, 594, 597, 603, 607, 613, 619, 625, 630, 636, 642, 650, 658–659, 662, 667, 673, 679, 683, 686, 689–690, 693, 696, 701, 706, 709, 712, 718, 723, 728, 732, 739, 746, 751, 756, 759–760, 762, 767, 769, 773, 782, 785, 789, 799, 806, 808, 810, 814, 817, 820, 826, 831, 834, 837, 840, 847, 853, 860, 864, 871, 874, 879, 883, 886, 890, 896, 899, 901–911
combined prefill_graph_replay alphamoe_fp8_block_scale_aligned_moe 512 2048 128 10 8 80, 96, 112, 128, 144, 160, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 832, 896, 960, 1024, 1536, 15872, 16384 80, 96, 112, 128, 144, 160, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 832, 896, 960, 1024, 1536, 15872, 16384 67, 69–70, 86, 89, 95, 106, 115–116, 131, 152, 178, 184, 190, 194, 200, 202, 205–207, 211–212, 221, 227, 250, 255, 281, 288, 292, 296, 308, 317, 332, 338, 353, 361, 376, 378, 387, 394, 397, 399, 402, 411, 413, 429, 435, 447, 451–452, 461, 464, 471, 473, 476, 487–488, 494, 514, 536, 556, 574, 577, 583, 585, 619, 629, 641, 655, 666–667, 681, 695, 717, 719, 726, 749, 766, 772, 788, 822, 826, 844, 863, 911, 981, 1296, 15461, 16384
combined prefill_graph_replay alphamoe_fused_router 512 2048 128 10 8 80, 96, 112, 128, 144, 160, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 832, 896, 960, 1024, 1536, 15872, 16384 80, 96, 112, 128, 144, 160, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 832, 896, 960, 1024, 1536, 15872, 16384 67, 69–70, 86, 89, 95, 106, 115–116, 131, 152, 178, 184, 190, 194, 200, 202, 205–207, 211–212, 221, 227, 250, 255, 281, 288, 292, 296, 308, 317, 332, 338, 353, 361, 376, 378, 387, 394, 397, 399, 402, 411, 413, 429, 435, 447, 451–452, 461, 464, 471, 473, 476, 487–488, 494, 514, 536, 556, 574, 577, 583, 585, 619, 629, 641, 655, 666–667, 681, 695, 717, 719, 726, 749, 766, 772, 788, 822, 826, 844, 863, 911, 981, 1296, 15461, 16384

GPU execution witness: PASS. After unprofiled measurements, one stored real GSM8K prompt was replayed with a 32-token limit under SGLang's GPU/CUPTI profiler. This request is excluded from accuracy and performance. Required actual CUDA kernel symbols in all four TP traces: kernel_alpha_moe_fused_router, kernel_alpha_moe_w8a8_up_down.

Resumed execution and physical turnaround

The Qwen campaign spans workload submissions: an earlier submission reached its time limit, and the combined router/W8A8 variant resumed with a restarted server. Completed GSM8K outputs and sealed serving measurements were retained; the resume executed the unfinished serving repetitions and GPU profiling. The audit revalidated the retained evidence against the same model, source, runtime and evaluation contract.

There are five workload repetitions per concurrency and variant, paired by repeat ID and seed. These are not five independent server processes or restarts. The contributing attempts below show exactly where the recorded phases ran; restarting a server does not add a repetition.

Qwen variant Contributing server attempt GSM8K phase Serving repetitions GPU profiling phase
baseline 1 recorded 15 not recorded in this attempt
router_only 1 recorded 15 recorded
combined 1 recorded 8 not recorded in this attempt
combined 2 retained from earlier attempt 7 recorded

Physical timing covers the entire three-variant Qwen campaign, including startup, interrupted work and cleanup. It is shared across the Qwen comparison tables, not a separate cost for each pair.

  • Total physical execution across 2 submissions: 8550.42 s.
  • Physical turnaround from first submission start to final submission completion, including intervening gaps: 8774.24 s.
  • Latest harness invocation alone: 1294.00 s; this is not the campaign total.

GSM8K API runtime and the per-repeat serving request latencies above are the measured workload results. They are reported separately from physical turnaround; interrupted, unsealed measurements are excluded from the performance table.

Historical E2E correctness and performance

The following tables are restored reports from 2026-08-08, not results reproduced during this delivery. The source revisions and environments differ from the current candidate. Full raw per-request/per-repeat artifacts have not been revalidated in this session; rounded values are preserved as reported. These historical tables do not validate the evaluated revisions reported above.

Historical model: Qwen/Qwen3-Next-80B-A3B-Instruct-FP8 at c5f5f263bdd5cc134092897864e8905d8fe7b928, SGLang v0.5.16, 4×GB300, TP4/EP1, Triton baseline versus combined #4339 router + #4287 W8A8. This does not isolate either kernel.

GSM8K, same 200 questions, 5-shot Baseline Combined candidate Difference
Correct answers 191/200 190/200 −1 answer
Accuracy 0.955 0.950 −0.005 (−0.5 percentage points)

The candidate reached the old accuracy >= 0.95 and delta >= -0.005 gates exactly. This is an observed drop and a boundary pass, not proof of identical outputs or no accuracy loss.

Serving: 1,024 requests per workload, 1,024 input / 512 output tokens, three workload repeats per concurrency. Throughput columns are reported means; speedup is the reported mean of paired repeat ratios, which need not equal a ratio of rounded means.

Concurrency Baseline output tok/s Combined output tok/s Paired speedup Baseline p50 E2E ms Combined p50 E2E ms
32 4460.95 4691.90 1.0518× 3663.9 3477.0
64 6862.00 6940.33 1.0114× 4744.4 4702.1
128 10610.78 9771.34 0.9209× 6150.9 6696.9

TTFT was reported worse at all three concurrencies; exact TTFT/TPOT rows were not restored. Prefill CUDA Graph allocation was reported as 2.76 → 58.04 GB/GPU. This is a historical graph-allocation report, not a newly measured process-memory peak. Individual baseline/candidate repeat values were not restored, so a full repeat table cannot be reconstructed. These are three repeats within one server deployment per backend, not three independently restarted deployments.

The fixed geometry was E512/H2048/I_local128/routed_top_k10/BM8, with shared experts separate. Dynamic M was not traced; the workload does not establish any particular M bucket.

Historical API timing, separate from model E2E

Both sides were reported to pass the then-used fixed FP8 comparison threshold before CUPTI cold-L2 timing. These fixture dimensions were not observed production M values and are not model-correctness evidence.

Fixture M at E512/H2048/I_local128/top10 SGLang Triton API ms AlphaMoE API ms Reported speedup
8 0.379890 0.041232 9.21×
128 0.418528 0.123377 3.39×

The boundaries differ: AlphaMoE receives prequantized activations and a prealigned route plan; the stock SGLang API includes dynamic quantization, routing/alignment and additional launches. These ratios are not equal-boundary GEMM speedups and do not predict service speed.

🔍 Related Issues

Companion router #4339, NVFP4 compute #4340, and SGLang integration #34072.

🚀 Pull Request Checklist

Thank you for contributing to FlashInfer! Before we review your pull request, please make sure the following items are complete.

✅ Pre-commit Checks

  • I have installed pre-commit by running pip install pre-commit (or used your preferred method).
  • I have installed the hooks with pre-commit install.
  • I have run the hooks manually with pre-commit run --all-files and fixed any reported issues.

If you are unsure about how to set up pre-commit, see the pre-commit documentation.

🧪 Tests

  • Tests have been added or updated as needed.
  • All tests are passing (unittest, etc.).

New verification on 2026-09-12: the repository pre-commit suite passed on the PR changes before the latest main-only merge, including applicable formatting, Ruff and mypy checks. Checks were executed in the compute environment. The subsequent merge of main aeab8e9 changes unrelated attention files; the reviewed AlphaMoE files remain identical. Full-tree hooks, GPU compilation and runtime/model checks are not claimed by that result. Recorded SGLang model results and their gate outcomes appear above; merge acceptance still requires the stated criteria. Existing kernel tests and trace/ABI checks are engineering coverage; they do not establish model accuracy.

🔬 Experimental Track

  • This PR is experimental: it adds or changes code under flashinfer/experimental/ and/or an @flashinfer_experimental_api. Tracking issue: #
    • The tracking issue names an owner, the reason for the experimental path, and a graduation plan with a target release.
    • Core changes are limited to a thin entry point (signature, shared validation, feature-gate check, backend selection, handoff).
    • Tests live in tests/experimental/ and were validated on the intended hardware; a runnable example is included.
    • Nothing is registered in flashinfer/aot.py, and no experimental backend is reachable from backend="auto" without FLASHINFER_ALLOW_EXPERIMENTAL_AUTO_BACKENDS=1. (Calling an @flashinfer_experimental_api or naming a backend explicitly is itself the opt-in and needs no environment variable.)
    • Test scope declared below. The experimental CI lane runs exactly these targets, so keep them as narrow as the change allows.
# One target per line: a directory or a file. (A pytest ::selector is not
# supported -- the sharding runner cannot consume one.) Must be under
# tests/experimental/ and must exist. Delete these comment lines and add yours, e.g.
#
#   tests/experimental/test_my_backend.py
#   tests/experimental/my_backend/
#
# Declaring the whole tree (tests/experimental/) is allowed but means every
# experimental PR pays for every other feature's tests, in every matrix cell.

Reviewer Notes

Please review the zero-activation scale branch, device/capacity checks, weight layout, and API/trace/AOT integration. Review readiness permits code review; it does not assert fresh model accuracy or merge readiness. Assess the recorded evaluation revisions and gate outcomes above against the merge criteria.

Full-scope mypy validation on 2026-09-12 passed after explicitly typing the shared trace dictionaries. The touched-file hook suite also passed. This resolves the earlier CI mypy failure without changing device code or numerical tolerances. PR Test run #34722609670, attempt 2 now succeeds on f12b7d47f14c94fae8d3d44cc01e16c6eddd26f8, with all 10 jobs successful. Earlier authorization-skipped runs and attempt 1's runner-shutdown AOT failures remain historical. These CI checks supplement the real-model validation reported above.

…_sm100)

Add a frozen device TU generated from a Loom schedule fusing the full FP8
W8A8 block-scale MoE expert computation — routed gate/up projection, SwiGLU
with per-token FP8 requantization, down projection, and asynchronous BF16
reduce-add into a caller-owned output accumulator — into one kernel over
the standard vLLM/SGLang moe_align_block_size routing plan. New public API
flashinfer.fused_moe.alphamoe_fp8_block_scale_aligned_moe plus the offline
gate/up weight interleaving helper.

- csrc/alphamoe_sm100/: generated device TU (verbatim, clang-format off)
  + a binding TU (typedef isolation) doing validation, the three TMA
  descriptor encodes, and the launch, mirroring the internal host launcher
  field for field
- one kernel identity across runtime M/K/N/E/top_k/block_m; N=256/512/1024
  tile through grid.y; blocks past the device-side num_tokens_post_padded
  extent exit untouched, so worst-case plan buffers are fine
- out is a caller-owned BF16 accumulator (cp.reduce.async.bulk add); the
  wrapper zero-allocates it when omitted
- tests: parity vs an independent torch oracle (torch.equal) on six
  internal-contract rows including M=1 decode, DeepSeek E257/top9 and Qwen
  E512/top10 coordinates, hot-expert imbalance, and N=1024; plan-extent
  guard with garbage-filled worst-case buffers; accumulation semantics
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change StackReview Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 316b1bda-dd72-4d7f-a090-24a6b0ccbff8

📥 Commits

Reviewing files that changed from the base of the PR and between b064f79 and f12b7d4.

📒 Files selected for processing (1)
  • flashinfer/trace/templates/alphamoe.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • flashinfer/trace/templates/alphamoe.py

Included review availability: Your plan provides up to 8 included reviews per hour; 4 remain after this review.


📝 Walkthrough

Walkthrough

Added an SM100/SM103 fused W8A8 block-scale MoE kernel with TMA loading, SwiGLU, FP8 requantization, and BF16 reduction. Added Python, JIT, AOT, and trace integrations with correctness and contract tests.

Changes

AlphaMoE SM100 integration

Layer / File(s) Summary
Fused device kernel
csrc/alphamoe_sm100.cu
Adds SM100 device primitives and the fused gate/up, SwiGLU, FP8 requantization, down projection, and BF16 reduction pipeline.
Validation and kernel launch
csrc/alphamoe_sm100.cu
Adds tensor validation, TMA descriptor encoding, launch configuration, the Run entry point, and the fp8_block_scale_aligned_moe_op export.
Python, JIT, and AOT API
flashinfer/fused_moe/alphamoe_sm100.py, flashinfer/fused_moe/__init__.py, flashinfer/jit/fused_moe.py, flashinfer/jit/__init__.py, flashinfer/aot.py
Adds gated-weight interleaving, cached custom-operation loading, the public wrapper, package exports, and SM100/SM103 module generation.
Trace templates and validation
flashinfer/trace/templates/alphamoe.py, tests/trace/template_registry.py, tests/moe/test_alphamoe_sm100.py
Adds trace metadata, registry discovery, an independent Torch reference, parameterized parity tests, and output, plan-extent, stride, and alignment checks.

Priority: ➖ Normal

Estimated code review effort: 5 (Critical) | ~120 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant Caller
  participant PythonAPI as alphamoe_fp8_block_scale_aligned_moe
  participant Run as alphamoe_sm100::Run
  participant Kernel as kernel_alpha_moe_w8a8_up_down
  participant Output as BF16 output tensor
  Caller->>PythonAPI: Provide tensors and routing parameters
  PythonAPI->>Run: Invoke registered fused operation
  Run->>Run: Validate tensors and encode TMA descriptors
  Run->>Kernel: Launch configured SM100/SM103 kernel
  Kernel->>Output: Reduce routed results into output
  Kernel-->>PythonAPI: Complete CUDA operation
  PythonAPI-->>Caller: Return output tensor
Loading

Merge Risk: 🟡 Moderate · up to f12b7

Large output accumulators can overflow the reduction offset and write outside the output tensor. Resolve this bounds check before merging.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 36.07% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 61 functions across 9 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The description links the related router, NVFP4 compute, and SGLang integration pull requests.
Out of Scope Changes check ✅ Passed The changes support the stated AlphaMoE W8A8 objectives, including the kernel, APIs, tests, tracing, JIT, AOT registration, and validation integration.
Title check ✅ Passed The title clearly identifies the main change: optimized Blackwell W8A8 expert up/down computation. It is concise and related to the added SM100/SM103 AlphaMoE fused MoE implementation.
Description check ✅ Passed The description is comprehensive and covers the implementation, related issues, tests, validation results, limitations, and reviewer focus areas. The pre-commit and test checklist still contains unche…
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🧹 Nitpick comments (3)
tests/moe/test_alphamoe_sm100.py (1)

418-425: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Guard the exactness assumption of the truncated-extent check.

The torch.equal assertion holds only while CONTRACT_CASES[1] keeps n == 256 and one expert per block. If a maintainer changes that row, the assertion becomes order-sensitive and flaky, and the failure will not point at the case list. Add an explicit precondition so the test fails with a clear reason instead.

🧪 Proposed guard
     truncated = torch.tensor([block_m], dtype=torch.int32, device="cuda")
+    # Exactness below requires a single 128-wide intermediate block.
+    assert n == 256, "this exact-equality check assumes N=256 (one intermediate block)"
     out = _launch(case, num_tokens_post_padded=truncated)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/moe/test_alphamoe_sm100.py` around lines 418 - 425, Add an explicit
precondition immediately before the truncated-extent assertion in the test,
validating that CONTRACT_CASES[1] still has n == 256 and one expert per block.
Use a clear failure message identifying the exactness assumption, then retain
the existing torch.equal check unchanged.
flashinfer/fused_moe/alphamoe_sm100.py (1)

69-104: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add register_fake_op support for this custom op before relying on it in torch.compile paths.

fp8_block_scale_aligned_moe is registered as a custom op, but register_fake_op currently only returns lambda x: x in flashinfer/utils.py, so this alias does not register a meta implementation. Register and import a matching fake op, then wire it through the same conditional path as the real op.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@flashinfer/fused_moe/alphamoe_sm100.py` around lines 69 - 104, Add a matching
fake/meta implementation for fp8_block_scale_aligned_moe and register it through
the existing register_fake_op mechanism in flashinfer.utils, updating the
lambda-based handling as needed. Import the fake registration and wire it
alongside the existing `@register_custom_op` declaration so torch.compile can
resolve this alias through the same conditional path as the real operation.
flashinfer/jit/fused_moe.py (1)

339-345: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Avoid unconditionally adding SM103a to the AlphaMoE spec.

gen_alphamoe_sm100_module appends a hardcoded SM103a gencode target to sm100a_nvcc_flags, so this module always builds both SM100a and SM103a and cannot be limited by supported_major_versions=[10] or an SM100-only FLASHINFER_CUDA_ARCH_LIST. Use current_compilation_context.get_nvcc_flags_list(...) here as the sibling generators do; add the SM103a target only under a condition that matches the requested compilation context.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@flashinfer/jit/fused_moe.py` around lines 339 - 345, Update
gen_alphamoe_sm100_module to obtain NVCC flags through
current_compilation_context.get_nvcc_flags_list, matching the sibling
generators, instead of unconditionally appending the SM103a gencode target to
sm100a_nvcc_flags. Include the SM103a target only when the requested compilation
context supports it, so supported_major_versions=[10] and SM100-only
architecture settings build only SM100a.

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@csrc/alphamoe_sm100.cu`:
- Around line 773-784: Guard the per-token activation scale against zero in the
generator’s assignment to smem_act_scale, clamping the decoded scale to a
positive FLT_MIN floor before inversion. Mirror the same floor in the Torch
oracle in test_alphamoe_sm100.py so generated-kernel and reference behavior
match, while preserving the generated kernel body.
- Around line 1212-1215: Update CheckInputs to validate that
sorted_token_ids.numel() is at least expert_ids.numel() multiplied by block_m,
matching the x-grid launched by the kernel and its eight-ID CTA reads. Add this
host-side bound check alongside the existing expert_ids validation, before
launching the kernel.
- Around line 1298-1308: Update Run to create an ffi::CUDADeviceGuard for
hidden_states.device().device_id before CheckInputs and all CUDA setup or launch
operations, including cudaFuncSetAttribute and LaunchKernel, so execution
targets the tensor’s device.

In `@flashinfer/fused_moe/__init__.py`:
- Around line 86-89: Add alphamoe_fp8_block_scale_aligned_moe and
alphamoe_interleave_gated_weights to the __all__ declaration in
flashinfer.fused_moe, alongside the other public MoE APIs, so wildcard imports
and public API tooling expose both imported functions.

In `@flashinfer/fused_moe/alphamoe_sm100.py`:
- Around line 190-194: Update the Notes docstring in the relevant AlphaMoE SM100
definition to reference the actual translation unit csrc/alphamoe_sm100.cu
instead of the nonexistent csrc/alphamoe_sm100/ directory, leaving the device
requirement and other documentation unchanged.
- Around line 109-125: Add the package-standard API metadata to
alphamoe_fp8_block_scale_aligned_moe, including
supported_compute_capability([100, 103]), and add flashinfer_api(trace=...) to
alphamoe_interleave_gated_weights using the benchmark trace definition. Update
gen_alphamoe_sm100_module and its AOT registration so both exported entry points
are covered when FLASHINFER_DISABLE_JIT is enabled, with unsupported compute
capabilities rejected through the decorator.

In `@tests/moe/test_alphamoe_sm100.py`:
- Around line 405-407: Rename the unused label unpack target to _label in both
CONTRACT_CASES unpacking sites: tests/moe/test_alphamoe_sm100.py lines 405-407
for CONTRACT_CASES[1] and lines 431-433 for CONTRACT_CASES[0]. Leave the other
unpacked values unchanged.
- Around line 252-254: Move the `w1` and `w2` dequantization out of the pre-loop
setup and into the existing per-expert loop after the empty `pair_indices`
check. Dequantize only `case["w1"][expert]` and `case["w2"][expert]` with that
expert’s scale slice, then use these tensors for the expert’s matrix operations,
removing the full all-expert float32 materializations.

---

Nitpick comments:
In `@flashinfer/fused_moe/alphamoe_sm100.py`:
- Around line 69-104: Add a matching fake/meta implementation for
fp8_block_scale_aligned_moe and register it through the existing
register_fake_op mechanism in flashinfer.utils, updating the lambda-based
handling as needed. Import the fake registration and wire it alongside the
existing `@register_custom_op` declaration so torch.compile can resolve this alias
through the same conditional path as the real operation.

In `@flashinfer/jit/fused_moe.py`:
- Around line 339-345: Update gen_alphamoe_sm100_module to obtain NVCC flags
through current_compilation_context.get_nvcc_flags_list, matching the sibling
generators, instead of unconditionally appending the SM103a gencode target to
sm100a_nvcc_flags. Include the SM103a target only when the requested compilation
context supports it, so supported_major_versions=[10] and SM100-only
architecture settings build only SM100a.

In `@tests/moe/test_alphamoe_sm100.py`:
- Around line 418-425: Add an explicit precondition immediately before the
truncated-extent assertion in the test, validating that CONTRACT_CASES[1] still
has n == 256 and one expert per block. Use a clear failure message identifying
the exactness assumption, then retain the existing torch.equal check unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 4480f683-afad-4774-9365-ad0ac8be6941

📥 Commits

Reviewing files that changed from the base of the PR and between cba9994 and 967cc6e.

📒 Files selected for processing (6)
  • csrc/alphamoe_sm100.cu
  • flashinfer/fused_moe/__init__.py
  • flashinfer/fused_moe/alphamoe_sm100.py
  • flashinfer/jit/__init__.py
  • flashinfer/jit/fused_moe.py
  • tests/moe/test_alphamoe_sm100.py

Comment thread csrc/alphamoe_sm100.cu Outdated
Comment thread csrc/alphamoe_sm100.cu
Comment thread csrc/alphamoe_sm100.cu
Comment thread flashinfer/fused_moe/__init__.py
Comment thread flashinfer/fused_moe/alphamoe_sm100.py
Comment thread flashinfer/fused_moe/alphamoe_sm100.py
Comment thread tests/moe/test_alphamoe_sm100.py Outdated
Comment thread tests/moe/test_alphamoe_sm100.py Outdated
@yyihuang

yyihuang commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

/bot run

@flashinfer-bot

Copy link
Copy Markdown
Collaborator

GitLab MR !1118 has been created, and the CI pipeline #60909301 is currently running. I'll report back once the pipeline job completes.

@flashinfer-bot

Copy link
Copy Markdown
Collaborator

[FAILED] Pipeline #60909301 — 9/18 executed test jobs passed

Compared with nightly #60712014.

Unit Tests

GPU CUDA 12.9 CUDA 13.0 Notes
5090 ❔ Unknown ❔ Unknown Unknown: script failed before producing a JUnit report (2 jobs; CUDA 12.9, CUDA 13.0)
B300 ❌ New ❌ New New: tests.trace.test_template_registry (2 failures; CUDA 12.9, CUDA 13.0)
New: tests.gemm.test_groupwise_scaled_gemm_fp8 (1 failure; CUDA 13.0)
Infrastructure: test infrastructure interrupted the job (2 jobs; CUDA 12.9, CUDA 13.0)
GB200 ⚠️ Infra ⚠️ Infra Infrastructure: test infrastructure interrupted the job (2 jobs; CUDA 12.9, CUDA 13.0)
GB300 ⚠️ Infra ⚠️ Infra Infrastructure: test infrastructure interrupted the job (2 jobs; CUDA 12.9, CUDA 13.0)
H100 ❌ New ❌ New New: tests.trace.test_template_registry (2 failures; CUDA 12.9, CUDA 13.0)
RTX Pro 6000 Blackwell ❌ New ❌ New New: tests.gemm.test_sm_constraint_gemm (55296 failures; CUDA 12.9, CUDA 13.0)
New: tests.gemm.test_mm_fp4 (43951 failures; CUDA 12.9, CUDA 13.0)
New: tests.attention.test_rope (30254 failures; CUDA 12.9)
… and 333 more

✅ Pass · 🟡 Old failure · ❌ New failure · ⏱ Test timeout · ⚠️ Infrastructure · ❔ Unknown or unclassified · — Not run

Multi-GPU and Multi-Node Tests — 5/6 passed

GPU CUDA 12.9 CUDA 13.0 Notes
B300 (multi-GPU) ✅ Pass ❔ Failed
GB200 (multi-node) ✅ Pass ✅ Pass
GB300 (multi-node) ✅ Pass ✅ Pass
Failure details

New relative to nightly (attribution uncertain)

  • tests.gemm.test_sm_constraint_gemm — 55296 failures on RTX Pro 6000 Blackwell / CUDA 12.9, RTX Pro 6000 Blackwell / CUDA 13.0
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • tests.gemm.test_mm_fp4 — 43951 failures on RTX Pro 6000 Blackwell / CUDA 12.9, RTX Pro 6000 Blackwell / CUDA 13.0
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • tests.attention.test_rope — 30254 failures on RTX Pro 6000 Blackwell / CUDA 12.9
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • tests.attention.test_trtllm_gen_attention_prefill — 29608 failures on RTX Pro 6000 Blackwell / CUDA 12.9, RTX Pro 6000 Blackwell / CUDA 13.0
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • tests.attention.test_trtllm_gen_mla — 28018 failures on RTX Pro 6000 Blackwell / CUDA 12.9, RTX Pro 6000 Blackwell / CUDA 13.0
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • tests.attention.test_batch_prefill_kernels — 22937 failures on RTX Pro 6000 Blackwell / CUDA 12.9, RTX Pro 6000 Blackwell / CUDA 13.0
    • failed on setup with "RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program star…
  • tests.moe.test_trtllm_gen_fused_moe — 20107 failures on RTX Pro 6000 Blackwell / CUDA 12.9, RTX Pro 6000 Blackwell / CUDA 13.0
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • tests.attention.test_hopper — 13560 failures on RTX Pro 6000 Blackwell / CUDA 12.9, RTX Pro 6000 Blackwell / CUDA 13.0
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • tests.gemm.test_mm_bf16 — 13145 failures on RTX Pro 6000 Blackwell / CUDA 12.9, RTX Pro 6000 Blackwell / CUDA 13.0
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • tests.attention.test_sliding_window — 13088 failures on RTX Pro 6000 Blackwell / CUDA 12.9, RTX Pro 6000 Blackwell / CUDA 13.0
    • failed on setup with "RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program star…
  • tests.utils.test_fp4_quantize — 10334 failures on RTX Pro 6000 Blackwell / CUDA 12.9
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • tests.moe.test_trtllm_gen_routed_fused_moe — 7416 failures on RTX Pro 6000 Blackwell / CUDA 12.9, RTX Pro 6000 Blackwell / CUDA 13.0
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • … and 175 more failing test groups

Pre-existing failures

  • tests.attention.test_rope — 30254 failures on RTX Pro 6000 Blackwell / CUDA 13.0
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • tests.attention.test_sliding_window — 10496 failures on RTX Pro 6000 Blackwell / CUDA 13.0
    • failed on setup with "RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program star…
  • tests.utils.test_fp4_quantize — 10334 failures on RTX Pro 6000 Blackwell / CUDA 13.0
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • tests.attention.test_batch_prefill_kernels — 8777 failures on RTX Pro 6000 Blackwell / CUDA 13.0
    • failed on setup with "RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program star…
  • tests.gemm.test_mm_fp4 — 3965 failures on RTX Pro 6000 Blackwell / CUDA 13.0
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • tests.gemm.test_groupwise_scaled_gemm_mxfp4 — 3456 failures on RTX Pro 6000 Blackwell / CUDA 13.0
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • tests.attention.test_batch_decode_kernels — 3259 failures on RTX Pro 6000 Blackwell / CUDA 13.0
    • failed on setup with "RuntimeError: FlashInfer requires GPUs with sm75 or higher"
  • tests.utils.test_norm — 2886 failures on RTX Pro 6000 Blackwell / CUDA 13.0
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • tests.gdn.test_prefill_delta_rule — 2632 failures on RTX Pro 6000 Blackwell / CUDA 13.0
    • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the availab…
  • tests.attention.test_tensor_cores_decode — 2448 failures on RTX Pro 6000 Blackwell / CUDA 13.0
    • failed on setup with "RuntimeError: FlashInfer requires GPUs with sm75 or higher"
  • tests.attention.test_block_sparse — 2376 failures on RTX Pro 6000 Blackwell / CUDA 13.0
    • failed on setup with "RuntimeError: FlashInfer requires GPUs with sm75 or higher"
  • tests.attention.test_batch_invariant_fa2 — 2016 failures on RTX Pro 6000 Blackwell / CUDA 13.0
    • failed on setup with "RuntimeError: FlashInfer requires GPUs with sm75 or higher"
  • … and 137 more failing test groups

Timeouts, infrastructure, or incomplete jobs

@yyihuang

Copy link
Copy Markdown
Collaborator

/bot run run tests/moe/test_alphamoe_sm100.py

@flashinfer-bot

Copy link
Copy Markdown
Collaborator

Invalid /bot run path(s): run. Expected tests/<dir> or tests/<dir>/<file>.py.

@yyihuang

Copy link
Copy Markdown
Collaborator

/bot run tests/moe/test_alphamoe_sm100.py

@yyihuang

Copy link
Copy Markdown
Collaborator

@flashinfer-bot run

@flashinfer-bot

Copy link
Copy Markdown
Collaborator

GitLab MR !1118 has been updated with latest changes, and the CI pipeline #67588326 is currently running. I'll report back once the pipeline job completes.

@flashinfer-bot

Copy link
Copy Markdown
Collaborator

[FAILED] Pipeline #67588326 — 12/19 executed test jobs passed

Compared with nightly #67341591 (different CI configuration).

Unit Tests

GPU CUDA 12.9 CUDA 13.0 CUDA 13.4 Notes
B200 ❌ New ❌ New PR-related: tests.moe.test_alphamoe_sm100 (4 failures; CUDA 12.9, CUDA 13.0)
GB200 ❌ New ❌ New PR-related: tests.moe.test_alphamoe_sm100 (4 failures; CUDA 12.9, CUDA 13.0)
GB300 ❌ New ❌ New PR-related: tests.moe.test_alphamoe_sm100 (4 failures; CUDA 12.9, CUDA 13.0)
H100 ✅ Pass ✅ Pass
RTX Pro 6000 Blackwell ✅ Pass ✅ Pass
VR200 ❔ Unknown Unknown: script failed before producing a JUnit report (1 job; CUDA 13.4)

✅ Pass · 🟡 Old failure · ❌ New failure · ⏱ Test timeout · ⚠️ Infrastructure · ❔ Unknown or unclassified · — Not run

Multi-GPU and Multi-Node Tests — 6/6 passed

GPU CUDA 12.9 CUDA 13.0 CUDA 13.4 Notes
B300 (multi-GPU) ✅ Pass ✅ Pass
GB200 (multi-node) ✅ Pass ✅ Pass
GB300 (multi-node) ✅ Pass ✅ Pass
Failure details

PR-related regressions

  • tests.moe.test_alphamoe_sm100 — 12 failures on B200 / CUDA 12.9, B200 / CUDA 13.0, GB200 / CUDA 12.9, GB200 / CUDA 13.0, GB300 / CUDA 12.9, GB300 / CUDA 13.0
    • AssertionError: mismatch vs torch reference at decode_m1_e4_k256_top2: 1 differing elements, max |diff|=0.00390625 assert False + where False = <built-in method equal of type ob…

Timeouts, infrastructure, or incomplete jobs

  • Unknown: script failed before producing a JUnit report — VR200 / CUDA 13.4

@yyihuang yyihuang changed the title feat(cake_alphamoe): add optimized Blackwell fused W8A8 block-scale MoE feat(moe): add Blackwell AlphaMoE W8A8 expert up/down compute Sep 13, 2026
@yyihuang yyihuang changed the title feat(moe): add Blackwell AlphaMoE W8A8 expert up/down compute feat(cake_alpha_moe): add Blackwell AlphaMoE W8A8 expert up/down compute Sep 13, 2026
@yyihuang yyihuang changed the title feat(cake_alpha_moe): add Blackwell AlphaMoE W8A8 expert up/down compute feat: optimize Blackwell AlphaMoE W8A8 expert up/down compute Sep 13, 2026
@yyihuang yyihuang changed the title feat: optimize Blackwell AlphaMoE W8A8 expert up/down compute feat(cake_alpha_moe): add optimized Blackwell W8A8 expert up/down compute Sep 13, 2026
@yyihuang

Copy link
Copy Markdown
Collaborator

@flashinfer-bot run

@yyihuang

Copy link
Copy Markdown
Collaborator

/bot run tests/moe/test_alphamoe_sm100.py

@flashinfer-bot

Copy link
Copy Markdown
Collaborator

GitLab MR !1118 has been updated with latest changes, and the CI pipeline #67614749 is currently running. I'll report back once the pipeline job completes.

@yyihuang yyihuang added run-ci and removed run-ci labels Sep 13, 2026
@flashinfer-bot

Copy link
Copy Markdown
Collaborator

[FAILED] Pipeline #67614749 — 12/19 executed test jobs passed

Compared with nightly #67341591 (different CI configuration).

Unit Tests

GPU CUDA 12.9 CUDA 13.0 CUDA 13.4 Notes
B200 ❌ New ❌ New PR-related: tests.moe.test_alphamoe_sm100 (4 failures; CUDA 12.9, CUDA 13.0)
GB200 ❌ New ❌ New PR-related: tests.moe.test_alphamoe_sm100 (4 failures; CUDA 12.9, CUDA 13.0)
GB300 ❌ New ❌ New PR-related: tests.moe.test_alphamoe_sm100 (4 failures; CUDA 12.9, CUDA 13.0)
H100 ✅ Pass ✅ Pass
RTX Pro 6000 Blackwell ✅ Pass ✅ Pass
VR200 ❔ Unknown Unknown: script failed before producing a JUnit report (1 job; CUDA 13.4)

✅ Pass · 🟡 Old failure · ❌ New failure · ⏱ Test timeout · ⚠️ Infrastructure · ❔ Unknown or unclassified · — Not run

Multi-GPU and Multi-Node Tests — 6/6 passed

GPU CUDA 12.9 CUDA 13.0 CUDA 13.4 Notes
B300 (multi-GPU) ✅ Pass ✅ Pass
GB200 (multi-node) ✅ Pass ✅ Pass
GB300 (multi-node) ✅ Pass ✅ Pass
Failure details

PR-related regressions

  • tests.moe.test_alphamoe_sm100 — 12 failures on B200 / CUDA 12.9, B200 / CUDA 13.0, GB200 / CUDA 12.9, GB200 / CUDA 13.0, GB300 / CUDA 12.9, GB300 / CUDA 13.0
    • AssertionError: mismatch vs torch reference at decode_m1_e4_k256_top2: 1 differing elements, max |diff|=0.00390625 assert False + where False = <built-in method equal of type ob…

Timeouts, infrastructure, or incomplete jobs

  • Unknown: script failed before producing a JUnit report — VR200 / CUDA 13.4

@yyihuang

Copy link
Copy Markdown
Collaborator

/bot run tests/moe/test_alphamoe_sm100.py

@flashinfer-bot

Copy link
Copy Markdown
Collaborator

GitLab MR !1118 has been updated with latest changes, and the CI pipeline #67617789 is currently running. I'll report back once the pipeline job completes.

@flashinfer-bot

Copy link
Copy Markdown
Collaborator

[SUCCESS] Pipeline #67617789: 18/19 executed test jobs passed

@yyihuang
yyihuang enabled auto-merge (squash) September 13, 2026 08:22
@yyihuang
yyihuang merged commit 93e9eef into flashinfer-ai:main Sep 13, 2026
25 of 26 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants