Skip to content

[AMD][CI] Add DeepSeek-V4-Flash FP8 accuracy coverage on MI30x - #36396

Merged
HaiShaw merged 6 commits into
mainfrom
cursor/amd-nightly-mi30x-dsv4-flash-fp8-accuracy-d201
Aug 27, 2026
Merged

HaiShaw merged 6 commits into
mainfrom
cursor/amd-nightly-mi30x-dsv4-flash-fp8-accuracy-d201

Conversation

@michaelzhang-ai

@michaelzhang-ai michaelzhang-ai commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

MI30x only. The V3.x drop was split out of #36388, which now carries only its MI35x half.

Motivation

DeepSeek-V4 has no gfx942 coverage: every DSV4 job in the repo runs on linux-mi35x-gpu-8, and this workflow's V4 section was literally commented MI35x only. Meanwhile the cookbook publishes three verified: true MI300X Flash FP8 cells, so the docs call MI300X a supported DSV4 target while CI has never once run DSV4 there.

Separately, nightly-8-gpu-deepseek-v31 and nightly-8-gpu-deepseek-v3-kv-fp8 do not test what their names say — both serve deepseek-ai/DeepSeek-V3-0324 for accuracy, and only the v31 perf step serves V3.1. Every MI30x path they exercise (aiter MLA, EAGLE MTP, enable_multithread_load, bs=1 send_one) is covered by the retained V3.2 jobs on a current checkpoint.

Together this is one trade: stop paying 32 GPU-h/night for two jobs on a superseded checkpoint, and spend a fraction of it on the model with no gfx942 signal at all.

Modifications

1. New job nightly-8-gpu-deepseek-v4-flash on linux-mi300-8gpu-sglang, running the new test/registered/amd/test_deepseek_v4_flash_fp8_mi30x.py via the new nightly-amd-accuracy-8-gpu-deepseek-v4-flash suite.

The launch config is the cookbook's mi300x | flash | fp8 | low-latency | single cell verbatim — the only TP-only MI300X strategy published, so the narrowest cell that still covers the gfx942 serving path. Accuracy only: gfx942 has no DSV4 perf baseline to regress against, and the MI35x jobs carry the throughput numbers. GSM8K uses the same 8-shot / 1319-question eval as the MI35x FP8 test, with a > 0.90 floor. Blocking in check-all-jobs.

Depends on #36405: the cell as published omits SGLANG_DSV4_FP4_EXPERTS=0 and cannot load its own checkpoint on a cold cache. The test sets it, and the set-equality check below is stated against the cell as fixed there.

2. Dropped nightly-8-gpu-deepseek-v31-rocm720 and nightly-8-gpu-deepseek-v3-kv-fp8-rocm720, with their job_select options and check-all-jobs needs. All four test files stay registered, so the three suites remain reachable from workflow_dispatch — the same outcome #34761 documented for nightly-amd-accuracy-8-gpu-grok1-fp8.

MLA + KV-FP8 on gfx942 stays gated rather than lost: the cookbook recipe runs --kv-cache-dtype fp8_e4m3 and the new job blocks, so dropping the V3 KV-FP8 job leaves no gap, on a current model instead of V3-0324. The ROCm 7.0 nightly still schedules both dropped jobs and is untouched here.

On #36390. That issue reports DSV4-Flash FP8 degrading with context length on MI300X. It runs --attention-backend aiter with --dsa-{prefill,decode}-backend aiter; this recipe runs --attention-backend dsv4. The pass below does not contradict the report — it localizes it to the aiter path, which no CI job covers on any architecture. A follow-up job for that path is a reasonable next step and is not attempted here.

Accuracy Tests

Two runs on 8x MI300X, both dispatched with rocm_version=rocm720 and continue_on_error=false so a failure is loud, both green:

Run GSM8K invalid
32918680921 0.9174 0.000
33023346555 0.9257 0.000

For reference, the MI35x DSV4-Flash suite spans 0.9189–0.9310 (mean 0.9251) over its last three nightlies, so MI300X sits inside the same band.

On the 0.90 floor. The first revision used 0.91, inherited from the MI35x FP8 test for comparability, on one observation. The second run showed the two MI300X values span 0.83 points — wider than the MI35x per-test run-to-run sd of ~0.0019, which is expected given this recipe adds KV-FP8 and EAGLE. At that spread 0.91 sits ~2 sd below the mean, about one spurious failure per forty nights on a job that blocks check-all-jobs; 0.90 is >3.5 sd out under either sd estimate. It does not weaken the gate in any way that matters — the failure modes this exists to catch (see #36390) collapse output entirely rather than costing a point of GSM8K. Comparability with MI35x is preserved in the measured numbers rather than in a shared threshold.

Static validation:

Speed Tests and Profiling

Measured from run 32757901075, summed over both image flavors: dropping nightly-8-gpu-deepseek-v31 frees 17.4 GPU-h/night and nightly-8-gpu-deepseek-v3-kv-fp8 frees 14.7. The new job is a single 8-GPU accuracy step that took 42 min on its first run. Net reduction, and 2 fewer 8-GPU MI30x job slots.

Checklist


CI States

Latest PR Test (Base): ❌ Run #33026136250
Latest PR Test (Extra): ❌ Run #33026136082
Latest PR Test (AMD ROCm 7.2): ❌ Run #33026135973

cursoragent and others added 2 commits August 25, 2026 23:45
nightly-8-gpu-deepseek-v31 and nightly-8-gpu-deepseek-v3-kv-fp8 do not test
what their names say, and what they do test is already covered. Both serve
deepseek-ai/DeepSeek-V3-0324 for their accuracy legs; only the v31 perf step
serves V3.1. Every MI30x path they exercise -- aiter MLA under
SGLANG_USE_AITER=1, EAGLE 3-1-4 MTP with an accept-length floor,
enable_multithread_load, bs=1 send_one speed -- is exercised by the retained
V3.2 basic and MTP jobs on a current checkpoint.

Drops both jobs, their job_select options and their check-all-jobs needs. All
four test files stay registered, so the three suites remain reachable from
workflow_dispatch and manual runs.

One combination is no longer covered on gfx942 by this workflow: MLA with
--kv-cache-dtype fp8_e4m3. The closest retained gfx942 signal is
test_glm51_perf_amd.py, which runs KV-FP8 on GLM-5.1 (also DSA/MLA). DeepSeek
plus KV-FP8 stays covered on MI35x. The ROCm 7.0 nightly still schedules both
jobs and is untouched here.

Co-authored-by: quitenode <quitenode@users.noreply.github.com>
DeepSeek-V4 has no gfx942 coverage anywhere today: every DSV4 job in this
workflow, in pr-test-amd-rocm720.yml and in the MI355X disagg nightly runs on
linux-mi35x-gpu-8, and the ROCm 7.0 nightly has no DSV4 job at all. #36390
reports DSV4-Flash FP8 degrading with context length on 8x MI300X, which no
existing job could have caught.

Adds test/registered/amd/test_deepseek_v4_flash_fp8_mi30x.py (GSM8K, the same
8-shot eval and 0.91 floor as the MI35x FP8 test so the two architectures are
comparable) and schedules it as nightly-8-gpu-deepseek-v4-flash on
linux-mi300-8gpu-sglang.

Accuracy only: there is no gfx942 DSV4 perf baseline to regress against until
this job is green, and the MI35x jobs already carry the 8k/1k numbers.

The launch config is the gfx942 one from #36390, the only DSV4-Flash FP8
configuration observed to serve on MI300X. It differs from the MI35x test only
where gfx942 forces it: aiter attention and DSA backends instead of dsv4,
SGLANG_OPT_SWIGLU_CLAMP_FUSION=0 because the fusion dispatches a CUDA-only
kernel, and --moe-runner-backend triton because the aiter fused MoE is
non-deterministic on gfx942.

The job is deliberately left out of check-all-jobs while #36390 is open, so a
known-red job does not fail the whole nightly. Both the job section and the
needs list say so; move it into needs once it passes.

Co-authored-by: quitenode <quitenode@users.noreply.github.com>
…racy test

The first revision built its launch config from the #36390 reproducer. That was
wrong: the cookbook already publishes an MI300X Flash FP8 cell marked
verified: true, and CI should gate on the configuration the docs tell users to
run rather than on one assembled from a bug report.

Replaces the config with that cell verbatim -- the low-latency single-node one,
the only TP-only MI300X strategy published (balanced and high-throughput add DP
attention and the prefill delayer). The two configs disagree on nearly
everything that matters: dsv4 attention backend rather than aiter, page-size
256, mem-fraction 0.90 rather than 0.75, cuda graphs on, the default MoE
runner, plus --kv-cache-dtype fp8_e4m3, --swa-full-tokens-ratio 0.1 and EAGLE,
none of which the reproducer used.

Two consequences worth noting:

- The recipe runs KV-FP8, so this job restores the gfx942 MLA + KV-FP8 coverage
  that dropping nightly-8-gpu-deepseek-v3-kv-fp8 removed. That coverage gap is
  no longer open.
- #36390 exercises the aiter attention path, which this recipe does not touch,
  so a green run here would not contradict that report -- it would localize it.

Co-authored-by: quitenode <quitenode@users.noreply.github.com>
@michaelzhang-ai michaelzhang-ai changed the title [AMD][CI] Add DeepSeek-V4-Flash FP8 accuracy coverage on MI30x, and stop scheduling the V3-0324/V3.1 MI30x jobs [AMD][CI] Add DeepSeek-V4-Flash FP8 accuracy coverage on MI30x Aug 26, 2026
cursoragent and others added 2 commits August 26, 2026 01:21
The first MI300X run crashed during weight load, before GSM8K: all eight ranks
died in FusedMoE._load_w13 with 'The size of tensor a (2048) must match the
size of tensor b (4096)'. The factor of two is mxfp4 packing -- the FP8
checkpoint was being read at mxfp4 expert shapes.

The env var defaults to mxfp4 and the auto-detect fallback in model_config.py
reads the safetensors header out of the local HF cache, so on a runner that has
not pulled the weights yet it returns None and the wrong default wins. The
run's log has no 'Auto-detected DSV4 routed-expert layout' line, confirming
that path. Setting it explicitly also makes the job independent of whether the
runner's cache is warm, which otherwise makes this failure look flaky.

The cookbook cell this test mirrors has the same omission, along with the other
eight AMD FP8 cells; that is fixed in its own PR. With that fix the test's env
and flags are set-equal to the cell again.

Co-authored-by: quitenode <quitenode@users.noreply.github.com>
It passed on 8x MI300X: GSM8K 0.9174 against the 0.91 floor, invalid 0.000,
42 min wall (run 32918680921). That was the condition the section comment set
for moving it into check-all-jobs, so move it and drop the caveat.

Gating also makes the MLA + KV-FP8 coverage real rather than merely reported:
the cookbook recipe runs --kv-cache-dtype fp8_e4m3, so with this job blocking,
dropping nightly-8-gpu-deepseek-v3-kv-fp8 leaves no gap on gfx942.

The only job still outside check-all-jobs is nightly-test-1-gpu-kernel-rocm720,
which pre-dates this PR.

Co-authored-by: quitenode <quitenode@users.noreply.github.com>

@RolaoDenthu RolaoDenthu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

The 0.91 floor was inherited from the MI35x FP8 test for comparability, on a
single MI300X observation of 0.9174. A second run scored 0.9257, so the two
observations span 0.83 points -- wider than the MI35x per-test run-to-run sd of
about 0.0019, which is unsurprising given this recipe adds KV-FP8 and EAGLE on
top of what the MI35x test runs.

At that spread 0.91 sits roughly 2 sd below the mean, i.e. about one spurious
failure per forty nights on a job that now blocks check-all-jobs. 0.90 leaves
about 2 points of headroom and is over 3.5 sd out under either sd estimate.

It does not weaken the gate in any way that matters: the failure modes this
exists to catch collapse output entirely rather than costing a point of GSM8K.

Comparability with MI35x is preserved where it actually lives -- in the
measured numbers, MI300X 0.9174/0.9257 against MI35x 0.9189-0.9310 -- rather
than in a shared threshold.

Co-authored-by: quitenode <quitenode@users.noreply.github.com>
@HaiShaw
HaiShaw merged commit 1c8f2b3 into main Aug 27, 2026
107 of 120 checks passed
@HaiShaw
HaiShaw deleted the cursor/amd-nightly-mi30x-dsv4-flash-fp8-accuracy-d201 branch August 27, 2026 02:30
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.

4 participants