Skip to content

test: unified GEMM/BMM fuzzer + convention auditor - #3539

Merged
YangXu1990uiuc merged 2 commits into
flashinfer-ai:mainfrom
YangXu1990uiuc:yanxu/quality-fuzzers
Jul 14, 2026
Merged

YangXu1990uiuc merged 2 commits into
flashinfer-ai:mainfrom
YangXu1990uiuc:yanxu/quality-fuzzers

Conversation

@YangXu1990uiuc

@YangXu1990uiuc YangXu1990uiuc commented Jun 8, 2026

Copy link
Copy Markdown
Collaborator

test: unified GEMM/BMM fuzzer + convention auditor

What this is

One harness — tests/gemm/test_unified_gemm_fuzz.py — for flashinfer's scaled GEMM/BMM family:
{op-shape: mm, bmm} × {quant: bf16, fp8 (e4m3+e5m2), nvfp4, mxfp4} × {backend}, driven through thin
per-API adapters. It replaces the earlier per-op fuzzers (test_mm_fp4_fuzz.py,
test_bmm_fp8_fuzz.py) — their logic, plus the #2440 quantize-root test, is folded in here — so
there is one strong, encapsulated tester instead of N scattered files.

Scope note: this PR is now GEMM-only. The MoE fuzzers that were originally in this branch have
moved: the production unified-MoE fuzzer landed on main with the unified MoE API (#3093), and the
older MoE/adapter crash-finders are parked on branch yanxu/moe-fuzzers-parked for later (they
cover in-kernel routing, which the pre-routed unified API can't yet exercise).

Input model (same as the unified MoE fuzzer)

Sparse (~75% zero) + exactly-representable inputs, snapped to each quant mode's grid via a
per-mode round-trip (bf16 = identity, fp8 = to_float8, nvfp4 = nvfp4_quantize+e2m1 decode,
mxfp4 = mxfp4_quantize+mxfp4_dequantize). Because input quantization is then lossless:

  • structural bugs (wrong tile / dropped block / wrong scale role) produce a gross error over the
    short sparse reductions instead of being averaged away;
  • the numeric oracle is a tight atol = C·‖ref‖∞ against the authoritative snapped-input
    reference (C = the accumulation/requant floor), not a loose cosine > 0.97. This catches both
    structural bugs and the sub-floor accuracy regressions a cosine oracle misses.

Magnitude regimes (tiny/large/…) are kept only in the standalone quantize-root test, where extreme
magnitudes are the point (#2440: finite inputs must never yield non-finite scale factors).

Oracles (per config)

no-spurious-NaN/Inf · tight numeric vs authoritative reference · not-(almost)-all-zero (#3398/#3068)
· output-buffer poison (NaN-fill → catches a kernel that doesn't fully write its output) ·
run-to-run determinism (#2514) · device-state probe (a context-corrupting IMA → clean
failure) · cross-arch by construction (run the same seed on each GPU, diff pass/fail).

Convention auditor (existing APIs unchanged)

Each scaled-GEMM API ships its own scale convention (per-tensor alpha vs block vs block+global alpha
vs none; A/B-scale roles; layout) — the surface where the fp4-vs-fp8 incompatibility was found. The
APIs cannot be changed (would break users), so this harness does not force them to agree:

  • each adapter declares its convention explicitly;
  • the per-config oracle validates each backend against its own recipe (a deviation is caught) —
    never against a different convention (forcing cross-convention equality is a false-positive trap);
  • test_convention_conformance cross-checks backends that share a declared convention (a real
    cross-backend oracle), prints a convention matrix, and a _CONVENTION_DIVERGENCES ledger documents
    known cross-mode incompatibilities so they're tracked, not silently passing.

This is the enforcement hook for the future: if a unified GEMM API (or an incremental
convention-compat fix) makes two divergent APIs share a convention, move them into one conformance
group + drop the ledger entry → the test then enforces they agree.

Debuggability (every test)

  • Deterministic: every config (shapes, modes, input data, buffer poison, global RNG) is derived
    from its seed → bit-reproducible.
  • Self-explanatory failures: prints the full config; on a numeric mismatch dumps output-vs-oracle
    stats (nan/inf/zero counts, max|.|) + the worst ≤30 elements — so a CI log shows whether the
    output is all-zero / NaN / Inf / garbage without rerunning.
  • Perfect repro: prints a REPRO: line; FLASHINFER_GEMM_FUZZ_ONLY_SEED=<seed> reruns exactly
    that one config.

Validation

Run on all four archs on the dev box — A100/SM80, L40S/SM89, H100/SM90, B200/SM100 — all clean
(fp4 adapters skip cleanly below SM100; fp8 below SM89). Tolerances calibrated on SM100 and verified
to hold cross-arch (fp8 ≤ 0.011, bf16 ≤ 0.0035). Default FLASHINFER_GEMM_FUZZ_NUM_TESTS=1000
(~10-min full sweep; tunable via env). The new dump immediately surfaced — and we fixed — a harness
B-layout bug (a .contiguous() made fp8 B row-major, which cublas silently computes garbage from
while cudnn/cutlass reject it).

Follow-ups (tracked in-file TODOs)

autotune ON/OFF + cache-coherence oracle · non-contiguous-input axis (B1) · use_8x4_sf_layout=True
/ #2861 (C1, needs the matching SF layout + a trtllm backend) · grouped op-shape
(group_*/*deepgemm*, m_indptr) · more point APIs (mm_fp8 low-latency, mm_mxfp8, bmm_mxfp8).

Summary by CodeRabbit

  • Tests
    • Added a unified GEMM/BMM fuzzing framework with deterministic sparse and quantized inputs, NaN-poisoning, per-quant-mode FP32 reference checks, determinism validation, convention-conformance grouping and agreement checks, quantize-fuzz tests, and autotune-cache isolation with dynamic-shape validation.
  • Bug Fixes
    • Disabled a known-bad cuDNN backend version and surface an upgrade message.
    • Enforced minimum dimensions for certain quantized batch-matrix cases to reject unsafe small shapes.

@coderabbitai

coderabbitai Bot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Review 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
📝 Walkthrough

Walkthrough

Adds a unified GEMM/BMM fuzzing and conformance test suite (deterministic adapters, quantization oracles, NaN-poison checks, autotune-cache handling), plus cuDNN backend gating and stricter bmm_mxfp8 size validation.

Changes

Unified GEMM/BMM Fuzzing Framework

Layer / File(s) Summary
Module docstring and gating
tests/gemm/test_unified_gemm_fuzz.py
Adds module-level description, env-driven sizing/seed selection, CUDA/SM availability gating, and unsupported-vs-crash exception classification.
GemmAdapter and backend runners
tests/gemm/test_unified_gemm_fuzz.py
Introduces GemmAdapter dataclass, implements adapter runners for bf16/fp8/nvfp4/mxfp4/mxfp8 GEMM/BMM, registers adapters, and records convention divergences and known-failure handling.
Cfg and deterministic config generation
tests/gemm/test_unified_gemm_fuzz.py
Adds Cfg dataclass and _gen(seed) deterministic config selection with dynamic shapes, alignment snapping for quantizable dims, and fp8 dtype combo constraints.
Quant-mode snapping and canonical oracle
tests/gemm/test_unified_gemm_fuzz.py
Per-quant-mode snap/round-trip reconstruction, tolerance calibration, sparse input generation, and canonical fp32 oracle builder.
Poisoned buffers, diagnostics, and invariants
tests/gemm/test_unified_gemm_fuzz.py
NaN-poisoned output buffer constructor, repro/diagnostic helpers, invariant assertions (reference-aware finiteness, tight tolerances, all-zero guard), and autouse fixture to clear AutoTuner cache.
Main fuzz test and validation
tests/gemm/test_unified_gemm_fuzz.py
test_unified_gemm_fuzz: deterministic run under autotune(False), oracle validation, determinism re-run into fresh poisoned buffer, device-state probe, and optional small-sample autotune(True) correctness check.
Convention conformance auditor
tests/gemm/test_unified_gemm_fuzz.py
test_convention_conformance: groups backends by declared convention, runs group members, asserts cross-backend agreement via cosine similarity, and prints a convention matrix and divergence ledger.
Quantize-scale fuzzer
tests/gemm/test_unified_gemm_fuzz.py
test_gemm_quantize_fuzz: deterministic quantization fuzzer that ensures quantization scale factors are finite for nvfp4/mxfp4/fp8 (skips unsupported fp4 SMs).
Autotune dynamic-shape cache test
tests/gemm/test_unified_gemm_fuzz.py
test_autotune_cache_dynshape: exercises autotune(True) cached-winner reuse across a fixed m sequence with per-shape validation against the canonical reference.
cuDNN gating and MXFP8 size checks
flashinfer/gemm/gemm_base.py
Bans cuDNN backend for version 9.23.0.x (returns False for auto, raises for explicit cudnn) on SM90 float16 outputs and adds n,k >= 128 guards for bmm_mxfp8.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels

run-ci

Suggested reviewers

  • yzh119
  • bkryu
  • dhiraj113
  • aleozlx
  • jimmyzho
  • cyx-6
  • yongwww
  • nv-yunzheq

Poem

🐰 I sniffed the kernels, hopped through lanes of bytes,
Snapped inputs to grids and chased the rounding rites,
I poisoned outputs so half-works can't hide,
Adapters hopped backends, checking side by side,
A tiny rabbit cheer — deterministic delight.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 23.81% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'test: unified GEMM/BMM fuzzer + convention auditor' accurately captures the main changes: consolidating GEMM/BMM testing into a single unified fuzzer with convention auditing.
Description check ✅ Passed The description is comprehensive and well-structured, covering the what, why, input model, oracles, convention auditor, debuggability, validation, and follow-ups. However, it does not explicitly check all template sections, particularly missing explicit checkmarks for pre-commit checks and test completion items.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 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.

@gemini-code-assist gemini-code-assist 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.

Code Review

This pull request introduces three comprehensive randomized fuzzing test suites targeting FP8 batched GEMM, low-precision FP4 GEMM/quantization, and fused MoE implementations to catch edge-case bugs, non-determinism, and device state corruption. The review feedback identifies three key issues: the use of Python's non-deterministic 'hash()' function for seeding in the FP4 fuzzer, an inefficient generator instantiation inside a list comprehension in the FP8 fuzzer that defeats seed randomization, and control flow issues in the MoE fuzzer that prematurely skip valuable determinism/device-state checks and silently ignore shape mismatches.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread tests/gemm/test_mm_fp4_fuzz.py Outdated
Comment thread tests/gemm/test_bmm_fp8_fuzz.py Outdated
Comment thread tests/moe/test_moe_fuzz.py Outdated
Comment thread tests/moe/test_unified_moe_fuzz.py Outdated
@YangXu1990uiuc YangXu1990uiuc changed the title test: randomized fuzzers for low-precision GEMM and fused MoE test: unified GEMM/BMM fuzzer + convention auditor Jun 11, 2026
@YangXu1990uiuc
YangXu1990uiuc marked this pull request as ready for review June 12, 2026 00:27

@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.

🧹 Nitpick comments (1)
tests/gemm/test_unified_gemm_fuzz.py (1)

769-791: 💤 Low value

Potential issue: cfg.adapter points to ads[0] but ad.run uses a different adapter.

The cfg object is created with adapter=ads[0], but inside the loop, ad.run(a, b, out, be, cfg) is called with potentially different adapters from ads. If any adapter's run function uses cfg.adapter internally (e.g., to check properties like quant_mode or op_shape), it would get the wrong adapter's values.

Looking at the run functions (_run_bf16_mm, _run_fp8_bmm, etc.), they use cfg.fp8_idt, cfg.fp8_mdt, and cfg.use_8x4 but not cfg.adapter directly. However, since all adapters in the same group share the same (op_shape, quant_mode), and the _canonical function uses cfg.adapter.quant_mode and cfg.adapter.op_shape, this could cause issues if adapters in the same convention group have different quant_mode values.

In practice, by construction (grouping by quant_mode), this should be fine, but the code would be clearer if cfg were recreated per adapter.

🤖 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/gemm/test_unified_gemm_fuzz.py` around lines 769 - 791, The cfg is
built once with adapter=ads[0] but reused for other adapters, risking stale
adapter-specific fields; update cfg.adapter for each adapter (or recreate cfg
inside the loop) before calling ad.run(a, b, out, be, cfg) so that
adapter-dependent values (cfg.adapter, cfg.quant_mode, cfg.op_shape,
cfg.fp8_idt/fp8_mdt/use_8x4 used by _run_bf16_mm/_run_fp8_bmm and related
runners) reflect the current ad; ensure _canonical is called with the correct
cfg.adapter when constructing a,b,_ref for each ad if needed.
🤖 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.

Nitpick comments:
In `@tests/gemm/test_unified_gemm_fuzz.py`:
- Around line 769-791: The cfg is built once with adapter=ads[0] but reused for
other adapters, risking stale adapter-specific fields; update cfg.adapter for
each adapter (or recreate cfg inside the loop) before calling ad.run(a, b, out,
be, cfg) so that adapter-dependent values (cfg.adapter, cfg.quant_mode,
cfg.op_shape, cfg.fp8_idt/fp8_mdt/use_8x4 used by _run_bf16_mm/_run_fp8_bmm and
related runners) reflect the current ad; ensure _canonical is called with the
correct cfg.adapter when constructing a,b,_ref for each ad if needed.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 31def3b6-f837-4465-9a09-660f2c9588f7

📥 Commits

Reviewing files that changed from the base of the PR and between 0ba7a3f and 208e3b073a123b65a53eb1eeed56a75a47ae140c.

📒 Files selected for processing (1)
  • tests/gemm/test_unified_gemm_fuzz.py

@aleozlx

aleozlx commented Jul 8, 2026

Copy link
Copy Markdown
Member

@dhiraj113 @bkryu wanna take a look here?

@aleozlx aleozlx added the run-ci label Jul 8, 2026
@aleozlx

aleozlx commented Jul 8, 2026

Copy link
Copy Markdown
Member

/bot run tests/gemm

@flashinfer-bot

Copy link
Copy Markdown
Collaborator

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

@flashinfer-bot

Copy link
Copy Markdown
Collaborator

[FAILED] Pipeline #57269339: 7/20 passed

…to latest main)

Squash of the 24-commit PR flashinfer-ai#3539 branch onto current main (162 commits of drift;
the intermediate MoE-fuzzer commits conflicted with the flashinfer-ai#3093 unified MoE fuzzer
that landed on main independently, so history is collapsed to the net diff:
tests/gemm/test_unified_gemm_fuzz.py + the two gemm_base.py guards).

AI-assisted (squash-rebase by Claude Code).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@YangXu1990uiuc
YangXu1990uiuc force-pushed the yanxu/quality-fuzzers branch 2 times, most recently from 9343f72 to 1df17e3 Compare July 14, 2026 05:22
…t run

Pipeline 57269339 (7/20): every red unit-test leg reduced to one of two causes,
both in the fuzzer itself (the multi_gpu_test_b300[cu129] red is an unrelated
pre-existing tests/comm/test_allreduce_unified_api.py trtllm-fusion failure):

1. all-zero-oracle FALSE POSITIVE (9 legs, same config+seed
   mm_nvfp4_cudnn_m7_n32_k32_float16_s65667983): with sparse inputs and a tiny
   224-elem output the ORACLE itself is 223/224 zero and the output matched it,
   but the standalone '~all-zero output' invariant only looked at the oracle's
   max magnitude. The invariant is REMOVED as redundant: an all-zero/all-NaN
   output necessarily fails the tight numeric check, and the failure dump (now
   the worst 100 elements + stats) makes the pattern self-evident. Verified:
   the exact CI seed passes on SM100 with the same ratio (0.01355) CI logged.

2. ledgered configs could still CRASH (gb200[cu129]: 966 cascade failures):
   the flashinfer-ai#3604 bmm_mxfp8 b>1/M%128!=0 entry xfailed only at compare time, AFTER
   running the kernel; on the cu129 stack the same root cause is an illegal
   memory access (b=16 m=7 n=512 k=2688) that poisons the CUDA context for
   every later test. Ledger entries now carry a crash-capable flag: crash
   entries xfail UP FRONT (never launched) in the fuzz test and are skipped in
   the autotune-dynshape M-sequence; numeric-only entries still run and keep
   the xpass 'fixed -> remove me' signal. Verified: the exact CI IMA config
   now xfails in <1s without touching the device.

Also found during re-validation (new numeric-only ledger entry): on cuDNN
9.23.0 + SM90 the AUTOTUNED bf16->bf16 tactic is garbage -- per-plan
enumeration shows exactly the five eng7_k17=4_* plans (engine 7,
CUDNN_KNOB_TYPE_SPLIT_K_SLC=4) miscompute (ratio ~1.39) while eng7 without
split-k is correct; the tuner picks the broken one because split-k wins the
timing race on tall-K shapes (mm_bf16 m63 n32 k2688). NOT tactic-index drift:
profiled and executed against the same graph in-process. Verified fixed in
9.23.1/9.23.2 (same per-plan matrix all-correct), so the ledger gate is
exactly ==92300. bf16-out sibling of the fp16-out 9.23.0 bug gemm_base.py
hard-bans; the default tactic is correct so no product change.

Plus the long_running marker per flashinfer-ai#3770 (merged into the existing pytestmark
list -- a second bare assignment silently overwrote the first).

AI-assisted (CI log triage + per-plan bisect by Claude Code).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@YangXu1990uiuc
YangXu1990uiuc force-pushed the yanxu/quality-fuzzers branch from 1df17e3 to b4ec56f Compare July 14, 2026 08:29
YangXu1990uiuc added a commit that referenced this pull request Jul 14, 2026
…nobs

- tests/test_helpers/fuzz_ledger.py: one mechanism for all quality fuzzers
  (gh #3605): quarantine=False entries run with tolerated wrong answers and
  flag xpass loudly; quarantine=True entries xfail up front (crash class).
  Every entry must reference a tracking issue (validated at construction).
  Same shape the scaled-GEMM fuzzer (PR #3539) evolved independently.
- Migrate the unified MoE fuzzer to the shared ledger.
- Debug knobs for gh #3957 bisection: FLASHINFER_UMOE_FUZZ_BACKENDS
  (backend-scoped sequences) and FLASHINFER_UMOE_FUZZ_NO_AUTOTUNE.
- No quarantine entry for #3957: it is cumulative cross-call state
  corruption with a moving victim (config-predicate quarantine tried and
  refuted on hardware); the file staying red on SM100 is the signal.

AI-assisted (bisect + validation on live SM100 hardware).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@YangXu1990uiuc

Copy link
Copy Markdown
Collaborator Author

/bot run tests/gemm

@flashinfer-bot

Copy link
Copy Markdown
Collaborator

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

@YangXu1990uiuc

Copy link
Copy Markdown
Collaborator Author

Rebased onto latest main + both bot-run failure classes fixed. History is squashed to the net diff (the intermediate MoE-fuzzer commits conflicted with the unified MoE fuzzer that landed independently via #3093): one base commit + one fix commit.

Triage of pipeline 57269339 (7/20)

Every red unit-test leg was this fuzzer file itself (all 19 other tests/gemm files passed on every leg), and reduced to exactly two causes:

1. Nine legs, all the same single failure mm_nvfp4_cudnn_m7_n32_k32_float16_s65667983 — harness false positive. With sparse inputs and a tiny 224-element output, the oracle itself is 223/224 zero and the output matched it (the one nonzero element agreed, ratio 0.0136) — but the standalone "~all-zero output vs non-trivial oracle" invariant only checked the oracle's max magnitude, not its density. Fixed by removing that invariant as redundant: an all-zero/all-NaN output necessarily fails the tight numeric check anyway, and its failure dump (output/oracle stats + now the worst 100 elements) makes any such pattern self-evident in the CI log. The exact CI seed reproduces the identical numerics locally on SM100 and now passes.

2. unit_test_gb200[cu129]'s 966-failure cascade — a ledgered config was still allowed to launch its kernel. First failure in execution order is bmm_mxfp8_cudnn_b16_m7_n512_k2688_s1429894970, i.e. the already-ledgered #3604 family (b>1, M%128≠0). The ledger xfailed at compare time — after running the kernel — and on the cu129 stack this root cause escalates from garbage output to an illegal memory access, which poisoned the CUDA context for every later test in the session. Fixed: ledger entries now carry a crash-capable flag; crash-capable configs xfail up front (kernel never launched), both in the fuzz sweep and in the autotune-dynshape M-sequence (which drives b=2 with M ∈ {17, 4097, 3, 129}). The exact CI config now xfails in <1s without touching the device.

The remaining red, multi_gpu_test_b300[cu129], is unrelated to this PR: tests/comm/test_allreduce_unified_api.py trtllm-fusion numeric failures (the cu130 leg of the same job is green).

Bonus finding from re-validation

On a cuDNN 9.23.0 box, the autotune-ON winner validation caught the autotuner-selected cuDNN tactic returning garbage for bf16→bf16 on SM90 (m63_n32_k2688, ratio 0.98 vs 0.0022 at the default tactic). Per-plan enumeration pinpoints it: of the graph's 15 execution plans, exactly the five eng7_k17=4_* ones (engine 7 with CUDNN_KNOB_TYPE_SPLIT_K_SLC=4) miscompute, eng7 without split-k is correct — and the tuner picks a broken one because split-k wins the timing race on this tall-K shape. It's the bf16-out sibling of the 9.23.0 split-k bug this PR already hard-bans for fp16-out, and verified fixed in cuDNN 9.23.1: rerunning the same per-plan matrix under 9.23.1.3 and 9.23.2.1 shows all 15 plans (including the five eng7_k17=4 ones) correct — so the ledger gate is exactly ==92300. The default tactic is correct and the requirement layer can't exclude a single plan, so it's a numeric-only ledger entry; CI containers pin newer cuDNN and are unaffected. Exactly the "fast-but-wrong tactic" class this oracle exists for — and a good argument for finishing #3707's structured plan names, which would let a tactics blocklist name eng7_k17=4 stably instead of a version-fragile integer index.

Re-validation (all four local archs, rebased code)

Arch Result
A100 / SM80 1499 passed
L40S / SM89 1717 passed
H100 / SM90 1419 passed, 1 xfailed (9.23.0 ledger above)
B200-class / SM100 2092 passed, 151 xfailed (#3604 family)

Zero failures. The rebase also newly exercises the cute_ext TGV default (#3281) and cuBLASLt-on-SM80+ (#3804) through the auto backend — clean on all archs — and the file now carries the long_running marker per #3770.

Internal CI has been re-triggered on the new head. Note for reading the result: multi_gpu_test_b300[cu129] may still be red — that's the pre-existing tests/comm/test_allreduce_unified_api.py trtllm-fusion failure unrelated to this PR (the cu130 leg of the same job is green).

@YangXu1990uiuc
YangXu1990uiuc merged commit 0472b9b into flashinfer-ai:main Jul 14, 2026
30 checks passed
YangXu1990uiuc added a commit that referenced this pull request Jul 15, 2026
…out (breadth -> unified fuzzers)

GEMM (fuzzer default-on since #3539): bmm_fp8 3456->6 cases (~71 min/leg),
mm_fp4 23760->12 + 4 auto (~59 min on Blackwell legs), mm_bf16 7560->13,
mm_mxfp8 2688->6 (+large-dim 400->4, stats 18->3), bmm_mxfp8 576->5,
bmm_bf16 240->8. Every kept case verified to actually run somewhere (none
self-skip into no-ops). Kept in full: error-path / cache-behavior / invariant
tests, the #3560 ragged-K anchor, and non-fuzzed paths (8x4 SF layout,
bias/pdl epilogues, trtllm weight shuffle).

MoE (rides the #3958 fuzzer default-on flip, assumes #3892 routing axes):
shape fan-out compressed, the quant x routing x weight-layout kernel-selection
matrix kept in FULL -- non-NVFP4 quant numerics are not fuzzed yet, so only
shapes were cut, never modes:
- renormalize trio: shared axis constants -> boundary tokens [8,3072] +
  intermediate [1024,384] (trio 4608 -> ~1500 collected)
- sigmoid 576->192; deepseekv3 27216->4032 (intermediate axis = hitting set of
  every routing config's compatible_intermediate_size, each config still runs)
- routed-parity 3456->144 (routing x quant x packed/unpacked in full);
  per-token 4over6 108->16; fp4 tactic sweep 72->24 (odd-token anchor kept);
  cute-dsl accuracy 144->16 and 24->8
Untouched: error-path / OA-param / routing-replay / kernel-tier / LoRA /
CUDA-graph / EP / tactic-pairing tests; #3595 / #3067 anchors.

Every touched file carries a header directing future coverage to the fuzzers.

AI-assisted (grid analysis + curation by Claude Code).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.

3 participants