Skip to content

[AMD][MI325X] DSv4.1 Flash vLLM: re-sweep with --monokernel at TP4 and SWA bounded replay on the latest ROCm 10.0 nightly / [AMD][MI325X] DSv4.1 Flash vLLM:在最新 ROCm 10.0 nightly 上于 TP4 启用 --monokernel 与 SWA bounded replay 并重测 - #4617

Open
maeehart wants to merge 8 commits into
mainfrom
amd/dsv41flash-mi325x-vllm-monokernel

Conversation

@maeehart

Copy link
Copy Markdown
Collaborator

Re-sweeps the MI325X DeepSeek-V4.1-Flash vLLM DSpark AgentX recipe (dsv41flash-fp4-mi325x-vllm-agentic-dspark) on a ROCm 10.0 nightly that carries vllm-project/vllm#60731 (gfx942 mono decode), its fix vllm-project/vllm#63576, and vllm-project/vllm#59039 (decoder SWA bounded replay on ROCm).

Changes

  • Image v0.32.0 ([Klaud Cold] Update DeepSeek-V4.1-Flash FP4 MI325X vLLM AgentX DSpark image to v0.32.0 / [Klaud Cold] 将 DeepSeek-V4.1-Flash FP4 MI325X vLLM AgentX DSpark 镜像更新至 v0.32.0 #4496) to nightly-rocm100-edad8b03c5285a1c12e7e4f83c1af709b319a01b@sha256:009169c114af5b15e25eddc808afb3c1fc3f12c94e746472b16f39fcf39cd716, the 2026-10-28 ROCm 10.0 nightly. It is 162 commits past #63576 (9744ada58292), so it contains #60731 (1a74cc7bb24e), #63576 and #59039 (c077dc663d92). v0.32.0 (5df63a72) contains none of the three.
  • Add monokernel: true (--monokernel) to the six TP4 variants (override_tp4_c1 through override_tp4_c32). On gfx942 #60731 runs each backbone layer of a decode step as two persistent launches, and the routed-expert FFN of the three DSpark draft layers as one launch, for decode steps of up to 42 rows (7 requests with five DSpark drafts). Larger steps take the regular path. The gfx942 kernels build for TP4 only (mono_decode.py declines any other TP on gfx942), so the TP8 and TP2 variants stay without monokernel: true and change only by the image and by the removal of no-swa-bounded-replay: true. The upstream vLLM recipe turns --monokernel on for MI325X TP4 in vllm-project/vllm#62713.
  • Remove no-swa-bounded-replay: true, which turns on #59039's decoder SWA bounded replay at every point: in eager prefill steps (every prefill step here, since cudagraph_mode is FULL_DECODE_ONLY), layer 20 writes its KV for every token, and the rest of layer 20 and layers 21-39 run on each request's last 128 tokens only. Prefix-cache SWA replay, the path whose missing window clamp the flag worked around, stays off: vLLM still forces it off on ROCm.
  • Keep enable_adaptive_verification: false. With --monokernel on gfx942 the server faults during the adaptive-verification CUDA graph profile at startup until vllm-project/vllm#63816 merges.
  • Nothing else changes: concurrency 1-32 on TP8, TP4 and TP2 (18 points), Engram host offload at TP4 and TP2, FULL_DECODE_ONLY with VLLM_USE_BREAKABLE_CUDAGRAPH=0.
  • DSpark draft: vLLM builds it with the checkpoint's own quantization config (get_draft_quant_config) and the target's fp8_ds_mla KV cache, and its weights are used as shipped (FP8 E4M3 with 32x32 UE8M0 block scales, MXFP4 routed experts, BF16 norms and heads). On the TP4 variants --monokernel also runs the routed-expert FFN of the three draft layers as one launch, which quantizes the FFN input to MXFP8 against the same MXFP4 expert weights, as it does for the target layers, where vLLM's gfx942 MoE multiplies bf16 activations with them. The draft's weights, its KV cache and its attention are unchanged, and the target model's output does not depend on this launch, only how many drafts it accepts.

Validation

Five points of this entry at commit 3df335bfe629, through e2e-tests.yml on cluster:mi325x-amd, 3,600 s each, scored by InferenceX. The reference is the published v0.32.0 run of the same points (40183897667). Interactivity in tokens/s/user, throughput in total tokens/s per GPU.

Point v0.32.0 P50 / P90 / tput (40183897667) This PR P50 / P90 / tput (40718341529) This PR / v0.32.0
TP4 c1, --monokernel 216.8 / 188.3 / 4,019 504.8 / 477.2 / 6,870 2.33x / 2.53x / 1.71x
TP4 c4, --monokernel 195.2 / 157.6 / 6,299 494.4 / 307.4 / 9,190 2.53x / 1.95x / 1.46x
TP4 c8, --monokernel 149.1 / 92.3 / 11,293 372.1 / 208.2 / 15,325 2.50x / 2.26x / 1.36x
TP8 c1 236.1 / 209.8 / 2,146 249.0 / 233.6 / 2,270 1.05x / 1.11x / 1.06x
TP2 c1 185.8 / 121.9 / 6,851 192.7 / 148.3 / 7,511 1.04x / 1.22x / 1.10x

The three TP4 server logs show DSv4.1 mono decode layer active (decode steps of <= 42 rows), the FFN launch for the DSpark draft layers and Decoder SWA bounded replay, and no line that turns the kernels off. TP4 c8 has steps of 48 rows at full load, which take vLLM's path, and gains from the steps of up to 42 rows. TP8 and TP2 change only by the image and bounded replay. At most 2 request errors per point, as in the v0.32.0 run.

GSM8K at TP4 c4 with --monokernel, where every decode step runs on the mono path: 97.42% strict match (± 0.44%), 97.35% flexible extract, 1,319 samples (40718348873). The v0.32.0 sweep has 97.65% at TP8 c32. The full sweep of all 18 points follows with the sweep label.

For reviewers

AI model disclosure

Prepared through a model router that sends each request to Claude Opus 5.5 (Claude-Opus-5.5), Gemini 4 Argon (gemini-4-argon) or Grok 4.7 (Grok-4.7), whichever is up: the recipe, master-config and perf-changelog.yaml edits, the local matrix and changelog checks, and this description. The runtime does not record which of the three answered each step, so the model of each step could not be verified. Reviewed and edited by the author.

Move dsv41flash-fp4-mi325x-vllm-agentic-dspark from v0.32.0 to the
2026-10-28 ROCm 10.0 nightly edad8b03, which carries
vllm-project/vllm#60731, its fix #63576 and #59039. Turn on
--monokernel for the TP4 points and drop --no-swa-bounded-replay.

Signed-off-by: Markus Hartikainen <markus.hartikainen@amd.com>
Signed-off-by: Markus Hartikainen <markus.hartikainen@amd.com>
…-vllm-monokernel

# Conflicts:
#	inferencex-e2e/perf-changelog.yaml

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

Findings marked 🟡 are optional suggestions and need no follow-up push.

Comment thread inferencex-e2e/perf-changelog.yaml Outdated
- "Adaptive DSpark verification stays off. With --monokernel on gfx942 the server faults during its CUDA graph profile until vllm-project/vllm#63816 merges."
- "No point changes: concurrency 1, 2, 4, 8, 16 and 32 on TP8, TP4 and TP2 (18 points), all re-measured on the new image."
- "DSpark draft: vLLM builds it with the checkpoint's own quantization config and the target's fp8_ds_mla KV cache, and its weights are used as shipped (FP8 E4M3 with UE8M0 block scales, MXFP4 routed experts). On the TP4 points --monokernel also runs the routed-expert FFN of the three draft layers as one launch. That launch quantizes the FFN input to MXFP8 against the same MXFP4 expert weights, as it does for the target layers, where vLLM's gfx942 MoE multiplies bf16 activations with them. The draft weights, its KV cache and its attention are unchanged, and the target model's output does not depend on this launch, only how many drafts it accepts."
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXXX

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.

🔴 Readers of the changelog get a pr-link to pull/XXXX, which leads nowhere, so this entry cannot be traced back to its PR. The new block at the end of the file still has the placeholder. Fix: replace https://github.com/SemiAnalysisAI/InferenceX/pull/XXXX with this PR's real number before merge. Edit only that line, because the file is append-only and byte-sensitive.

Why this was flagged

The appended block for config key dsv41flash-fp4-mi325x-vllm-agentic-dspark ends with pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXXX (perf-changelog.yaml:11504). Every earlier entry links to a real PR, for example pull/4571 just above it. The file is append-only, so after merge a fix would need another change to an existing byte. Until then, anyone following the link from the published perf history lands on a 404. On the base branch the file has no such placeholder.

Verification: Trigger: the PR merges with the appended block as written. The diff adds pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXXX as the last line of the new block in inferencex-e2e/perf-changelog.yaml, and the base file has no such placeholder. It uses four X's, and the repo's tooling only accepts three, per validate_perf_changelog.py:21-24.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Fixed in e4a3323. The pr-link of the new block is https://github.com/SemiAnalysisAI/InferenceX/pull/4617. The review read 3df335b, which still had the placeholder.

args:
tensor-parallel-size: 4
engram-config: '{"cpu_offload":true}'
monokernel: true

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.

🟡 (optional) The automatic GSM8K for this config never runs the new TP4 mono decode path. Its accuracy is unchecked on this sweep and on every later image bump. The kernel is switched by the CLI arg monokernel: true, not an env var. Agentic GSM8K groups split only on engine env, so TP4 shares one group with TP8 and TP2. That group's single pick is TP8 c32. Fix: have the automatic eval cover a TP4 point whose decode steps stay within 42 rows (e.g. c4). Either split mark_eval_entries groups on kernel-selecting args like monokernel (code outside these files), or schedule that eval with this sweep.

Why this was flagged

The agentic GSM8K pick in infx/matrix/generate.py:802-815 groups single-node rows by model, runner, framework, precision, spec, dp-attn, image and _engine_env. Only the max-conc row of each group runs GSM8K. engine_environment (infx/matrix/fingerprint.py:96-101) hashes only recipe environment and role env, never role args. infx/evals/EVALS.md:21-26 says a kernel path switched by an env var gets its own eval, but "CLI args" do not split groups. The TP4 overrides add monokernel: true as an arg (agentic.yaml:144, 156, 168, 180, 192, 204) and leave env equal to TP8 and TP2. So all 18 points form one group, and the pick is the first conc-32 row, TP8 c32 (amd-master.yaml:1194). The PR description says the mono FFN launch quantizes activations to MXFP8 where the regular gfx942 MoE uses bf16. On the base branch no point ran a mono kernel, so the shared eval covered every kernel path. After the merge, TP4's mono path gets no automatic accuracy check. The author's one-off TP4 c4 GSM8K run does not carry over to later image bumps of this config key.

Verification: The automatic agentic GSM8K never runs on the TP4 --monokernel path. engine_environment (infx/matrix/fingerprint.py:95-102) serializes only the recipe-wide environment and each role's env. Role args never enter it. monokernel: true is added under roles.agg.args (agentic.yaml:144), so all 18 points fall into one group and infx/matrix/generate.py:815 picks TP8 c32.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Not changed in this PR, on purpose. Two reasons.

The grouping of the agentic GSM8K is shared code in infx/matrix/generate.py (mark_eval_entries), and #4587 changed it two days ago to split groups by engine environment. Splitting on kernel-selecting server arguments such as monokernel changes the eval picks of every config key that sets such an argument, the MI355X DeepSeek-V4.1-Flash entry included, which has monokernel: true on all its points. That belongs in its own PR with its own review, not in an image and flag update of one entry.

This PR does have a GSM8K run on the mono path: TP4 c4 with --monokernel, where every decode step runs on the mono kernels, 97.42% strict match on 1,319 samples (run 40718348873). The accuracy checks of the kernels themselves are in vllm-project/vllm#60731 (3 GSM8K runs per arm at TP4 c7, GPQA-Diamond, AIME25 and RULER NIAH). I agree that a later image update of this entry would not check the mono path again, and I will open a separate issue or PR for the eval grouping if the maintainers want it.

Comment on lines +67 to +70
# and stops capturing above 512 tokens. TP4 runs the gfx942 mono decode kernels
# (vllm-project/vllm#60731), which build for TP4 only: two persistent launches a
# layer for decode steps of up to 42 rows (7 requests with five drafts). Larger
# steps take the regular path.

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.

🟡 nit (optional): The new TP4 sentences grow a section-header comment over the override variants. AGENTS.md (Comments) does not allow header comments that describe an override or section. They describe what #60731 does in general, not why a particular line is set. Fix: drop them, or put a single short line above the first monokernel: true (override_tp4_c1) saying the gfx942 mono decode kernels build for TP4 only (vllm-project/vllm#60731).

Why this was flagged

The diff adds four lines (agentic.yaml:67-70) to the comment above override_tp8_c1. They explain the TP4 mono decode kernels: two persistent launches per layer, at most 42 rows, and that larger steps take the regular path. AGENTS.md's mandatory Comments rule bans header comments that describe a file, config, recipe, override or section, and allows only a short technical reason attached to a specific line. Nothing breaks at runtime. The issue is that the repo's comment convention is broken in a file the PR changes.

Verification: Nothing breaks at runtime. The diff adds agentic.yaml:67-70 to the section-header comment at line 65, above override_tp8_c1, far from the monokernel: true lines it explains (lines 144-204). AGENTS.md:56 says "No header comments describing a file, topology, config, recipe, override, or section." The new sentences describe #60731 in general, not a specific line.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Fixed in 7c37502. The four lines above override_tp8_c1 are removed, and one line above the first monokernel: true in override_tp4_c1 says that the gfx942 mono decode kernels build for TP4 only (vllm-project/vllm#60731). The change is in a comment only, and the 18 generated rows, recipe fingerprints included, are the same as before.

… flag

AGENTS.md allows no comments that describe an override section, so the
four lines above override_tp8_c1 become one line above the first
monokernel: true. Comment only, the recipe fingerprints are unchanged.

Signed-off-by: Markus Hartikainen <markus.hartikainen@amd.com>
@chunfangamd chunfangamd added the full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended) label Oct 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

@chunfangamd

Copy link
Copy Markdown
Collaborator

/reuse-sweep-run 40744174186

@chunfangamd

Copy link
Copy Markdown
Collaborator

vllm-project/vllm#62713

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

As a PR reviewer and CODEOWNER, I have reviewed this and have:

  • Verified that as of the moment of typing this, this is the latest version of PR_REVIEW_CHECKLIST.md
  • Verified that the general code quality meets the InferenceX standard and does not make the code quality any worse.
  • Verified that this PR has passed PR validation. Please link to GitHub Action workflow that shows this. https://github.com/SemiAnalysisAI/InferenceX/actions/runs/40744174186
  • Verified that this PR passes evals. Please link to GitHub Action workflow that shows this. https://github.com/SemiAnalysisAI/InferenceX/actions/runs/40744174186
  • Verified that speculative decoding PRs uses chat templates to align the AL distribution to real world
  • Verified that every draft model and draft head is served as it ships: the draft that ships with the served checkpoint, at its stored precision, through the pinned upstream image's default handling, with the shipped and effective draft precision recorded in the additional detail section. No submission-side quantization, dtype override, checkpoint substitution, or patch may lower draft precision below that default, regardless of eval results or AL. Explicitly verified that SGLANG_NVFP4_CKPT_FP8_NEXTN_MOE is not enabled in the effective recipe, including inherited settings; enabling it is prohibited going forward, and historical runs do not grant an exception. See Draft-model precision for what counts as the default and the MLPerf comparison.
  • For agentic workloads: verified that speculative-decoding configs (EAGLE / MTP / draft models) run with simulated synthetic acceptance, with the acceptance-length value taken from the committed golden AL curve in infx/golden_al_distribution/ for that model, thinking mode, and draft length. A submission may choose any supported draft length, but it may not substitute a different acceptance target.
  • Verified against the current MODELS.md that this PR does not submit a deprecated model, scenario, or model-scenario combination.
  • Verified that the model architecture isn't changed with benchmark hacks like using --hf-overrides to skipping indexer for every x layers on models that don't natively support this. As a general rule, we won't accept optimizations that reduces the number of model architecture FLOPs. Anything that makes that same computation run faster is fair game; target/verifier FLOPs at lower precisions is fine, given that the config passes private evals, but this does not permit lowering draft-model or draft-head precision below what ships. As an general north star princple, we should only use optimizations which is used in production by customers that care about accuracy
  • Verified that new models disable integer all-reduce, with SGLang ROCm explicitly setting ROCM_QUICK_REDUCE_QUANTIZATION=NONE. Existing models are grandfathered per MODELS.md.
  • For affected Dynamo TRT-LLM benchmarks, verified that iteration/KV-cache metrics are collected and published under the pinned Dynamo implementation and effective engine settings. Resolve the installed Dynamo version separately from the container tag; use supported metrics controls without requiring KV events. Record the version and configuration evidence in the additional detail section. See verifier Check 17. N/A for unaffected serving paths or frameworks without these Dynamo settings.
  • If an company claims that they support vLLM/SGLang as first class LLM inference engines on their hardware, I have verified that the respective vLLM submission made using upstream https://hub.docker.com/u/vllm docker repo, upstream SGLang https://hub.docker.com/u/lmsysorg docker repo. The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet as supported by vLLM/SGLang community maintainers
  • For official InferenceX (non-preview), verified that established models use upstream engine images built from master (or the equivalent default development branch), with new models transitioning within a reasonable time after release. See MODELS.md.
  • If an company claims that they support vLLM/SGLang as first class upstream in-tree LLM inference engines on their hardware, I have have verified that the respective vLLM/SGLang submission has been made before additional frameworks (TRT-LLM, ATOM, etc.). The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet.
  • Verified that every affected vLLM/SGLang production serving configuration in this PR, including Dynamo deployments, is documented in the official vLLM recipes and/or the SGLang cookbook, for both single-node and multi-node aggregated and disaggregated serving. The documentation covers production-useful flags, environment variables, and launch commands (including prefill, decode, and router/frontend commands for disaggregation); InferenceX-only benchmark/harness settings are excluded with reasoning in the additional detail section:
    • I linked the corresponding upstream PR in the vLLM recipe repo or SGLang cookbook source repo and verified that it is MERGED before this InferenceX PR merges. An opened, draft, or closed-without-merge upstream PR does not satisfy this requirement. If the matching recipe was already published, I linked the published recipe/cookbook page in the additional detail section below.
  • Verified that this PR does not patch the inference engine or serving stack — the pinned image must run as shipped. This covers .patch files / git apply / patch, inline patches embedded in benchmark scripts (e.g. a python3/sed heredoc that rewrites installed engine sources before serving), in-place edits of site-packages, monkey-patching, overwriting container files, and installing forked/rebuilt engine wheels on top of the pinned image. The only exception is a patch covered by a filled-out waiver at docs/waiver/<PR_NUMBER>.md — named after the PR that introduces the patch and filed in that same PR, stating what is patched, why the unmodified upstream image cannot run this benchmark, the upstream PR/issue link, and the removal plan — which I have linked below in the additional detail section.
  • If this PR uses append-only: true, verified that it only adds generated points or recipe variants inside a selected existing config/scenario and existing same-image visual curve: every previously generated point remains present with the same recipe, no prior point is removed or rerun, and every benchmark-affecting change in the complete diff can affect only the corresponding newly appended points (never an existing point), regardless of which file contains it.
  • If any of the above criteria cannot reasonably be satisfied, I have provided additional reasoning below.
  • Reported measured throughput/E2EL Pareto counts and evidence per affected curve (≥5 points strongly recommended). Below 5 or unverifiable: tag a core maintainer for review; recorded admin bypass required before merge. N/A if no curves are affected. Details.

Additional detail section:

Signed: @chunfangamd

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

@chunfangamd plz update the vllm recipes using the new way for agentx optmized configs also!

as i mentioned in slack, upstream maintainers have an new way to update recipes in vLLM for agentx. going forward plz point ur agents to look at these PRs on how to do it. plz forward to whoever at AMD is updating vLLM recipes

https://github.com/vllm-project/recipes/pull/1162/changes
https://github.com/vllm-project/vllm/pull/63560/changes

@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

❌❌❌ REJECTED ❌❌❌

@chunfangamd Two checks block this sign-off. On the six TP4 --monokernel points, the DSpark draft's routed-expert FFN runs with MXFP8 activations, below the shipped bf16 baseline. This verifier also could not confirm from logs that the TP4 eval ran the mono path. The upstream recipe gap from the previous verdict is resolved by the merged vllm-project/vllm#64589.

❌ Check 2 (Evals pass): FAIL — No eval log that this verifier could inspect shows that the TP4 --monokernel path ran. The GSM8K scores pass: the sweep's TP8 c32 eval (40744174186, 7c37502) scored 97.42% vs the cohort's 97.65% (gap 0.23 pts, 2σ bound 1.21 pts), and the TP4 c4 eval (40919069311, c8befe0, same image and recipe) scored 97.50% ± 0.43%. However, that job's log shows only the --monokernel launch argument. The DSv4.1 mono decode ... active and bounded-replay lines quoted in this comment are inside srt-single-node-logs.tar.gz, which this verifier run was not permitted to extract. A core maintainer must confirm those lines in that artifact.

❌ Check 13 (Draft precision): FAIL — The six TP4 points (override_tp4_c1–c32, monokernel: true in dsv41flash/vllm/mi325x-fp4-mtp/agentic.yaml at 92aa1fb) run the routed-expert FFN of the three DSpark draft layers with inputs quantized to MXFP8. The pinned image's default gfx942 path keeps those inputs bf16. The sources are vllm#60731 ("The path is opt-in with --monokernel"; "The mono kernels quantize the activations to MXFP8, where vLLM's gfx942 path keeps bf16"; the draft layers take the FFN launch), this PR's own changelog entry, and the upstream preset's runbook, which leaves the draft-precision question "unresolved". An opt-in setting that lowers draft activation precision is forbidden, and passing evals, AL, or an upstream recipe do not exempt it. The sign-off also does not record the shipped or effective draft precision. Remove --monokernel from the TP4 points, or show that the draft FFN stays bf16.

Passed and not applicable checks

✅ Check 0 (CODEOWNER): PASS — @chunfangamd is a listed owner of inferencex-e2e/configs/amd-master.yaml and of /inferencex-e2e/benchmarks/*_node/srt-slurm-recipes/**/mi325x-*/. perf-changelog.yaml falls only under the catch-all.

✅ Check 1 (In-PR sweep): PASS — In-PR commit 7c37502 has 18/18 agentic / jobs and agentic eval / green in 40744174186 on the PR image. The later merges (c8befe0, 6e1386c, 92aa1fb) leave the recipe blob (b96b95e) and the master entry unchanged. The base changes they bring in (launcher lanes and overrides for other models, the matrix retired field, the srt-slurm ae3d687→59920ea sidecar, TRT-LLM, topology, and opt-in container-reuse changes) do not reach this single-node direct-vLLM agg path.

✅ Check 3 (Upstream recipe): PASS — vllm-project/vllm#64589 is MERGED (2026-11-02T17:46Z). It adds the mi325x_agentx preset with all 18 TP8/TP4/TP2 points, the pinned image, --monokernel on TP4 only, per-topology Engram offload, the TP2 budgets for max-num-seqs, max-num-batched-tokens and max-cudagraph-capture-size, the DSpark config and FULL_DECODE_ONLY. The recipe's AMD and MI325X overrides supply --moe-backend aiter, --gpu-memory-utilization 0.9, the AITER environment variables and VLLM_USE_BREAKABLE_CUDAGRAPH=0. The runbook documents synthetic AL 3.51 as an InferenceX-only control.

✅ Check 4 (Reuse command): PASS — /reuse-sweep-run 40744174186 was posted by chunfangamd (COLLABORATOR) on 2026-10-28.

✅ Check 5 (Checklist template): PASS — All 20 items of the current template are present and checked.

✅ Check 6 (Upstream image): PASS — The image vllm/vllm-openai-rocm is from the upstream vLLM org, and nightly commit edad8b03 is an ancestor of vLLM main. The entry is vLLM only, so engine-first ordering does not apply.

✅ Check 7 (Deprecated models): PASS — dsv41flash agentic coding is active in MODELS.md.

✅ Check 8 (No architecture hacks): PASS — The recipe sets no --hf-overrides and makes no model edits. Decoder SWA bounded replay is the image's default, and the TP8 eval covers it. dsv41flash is in the baseline matrix at 2a45791, so it is grandfathered, and no quick-reduce control is set.

✅ Check 9 (Chat templates): PASS — The AgentX harness replays traces through chat completions with the deepseek_v41 tokenizer mode.

✅ Check 10 (No engine patches): PASS — No patches, setup scripts, or source edits are reachable from this recipe.

✅ Check 11 (Golden AL): PASS — Throughput jobs set synthetic_acceptance_length: 3.51 (job 123014169077), which matches dsv41flash_dspark.yaml thinking_on with k=5.

➖ Check 12 (Append-only): N/A — No new changelog entry uses append-only: true.

✅ Check 14 (Pareto coverage): PASS — The curve dsv41flash/agentic-coding/mi325x vLLM/fp4/P90 E2EL from 40744174186 (7c37502, bmk_agentic_*) has 5/5 frontier points: TP4 c8, TP4 c16, TP2 c16, TP4 c32 and TP2 c32, counted by pareto_coverage.

✅ Check 15 (PR description): PASS — The image, flag scope, removed flag, 18 points, run links and eval figures match the pinned code and the inspected runs.

➖ Check 16 (NVIDIA overview): N/A — MI325X is AMD hardware only.

➖ Check 17 (Metrics publication): N/A — This is direct vLLM with no Dynamo TRT-LLM.

✅ Check 18 (Recipe consistency): PASS — Generation succeeds, the master TP8/4/2 matches the recipe gpus, the digest resolves, and the changelog states the image, the flag changes and the MXFP8 draft-FFN input. No undominated points were removed. Re-tune deltas: TP4 +33–71% tput and +69–148% intvty; TP8 +4–18% and +9–52%; TP2 +2–27% and +9–50%.

Assessed commit: 92aa1fb282c938f2f8f5e699516b6c147ca6e226.

@maeehart

Copy link
Copy Markdown
Collaborator Author

Check 2 evidence, on the current head c8befe0ed1f0.

I ran the entry's TP4 c4 eval-only job again on this head, where --monokernel is set and every decode step is on the mono kernels: run 40919069311, job agentic eval / ... TP4 mtp c4 | eval-only.

GSM8K strict match 0.97498 ± 0.0043, flexible extract 0.97422, 1,319 samples. The TP8 c32 eval of the sweep is 0.97422.

The server log of that job (eval_server_logs_... artifact, srt-single-node-logs.tar.gz) contains these lines:

DSv4.1 mono decode: the whole standard backbone layers
DSv4.1 mono decode: the FFN launch for the DSpark draft layers (128 / 3 routing)
DSv4.1 mono decode layer active (decode steps of <= 42 rows)
DSv4.1 mono decode FFN launch active (decode steps of <= 42 rows)
Decoder SWA bounded replay: in eager prefill steps, layer 20 writes its KV for every token, and the rest of it and layers 21-39 run on each request's last 128 tokens only

So the accuracy number in this job comes from a server that ran the mono kernels on the target layers and on the DSpark draft layers' FFN, with decoder SWA bounded replay on.

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

As a PR reviewer and CODEOWNER, I have reviewed this and have:

  • Verified that as of the moment of typing this, this is the latest version of PR_REVIEW_CHECKLIST.md
  • Verified that the general code quality meets the InferenceX standard and does not make the code quality any worse.
  • Verified that this PR has passed PR validation. Please link to GitHub Action workflow that shows this. https://github.com/SemiAnalysisAI/InferenceX/actions/runs/40744174186
  • Verified that this PR passes evals. Please link to GitHub Action workflow that shows this. https://github.com/SemiAnalysisAI/InferenceX/actions/runs/40744174186
  • Verified that speculative decoding PRs uses chat templates to align the AL distribution to real world
  • Verified that every draft model and draft head is served as it ships: the draft that ships with the served checkpoint, at its stored precision, through the pinned upstream image's default handling, with the shipped and effective draft precision recorded in the additional detail section. No submission-side quantization, dtype override, checkpoint substitution, or patch may lower draft precision below that default, regardless of eval results or AL. Explicitly verified that SGLANG_NVFP4_CKPT_FP8_NEXTN_MOE is not enabled in the effective recipe, including inherited settings; enabling it is prohibited going forward, and historical runs do not grant an exception. See Draft-model precision for what counts as the default and the MLPerf comparison.
  • For agentic workloads: verified that speculative-decoding configs (EAGLE / MTP / draft models) run with simulated synthetic acceptance, with the acceptance-length value taken from the committed golden AL curve in infx/golden_al_distribution/ for that model, thinking mode, and draft length. A submission may choose any supported draft length, but it may not substitute a different acceptance target.
  • Verified against the current MODELS.md that this PR does not submit a deprecated model, scenario, or model-scenario combination.
  • Verified that the model architecture isn't changed with benchmark hacks like using --hf-overrides to skipping indexer for every x layers on models that don't natively support this. As a general rule, we won't accept optimizations that reduces the number of model architecture FLOPs. Anything that makes that same computation run faster is fair game; target/verifier FLOPs at lower precisions is fine, given that the config passes private evals, but this does not permit lowering draft-model or draft-head precision below what ships. As an general north star princple, we should only use optimizations which is used in production by customers that care about accuracy
  • Verified that new models disable integer all-reduce, with SGLang ROCm explicitly setting ROCM_QUICK_REDUCE_QUANTIZATION=NONE. Existing models are grandfathered per MODELS.md.
  • For affected Dynamo TRT-LLM benchmarks, verified that iteration/KV-cache metrics are collected and published under the pinned Dynamo implementation and effective engine settings. Resolve the installed Dynamo version separately from the container tag; use supported metrics controls without requiring KV events. Record the version and configuration evidence in the additional detail section. See verifier Check 17. N/A for unaffected serving paths or frameworks without these Dynamo settings.
  • If an company claims that they support vLLM/SGLang as first class LLM inference engines on their hardware, I have verified that the respective vLLM submission made using upstream https://hub.docker.com/u/vllm docker repo, upstream SGLang https://hub.docker.com/u/lmsysorg docker repo. The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet as supported by vLLM/SGLang community maintainers
  • For official InferenceX (non-preview), verified that established models use upstream engine images built from master (or the equivalent default development branch), with new models transitioning within a reasonable time after release. See MODELS.md.
  • If an company claims that they support vLLM/SGLang as first class upstream in-tree LLM inference engines on their hardware, I have have verified that the respective vLLM/SGLang submission has been made before additional frameworks (TRT-LLM, ATOM, etc.). The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet.
  • Verified that every affected vLLM/SGLang production serving configuration in this PR, including Dynamo deployments, is documented in the official vLLM recipes and/or the SGLang cookbook, for both single-node and multi-node aggregated and disaggregated serving. The documentation covers production-useful flags, environment variables, and launch commands (including prefill, decode, and router/frontend commands for disaggregation); InferenceX-only benchmark/harness settings are excluded with reasoning in the additional detail section:
    • I linked the corresponding upstream PR in the vLLM recipe repo or SGLang cookbook source repo and verified that it is MERGED before this InferenceX PR merges. An opened, draft, or closed-without-merge upstream PR does not satisfy this requirement. If the matching recipe was already published, I linked the published recipe/cookbook page in the additional detail section below.
  • Verified that this PR does not patch the inference engine or serving stack — the pinned image must run as shipped. This covers .patch files / git apply / patch, inline patches embedded in benchmark scripts (e.g. a python3/sed heredoc that rewrites installed engine sources before serving), in-place edits of site-packages, monkey-patching, overwriting container files, and installing forked/rebuilt engine wheels on top of the pinned image. The only exception is a patch covered by a filled-out waiver at docs/waiver/<PR_NUMBER>.md — named after the PR that introduces the patch and filed in that same PR, stating what is patched, why the unmodified upstream image cannot run this benchmark, the upstream PR/issue link, and the removal plan — which I have linked below in the additional detail section.
  • If this PR uses append-only: true, verified that it only adds generated points or recipe variants inside a selected existing config/scenario and existing same-image visual curve: every previously generated point remains present with the same recipe, no prior point is removed or rerun, and every benchmark-affecting change in the complete diff can affect only the corresponding newly appended points (never an existing point), regardless of which file contains it.
  • If any of the above criteria cannot reasonably be satisfied, I have provided additional reasoning below.
  • Reported measured throughput/E2EL Pareto counts and evidence per affected curve (≥5 points strongly recommended). Below 5 or unverifiable: tag a core maintainer for review; recorded admin bypass required before merge. N/A if no curves are affected. Details.

Additional detail section:

@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

❌❌❌ REJECTED ❌❌❌

@chunfangamd Blocking: on the TP4 points, --monokernel runs the DSpark draft FFN with FP8 activations instead of the pinned image's default BF16 activations, so the draft is served below its shipped precision (Check 13).

❌ Check 13 (Draft precision): FAIL — --monokernel lowers DSpark draft FFN activations below the pinned default. The setting is monokernel: true on override_tp4_c1…override_tp4_c32 of dsv41flash-fp4-mi325x-vllm-agentic-dspark (agentic.yaml:142). Without the flag, the pinned image runs the draft's MXFP4 routed experts through AITER_MXFP4_BF16 with BF16 activations (mono_decode.py:265). With it, the DSpark draft layers take the mono FFN launch (L24-25), which computes with FNUZ FP8 MFMAs (L69) on MXFP8-quantized inputs. The PR body, the changelog, the Check 13 A/B comment and the upstream preset (vllm#64589: "quantizes DSpark draft FFN inputs from BF16 to MXFP8 … qualification remains unresolved") all confirm this. The paired A/B evals and AL do not exempt it under the rule. To fix, keep the draft FFN on the default BF16-activation path (or drop --monokernel at TP4), then re-sweep.

Passed and not applicable checks

✅ Check 0 (CODEOWNER): PASS — @chunfangamd is listed for inferencex-e2e/configs/amd-master.yaml and srt-slurm-recipes/**/mi325x-*/. That also covers perf-changelog.yaml, whose only owner is the catch-all.

✅ Check 1 (Sweep on in-PR commit): PASS — run 40744174186 ran on in-PR commit 7c375027a3cd with all 18 agentic / jobs and the agentic eval / job at success. The later merges (c8befe0, 6e1386c, 92aa1fb, ef98be1) leave the recipe, the master entry and the changelog entry unchanged. Their launcher edits and the srt-slurm ae3d687→96f1111 bump do not reach this single-node vLLM lane (tachometer is disabled in the recipe; sidecar, reuse-container and DP-metrics changes do not apply).

✅ Check 2 (Evals): PASS — In run 40744174186, TP8 c32 GSM8K scored 0.9742 ± 0.0044 on the pinned image, a gap of 0.0023 against the 0.9765 exact cohort (threshold 0.0121). The supplemental TP4 c4 --monokernel eval (40919069311, c8befe0, same recipe) scored 0.9750. Its server log shows DSv4.1 mono decode FFN launch active and mono decode layer active with 4 running requests, so the changed path ran.

✅ Check 3 (Upstream recipe): PASS — vllm-project/vllm#64589 is MERGED (2026-11-02). It adds the mi325x_agentx preset to recipes/models/deepseek-ai/DeepSeek-V4.1-Flash.yaml with the pinned image, TP8/TP4/TP2 points, --monokernel at TP4 only, Engram offload per TP, the speculative and compilation configs, and the scheduler/graph budgets. The base AMD section supplies --moe-backend aiter, the AITER environment variables and MI325X VLLM_USE_BREAKABLE_CUDAGRAPH=0. The golden-AL substitution is correctly excluded as InferenceX-only.

✅ Check 4 (Reuse command): PASS — COLLABORATOR chunfangamd posted /reuse-sweep-run 40744174186.

✅ Check 5 (Checklist template): PASS — all 20 items of the current template are present and checked.

✅ Check 6 (Upstream image): PASS — vllm/vllm-openai-rocm:nightly-rocm100-edad8b03… is upstream vLLM, and edad8b03 is an ancestor of vllm main. This is a vLLM-only entry, so the engine-first ordering rule does not apply.

✅ Check 7 (Deprecated models): PASS — dsv41flash agentic coding is active in MODELS.md.

✅ Check 8 (Architecture hacks): PASS — no hf-overrides or config edits. Decoder SWA bounded replay is the pinned image's default and skips only unused upper-layer prefill rows. The TP8 and TP4 evals cover the configs. dsv41flash is grandfathered for integer all-reduce, and the pinned VLLM_ROCM_QUICK_REDUCE_QUANTIZATION default is NONE in any case.

✅ Check 9 (Chat templates): PASS — the AgentX trace replay drives the chat endpoint, and evals use local-chat-completions with --apply_chat_template.

✅ Check 10 (Engine patches): PASS — the PR changes only YAML args, image and changelog. No reachable patch, setup script or wheel install.

✅ Check 11 (Golden AL): PASS — the connector injected "rejection_sample_method": "synthetic", "synthetic_acceptance_length": 3.51 (job log, run 40744174186). This matches the golden dsv41flash_dspark.yaml value for thinking_on with 5 tokens and probabilistic drafting.

➖ Check 12 (Append-only): N/A — the new changelog entry is not append-only.

✅ Check 14 (Pareto coverage): PASS — the single curve (dsv41flash / agentic-coding / MI325X vLLM / fp4 / run 40744174186 / p90 E2EL) has 5 frontier points of 18 measured. They are TP4 c8, TP4 c16, TP2 c16, TP4 c32 and TP2 c32, taken from the bmk_agentic_* artifacts with source SHA 7c375027 on the pinned image.

✅ Check 15 (PR description): PASS — the image, flags, removed option, 18-point scope, adaptive-verification state and labeled validation runs (3df335bf / 40718341529, 40718348873) match the code and evidence.

➖ Check 16 (NVIDIA overview): N/A — AMD MI325X only.

➖ Check 17 (Metrics publication): N/A — plain vLLM, with no Dynamo TRT-LLM path.

✅ Check 18 (Recipe/image consistency): PASS — the config generates at head, master TP matches recipe GPUs, and the image digest resolves. No orchestration pins or dispatch changes. The changelog accurately describes the image, --monokernel, the bounded-replay removal and the MXFP8 draft-FFN input. No undominated points were removed. Re-tune deltas: TP4 +33–71% tput and +69–148% intvty; TP8 +4–18% and +9–52%; TP2 +2–27% and +9–50%.

Assessed commit: ef98be128424b53a129f6f1a290def50ffee29d4.

@chunfangamd

Copy link
Copy Markdown
Collaborator

@maeehart

maeehart commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator Author

No accuracy difference shows between the two arms. Every paired difference is within run-to-run variation: the 95% intervals for tau2-bench, HLE and MRCR all contain zero, and the acceptance length, where a change in draft precision would show first, moves by 0.02 (0.6%).

Paired accuracy A/B for Check 13 (draft precision), on MI325X with the pinned image vllm/vllm-openai-rocm:nightly-rocm100-edad8b03c5285a1c12e7e4f83c1af709b319a01b. Both arms run this entry's TP4 server command with real DSpark block verification. The only difference between the arms is --monokernel, which sends the DSpark draft layers' FFN input through MXFP8.

Eval With --monokernel Without Paired difference, 95% CI
SPEED-Bench qualitative, coding, acceptance length (80 prompts, thinking on) 3.59 3.61 -0.02
SPEED-Bench qualitative, coding, acceptance rate 51.82% 52.25% -0.43 pt
tau2-bench airline, mean reward (50 tasks x 3 trials) 0.880 0.847 +0.033 [-0.020, +0.093]
tau2-bench airline, pass^1 / pass^2 / pass^3 0.880 / 0.840 / 0.820 0.847 / 0.800 / 0.760
HLE, text-only (2,158 questions) 17.38% 17.93% -0.56 pt [-1.90, +0.79], McNemar p 0.45
MRCR, 8 needles, 537K to 1.04M tokens (98 rows) 0.247 0.280 -0.033 [-0.085, +0.015]
  • SPEED-Bench per-position acceptance, positions 0 to 4: 81.8 / 64.1 / 48.9 / 36.8 / 27.5% with --monokernel and 82.8 / 64.8 / 49.2 / 36.8 / 27.6% without.
  • tau2-bench had 0 agent errors and 0 user errors in both arms.
  • HLE is graded judge-free (exact match, or the multiple-choice letter) with a 32K output cap, as in [ROCm][DP] QuickReduce combine for allgather/reducescatter MoE vllm-project/vllm#64428, so the absolute score is below judged leaderboard numbers. 102 questions were correct only with --monokernel and 114 only without. Both arms hit the cap on 611 and 613 questions.
  • MRCR follows the dataset card's grading, at temperature 0 with thinking off. 65 of the 98 rows score the same in both arms.
  • GSM8K with --monokernel at TP4 c4 is 97.50% (run 40919069311).

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended)

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

3 participants