[AMD][CI] Add DeepSeek-V4-Flash FP8 accuracy coverage on MI30x - #36396
Merged
HaiShaw merged 6 commits intoAug 27, 2026
Merged
Conversation
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>
5 tasks
…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>
5 tasks
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>
michaelzhang-ai
marked this pull request as ready for review
August 26, 2026 02:15
michaelzhang-ai
requested review from
Fridge003,
HaiShaw,
Kangyan-Zhou,
bingxche,
ispobock and
merrymercy
as code owners
August 26, 2026 02:15
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
approved these changes
Aug 27, 2026
HaiShaw
deleted the
cursor/amd-nightly-mi30x-dsv4-flash-fp8-accuracy-d201
branch
August 27, 2026 02:30
5 tasks
saturn-acc
pushed a commit
to saturn-acc/sglang
that referenced
this pull request
Aug 31, 2026
nzr-niu
pushed a commit
to nzr-niu/sglang
that referenced
this pull request
Sep 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 commentedMI35x only. Meanwhile the cookbook publishes threeverified: trueMI300X 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-v31andnightly-8-gpu-deepseek-v3-kv-fp8do not test what their names say — both servedeepseek-ai/DeepSeek-V3-0324for accuracy, and only the v31 perf step serves V3.1. Every MI30x path they exercise (aiter MLA, EAGLE MTP,enable_multithread_load, bs=1send_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-flashonlinux-mi300-8gpu-sglang, running the newtest/registered/amd/test_deepseek_v4_flash_fp8_mi30x.pyvia the newnightly-amd-accuracy-8-gpu-deepseek-v4-flashsuite.The launch config is the cookbook's
mi300x | flash | fp8 | low-latency | singlecell 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.90floor. Blocking incheck-all-jobs.Depends on #36405: the cell as published omits
SGLANG_DSV4_FP4_EXPERTS=0and 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-rocm720andnightly-8-gpu-deepseek-v3-kv-fp8-rocm720, with theirjob_selectoptions andcheck-all-jobsneeds. All four test files stay registered, so the three suites remain reachable fromworkflow_dispatch— the same outcome #34761 documented fornightly-amd-accuracy-8-gpu-grok1-fp8.MLA + KV-FP8 on gfx942 stays gated rather than lost: the cookbook recipe runs
--kv-cache-dtype fp8_e4m3and 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 aiterwith--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=rocm720andcontinue_on_error=falseso a failure is loud, both green: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:
pre-commitpasses, includingcheck for duplicate workflow job names,validate registered test CI registriesandcheck yamlmainis exactly-nightly-8-gpu-deepseek-v31-rocm720,-nightly-8-gpu-deepseek-v3-kv-fp8-rocm720,+nightly-8-gpu-deepseek-v4-flash-rocm720(46 jobs to 45); no danglingjob_selectoption orcheck-all-jobsneed, and no removed job referenced anywhere in the repomainSpeed Tests and Profiling
Measured from run 32757901075, summed over both image flavors: dropping
nightly-8-gpu-deepseek-v31frees 17.4 GPU-h/night andnightly-8-gpu-deepseek-v3-kv-fp8frees 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