Repository navigation
feat(amd): restore DSv4.1-Flash ATOM AgentX on srt-slurm with 1007 nightly / 以 srt-slurm 恢复 DSv4.1-Flash ATOM AgentX 并更新至 1007 nightly - #3603
Conversation
…ghtly Port dsv41flash-fp4-mi355x-atom-agentic-dspark (#3387) to a native srt-slurm recipe after #3461/#3463 removed its bash script and config, and pin rocm/atom-dev:nightly_202609291501. Points and server settings follow the unchanged upstream ATOM recipe; the golden AL comes from the synthetic-acceptance connector instead of the recipe. 将 dsv41flash-fp4-mi355x-atom-agentic-dspark(#3387)迁移为原生 srt-slurm 配方(旧脚本和配置已在 #3461/#3463 中删除),并固定 rocm/atom-dev:nightly_202609291501。测试点与服务参数沿用未变的 ATOM 上游配方; golden AL 由 synthetic-acceptance 连接器注入,不在配方中硬编码。 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Thanks for the contribution!
中文感谢你的贡献!
|
|
View unofficial run (performance): https://inferencex.semianalysis.com/inference?unofficialRun=37721285904 View unofficial run (accuracy): https://inferencex.semianalysis.com/evaluation?unofficialRun=37721285904 |
There was a problem hiding this comment.
I reviewed this PR and didn't find any bugs. Because it touches the CODEOWNER-covered amd-master.yaml and docs/MODELS.md/MODELS_zh.md, a human (codeowner) look would still be worthwhile.
What was reviewed: the new ATOM srt-slurm recipe (dsv41flash/atom/mi355x-fp4-mtp/agentic.yaml) against sibling ATOM recipes (dsv4, kimik3, minimaxm3, dsv41flash/vllm) to confirm the gpus:-only TP-override pattern, ep/dp-attn/spec-decoding: draft_model master-config key usage, and CONC-list/master-config alignment all match established conventions; the golden AL 3.51 claim was cross-checked against infx/golden_al_distribution/dsv41flash_dspark.yaml (thinking_on, K5) and the atom engine path in infx/srt_slurm/synthetic_acceptance.py; the perf-changelog.yaml change is a pure append after the last existing entry.
Extended reasoning...
Config/docs-only PR (new ATOM benchmark recipe, master-config entry, docs, append-only changelog) with no security-sensitive surface touched. It closely mirrors several existing sibling recipes and I verified the non-obvious claims (golden AL value, TP-via-gpus override convention, synthetic-acceptance ATOM support) directly in the repo rather than taking the PR description at face value, finding no discrepancies. Decision is defer rather than approve solely because two of the changed files (amd-master.yaml, docs/MODELS.md/MODELS_zh.md) are CODEOWNER-covered paths per .github/CODEOWNERS.
… c32 Every point captures [1..32,48,64,128] from base. TP2 runs [1,2,8,16,32,64,128]; TP4 drops c2/c8/c16/c64 and keeps c32. 所有点在 base 中统一使用 [1..32,48,64,128] 捕获列表;TP2 为 [1,2,8,16,32,64,128],TP4 去掉 c2/c8/c16/c64,仅保留 c32。 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Set ATOM_PREFILL_DECODE_INTERVAL=16 on the TP4 concurrency-32 point only. ATOM's PrefillDelayer then runs at least 16 decode passes after each prefill and batches the prefills that arrive in the meantime, so new turns interrupt decode less often. Local 3600 s replay: P90 interactivity 108.2 -> 150.9 tok/s/user, ITL p90 9.24 -> 6.63 ms, TTFT p50 0.51 -> 1.14 s, throughput unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Set ATOM_PREFILL_DECODE_INTERVAL=4 on the TP2 concurrency-64 point only. At this load each batched prefill forward serves several requests, so throughput rises along with interactivity. Local 3600 s replay: P90 interactivity 30.3 -> 38.8 tok/s/user, 105.4k -> 115.2k tok/s/GPU, 6487 -> 6941 requests, TTFT p90 2.3 -> 6.4 s. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Update the image from rocm/atom-dev:nightly_202609291501 to nightly_202610011450 (ATOM 0.1.7.dev51+g922b35196, ROCm 7.2.4). ATOM only changes KV transfer and LMCache offload, which this recipe does not use; AITER moves from 475cf0f60 to fb3219915. The upstream DeepSeek-V4.1-Flash agentic recipe is unchanged. A local real-acceptance check on TP2 produced coherent output for single and four concurrent requests. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Resolve conflicts in configs/amd-master.yaml (keep the DSv4.1-Flash ATOM entry, take main's shortened GLM-5.3 comment) and perf-changelog.yaml (main's new entries first, this PR's entry last). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The merge with main dropped the entry's leading '- config-keys:' line, so the added hunk no longer parsed on its own. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…x-atom-srt-0929 # Conflicts: # inferencex-e2e/perf-changelog.yaml
… FP4 index cache Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… decode Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ER #6174 bf16 GEMM tuning) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…#2483 mono step-fence fix) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…x-atom-srt-0929 # Conflicts: # inferencex-e2e/perf-changelog.yaml
Resolve conflicts:
- inferencex-e2e/docs/MODELS{,_zh}.md: keep this PR's DeepSeek-V4.1-Flash
row (ATOM restored on srt-slurm 2026-09-30) and main's GLM-5.3 row
("deprecation policy" wording).
- inferencex-e2e/docs/configuration-procedures{,_zh}.md: accept deletion
from main (#3789 removed the configuration procedure guides).
- inferencex-e2e/perf-changelog.yaml: keep main's new entries (#3401,
#3692, #3685) and append this PR's entry after them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
/reuse-sweep-run 37597985033 |
…ghtly dsv41flash-fp4-mi355x-atom-agentic-dspark: - Restore DeepSeek-V4.1-Flash FP4 ATOM AgentX on MI355X (#3387) on the native srt-slurm recipe srt-slurm-recipes/dsv41flash/atom/mi355x-fp4-mtp/ agentic.yaml (legacy script and master entry were removed in #3461/#3463). TP2 conc [1,2,4,5,6,8,16,32,64,128] (adds 4,5,6,128); TP4 conc [1,4,5,6,8,32] (adds 1,4,5,6; drops 2,16,64). No EP or KV offload. Conc 1-8 covers the batch sizes V4.1 mono decode serves (<= 8 requests). - Image rocm/atom-dev:nightly_202609250902 -> nightly_202610070333 (sha256:2f605a3e8b459a0385f784edb0335c11892277fee650fe42044e4af39e36dd01; ATOM 0.1.7.dev60+g7fc0926c6, ROCm 7.2.4): - ROCm/ATOM#2419: group32 FP8 weight preshuffle and BF16 RoPE tables for V4.1. - ROCm/ATOM#2479: V4.1 mono decode (on by default, <= 8 requests a step for this TP2/TP4, BF16-KV, five-token DSpark deployment) and the FP4 index plane used by upstream recipes/DeepSeek-V4.1-Flash-Agentic.md. - ROCm/aiter#6174: gfx950 tuned rows for six V4.1-Flash TP4 bf16 GEMM shapes that fell back to torch (DSpark verify batches, TP4 lm_head). - ROCm/ATOM#2483: replaces the Triton mono step fence that could spin forever on gfx950; on the 1006 nightlies the TP2 c1 canary hung in warmup on the DSpark draft's first mono step (runs 37486079757, 37493871230). - Server settings follow the upstream recipe (BF16 KV, index cache FP8 -> FP4 per upstream at 7fc0926c, max-num-seqs 128, 16K batching/prefill chunks, prefix caching block 16, 8K state checkpoints, level 3, FULL graphs, dsml_v41 tool parser); every point now captures [1..32, 48, 64, 128]. Five-token DSpark uses golden AL 3.51 (thinking_on) for throughput, real acceptance for eval; 3600 s weka_062126 replay with five warmup requests per lane. - DSpark draft (layers 37-39, inline): no --online_quant_config; attention and projection linears stay native FP8 32x32. Via the image bump, the draft's routed FP4 experts take MXFP8 instead of MXFP4 activations (ROCm/ATOM#2479) and the V4.1 RoPE tables are BF16 instead of FP32 (ROCm/ATOM#2419). The draft has no indexer, so index-cache-dtype fp4 does not apply to it. - TP4 conc 32: ATOM_PREFILL_DECODE_INTERVAL=16 (local 3600 s replay: 108.2 -> 150.9 tok/s/user, ITL p90 9.24 -> 6.63 ms, TTFT p50 0.51 -> 1.14 s, throughput unchanged). - TP2 conc 64: ATOM_PREFILL_DECODE_INTERVAL=4 (30.3 -> 38.8 tok/s/user, 105.4k -> 115.2k tok/s/GPU, 6487 -> 6941 requests, TTFT p90 2.3 -> 6.4 s). All other points unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
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.
- Verified that this PR passes evals. Please link to GitHub Action workflow that shows this.
- 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_MOEis 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
- 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
- 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:
- insert any additional info here
- recipe at https://github.com/ROCm/ATOM/blob/main/recipes/DeepSeek-V4.1-Flash-Agentic.md
- regarding the datatype of draft model
only one weight changes datatype. Of the draft's weights, only attn.wo_a runs at a different dtype on the new image. It is the same tensor in all three draft stages. Every other draft weight keeps its dtype. Some of them are now stored in a different memory layout, but the data type is the same.
I diffed ATOM 4685e3cf (old image) against 7fc0926c6 (new image). DraftAttention and DraftBlock subclass V4.1's Attention and Block, so any change in those applies to every draft stage.
The one change: wo_a goes from BF16 to FP8
- Old pin: Attention.process_weights_after_loading turned the checkpoint's FP8 wo_a (with E8M0 32x32 scales) into BF16 after loading. It deleted the scale and set quant_type = QuantType.No, and _project_out ran a BF16 einsum.
- New pin: that hook is gone. wo_a stays FP8 e4m3 with E8M0 32x32 scales, laid out in 16x16 tiles (needs_preshuffled_weight = True). _project_out now quantizes the attention output to MXFP8 and calls batched_gemm_a8w8_mxscale_bpreshuffle. So wo_a goes from a BF16 GEMM to an FP8×MXFP8 GEMM.
- The PR's "Draft precision" section doesn't list this. Its phrase "inverse RoPE fused into the output projection" is the same change, but the PR doesn't say the weight's dtype changed. This change comes from #2479 or #2419; I didn't check which one.
Every draft weight, old vs. new
┌────────────────────────────────────────────────────────┬────────────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────┬───────────────┐
│ Weight (per draft stage) │ Old pin │ New pin │ Changed? │
├────────────────────────────────────────────────────────┼────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┼───────────────┤
│ attn.wqkv_a, attn.wq_b, attn.wo_b │ FP8 + E8M0 1x32/32x32, original layout │ Same dtype, preshuffled 16x16 on gfx950 (ATOM_GROUP32_WEIGHT_PRESHUFFLE=1 by default) │ Layout only │
├────────────────────────────────────────────────────────┼────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┼───────────────┤
│ attn.wo_a │ BF16, converted at load │ FP8 + E8M0, preshuffled │ Dtype changes │
├────────────────────────────────────────────────────────┼────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┼───────────────┤
│ ffn.shared_experts.gate_up_proj, .w2 │ FP8 + E8M0 group32 │ Same dtype, preshuffled │ Layout only │
├────────────────────────────────────────────────────────┼────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┼───────────────┤
│ ffn.experts.w13_weight, .w2_weight (routed experts) │ MXFP4 (fp4x2) + E8M0 │ MXFP4. With FP8 activations, gate and up are now interleaved (is_guinterleave) │ Layout only │
├────────────────────────────────────────────────────────┼────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┼───────────────┤
│ ffn.gate.weight │ BF16 │ BF16, now run by a fixed-order GEMV │ No │
├────────────────────────────────────────────────────────┼────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┼───────────────┤
│ gate.e_score_correction_bias, bias_vl, attn_sink, hc_* │ FP32 │ FP32 │ No │
├────────────────────────────────────────────────────────┼────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┼───────────────┤
│ attn_norm, ffn_norm, q_norm, kv_norm │ BF16 │ BF16 │ No │
├────────────────────────────────────────────────────────┼────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┼───────────────┤
│ main_proj (stage 0 only) │ FP8 group32 │ Same dtype, preshuffled │ Layout only │
├────────────────────────────────────────────────────────┼────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┼───────────────┤
│ main_norm, norm, Markov and confidence heads │ Unchanged │ Unchanged │ No │
├────────────────────────────────────────────────────────┼────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┼───────────────┤
│ Embedding and LM head │ Shared with the target model │ Shared with the target model │ No │
└────────────────────────────────────────────────────────┴────────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────┴───────────────┘
Signed: seungrokj
|
|
@Oseltamivir @edwingao28 plz review this PR ? |
…recipe notes Merge origin/main (#3603 appended its changelog entry at the same tail) and keep this PR's entry after it. Shorten the entry and the recipe comments to what the recipe changes, without upstream PR references or implementation detail. 合并 main(#3603 在同一位置追加了 changelog 条目),本 PR 的条目接在其后; changelog 条目和 recipe 注释只保留配置变更本身,不再列上游 PR 和实现细节。 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: yihonglie <hyi@amd.com>
Summary
Restore
dsv41flash-fp4-mi355x-atom-agentic-dspark(#3387) on the native srt-slurm framework and move it to the 2026-10-07 ATOM nightly. #3387'sbenchmarks/single_node/agentic/dsv41flash_fp4_mi355x_atom_mtp.shwas deleted by #3461, and #3463 then dropped the master-config entry and docs, so this arm currently does not run. Following the pattern in #3388 and the other ATOM AgentX recipes, it is now asrt-reciperow.inferencex-e2e/benchmarks/single_node/srt-slurm-recipes/dsv41flash/atom/mi355x-fp4-mtp/agentic.yaml:engine: atom,atomeshfrontend (same digest as the other ATOM recipes), oneoverride_tp{2,4}_c*variant per point.rocm/atom-dev:nightly_202609250902→rocm/atom-dev:nightly_202610070333.[1, 2, 4, 5, 6, 8, 16, 32, 64, 128](adds 4, 5, 6 and 128), TP4[1, 4, 5, 6, 8, 32](adds 1, 4, 5 and 6; drops 2, 16 and 64). No expert parallelism or KV offload. Concurrency 1–8 covers the batch sizes that V4.1 mono decode serves (up to 8 requests a step).7fc0926c),max-num-seqs 128, 16K batching/prefill chunks, prefix caching with block size 16, 8K state checkpoints, level 3, FULL graphs, five-token DSpark,dsml_v41tool parsing. The one difference: every point now captures the dense list[1..32, 48, 64, 128](set once inbase) instead of only concurrency 32.infx/srt_slurm/synthetic_acceptance.pyadds--spec-decode-acceptance-length 3.51(thedsv41flash_dsparkthinking_onK5 value) to AgentX throughput runs and leaves eval-only runs on real acceptance.semianalysis_cc_traces_weka_062126for 3600 s per point with five warmup requests per lane; AIPerf TCP/drain timeouts 900000/300 as in [AMD][AgentX] Add DeepSeek-V4.1-Flash ATOM TP2/TP4 / 新增 DeepSeek-V4.1-Flash ATOM TP2/TP4 #3387.ATOM_PREFILL_DECODE_INTERVAL(see below): TP4 c32 = 16, TP2 c64 = 4. All other points are unchanged.OMP_NUM_THREADS=4,ATOM_NUMA_BIND=0,ATOM_DISABLE_MMAP=true,AITER_LOG_LEVEL=WARNINGis unchanged; srtctl masks GPUs0..TP-1viaROCR_VISIBLE_DEVICES. The existing mi355x-amds shared-HF-cache rule already coversdeepseek-ai/DeepSeek-V4.1-Flash, so no launcher or policy change is needed.Image
Pin:
rocm/atom-dev:nightly_202610070333, digestsha256:2f605a3e8b459a0385f784edb0335c11892277fee650fe42044e4af39e36dd01, ATOM0.1.7.dev60+g7fc0926c6, ROCm 7.2.4.Relevant changes since the 0925 pin (ATOM
4685e3cf):lm_head.nightly_202610061452andnightly_202610061600the TP2 c1 canary hung in warmup on the DSpark draft's first mono step and never served (runs 37486079757 and 37493871230).Draft precision
The DSpark draft (layers 37–39, loaded inline from the checkpoint) keeps its checkpoint weights: no
--online_quant_configis passed, and its attention linears stayper_1x32FP8 (e4m3, FP8 activations). Two compute precisions change with the image bump, checked against ATOM7fc0926c6:DraftBlockreuses the V4.1MoE, which setsmoe_fp8_activations = True(feat(v41): mono decode, FP4 index plane, shared mono framework ROCm/ATOM#2479);Mxfp4MoEMethodthen quantizes expert inputs to FP8 instead of MXFP4. Expert weights stay MXFP4.Numerics-only changes (same dtypes, different kernels or summation order): group32 preshuffled FP8
wkvGEMM with inverse RoPE fused into the output projection, fixed-order router GEMV, and the mono decode kernels.--kv_cache_dtype bf16and--index-cache-dtype fp4touch cache storage only; the draft has no indexer, so the FP4 index cache does not apply to it.TP4 c32: prefill-decode interval 16
TP4 c32 sets
ATOM_PREFILL_DECODE_INTERVAL=16. ATOM runs prefill and decode as separate forwards. Each new turn adds about 2.3 prefill-only forwards, and every running decode waits for them. In CI 36681286104, about 40% of TP4 c32 decode time went to these waits; for vLLM the figure was about 20%. With the interval, ATOM's PrefillDelayer (off by default) runs at least 16 decode passes after each prefill and batches the prefills that arrive in the meantime.Local 3600 s replay (MI355X, same trace):
For reference, vLLM TP4 c32 in CI is 131.0. Throughput does not change because AgentX is paced by the trace: users are idle about 74% of the time. Decode time saved per turn (−1.04 s) is roughly offset by added TTFT (+0.96 s).
TP2 c64: prefill-decode interval 4
TP2 c64 sets
ATOM_PREFILL_DECODE_INTERVAL=4. In CI this point matched vLLM on interactivity (31.6 vs 31.5) but delivered 7.4% less throughput (118.7k vs 128.2k tok/s/GPU). About a third of ATOM's time went to prefill-only forwards. At this load, one batched prefill forward serves several requests, so throughput rises as well as interactivity.Local 3600 s replay (MI355X, same trace):
Interval 4 gives the most throughput for the smallest increase in TTFT.
Validation
Done at an earlier revision of this PR (image
nightly_202609291501/nightly_202610011450, ATOM74fd942b); not re-run for the 1007 image:git diff --check, YAML parsing, and a byte-prefix check onperf-changelog.yaml(append-only) passed.build_overrides(synthetic-acceptance connector) on every variant, deep-merged overbase: every matrix point mapped to exactly one variant with matching image, model, GPU count and CONC. Throughput getsspec-decode-acceptance-length=3.51; eval-only gets no override.dsml_v41parser existed at ATOM74fd942b; the srtctl ATOM backend passes arg keys verbatim.validate_perf_changelog, and srtctl override expansion are left to CI.Background: why c8/c16 on the 0925 pin are not a valid baseline
Measured on
nightly_202609291501, before the move to 1007; kept because it explains why the #3387 numbers should not be compared against.CI run 36681286104 on
nightly_202609291501shows TP2 c8 X = 207.9, versus 239.9 on the #3387nightly_202609250902run. A local MI355X 3600 s replay reproduces it (207.6). The 0925 number is not a valid baseline: before ATOM#2419 (ATOM_GROUP32_WEIGHT_PRESHUFFLE, on by default from 0929), DSV4.1-Flash TP2 small-batch decode produces garbage text.Checked locally with real acceptance (no
--spec-decode-acceptance-length), greedy chat requests:nightly_202609250902/_251613(old default path)nightly_202609291501+ATOM_GROUP32_WEIGHT_PRESHUFFLE=0nightly_202609291501defaultgemm_afp8wfp8/ the earlier group32 kernel). It loads masked scale lanes withother=127, and on Triton 3.7/3.8 those lanes read stale LDS. At small M (5–6 rows: shapes 2304x5120, 1792x5120, 16384x1280, 4096x1280) each call then returns about 1000 NaN/Inf values. Isolated kernel tests start with clean LDS and pass. Applying ROCm/aiter#6007 (other=0) tonightly_202609291501withATOM_GROUP32_WEIGHT_PRESHUFFLE=0gives coherent output and 0 non-finite values across 2000 checked calls. The default path uses the FlyDSL preshuffled GEMM for these linears, so it is unaffected.Conclusion: do not set
ATOM_GROUP32_WEIGHT_PRESHUFFLE=0for this arm, and do not use the c8/c16 points measured on 0925 as a reference.中文
概要
将
dsv41flash-fp4-mi355x-atom-agentic-dspark(#3387)迁移到原生 srt-slurm 框架,并更新为 2026-10-07 ATOM nightly。#3387 的dsv41flash_fp4_mi355x_atom_mtp.sh已在 #3461 中删除,#3463 随后移除了 master config 条目和文档,该配置目前不会运行。本 PR 参考 #3388 及其他 ATOM AgentX 配方,改为srt-recipe行。inferencex-e2e/benchmarks/single_node/srt-slurm-recipes/dsv41flash/atom/mi355x-fp4-mtp/agentic.yaml:engine: atom,atomeshfrontend(与其他 ATOM 配方相同 digest),每个测试点对应一个override_tp{2,4}_c*变体。rocm/atom-dev:nightly_202609250902更新为rocm/atom-dev:nightly_202610070333。[1, 2, 4, 5, 6, 8, 16, 32, 64, 128](新增 4、5、6、128),TP4[1, 4, 5, 6, 8, 32](新增 1、4、5、6,去掉 2、16、64),不启用 EP 或 KV 卸载。并发 1–8 覆盖 V4.1 mono decode 支持的 batch 大小(每步最多 8 个请求)。7fc0926c),max-num-seqs 128,16K batching/prefill chunk,block size 16 的前缀缓存,8K 状态检查点,level 3,FULL graph,五 token DSpark,dsml_v41工具解析。唯一区别:所有点统一捕获[1..32, 48, 64, 128](在base中设置),而不再只针对并发 32。infx/srt_slurm/synthetic_acceptance.py为 AgentX 吞吐测试添加--spec-decode-acceptance-length 3.51(thinking_onK5),eval-only 保持真实 acceptance。semianalysis_cc_traces_weka_0621263600 秒,每条 lane 预热 5 个请求。ATOM_PREFILL_DECODE_INTERVAL(见下文):TP4 c32 = 16,TP2 c64 = 4,其余点不变。镜像
rocm/atom-dev:nightly_202610070333,digestsha256:2f605a3e…,ATOM0.1.7.dev60+g7fc0926c6,ROCm 7.2.4。相对 0925(ATOM4685e3cf)的相关改动:lm_head。nightly_202610061452和nightly_202610061600上,TP2 c1 canary 在 warmup 中卡在 DSpark draft 的第一个 mono 步,始终未能服务(run 37486079757、37493871230)。Draft 精度
DSpark draft(第 37–39 层,从检查点内联加载)的权重保持检查点精度:未传入
--online_quant_config,attention 线性层仍为per_1x32FP8(e4m3,FP8 激活)。对照 ATOM7fc0926c6,镜像升级带来两处计算精度变化:DraftBlock复用 V4.1MoE,其设置moe_fp8_activations = True(feat(v41): mono decode, FP4 index plane, shared mono framework ROCm/ATOM#2479),Mxfp4MoEMethod因此把专家输入量化为 FP8 而非 MXFP4;专家权重仍为 MXFP4。仅数值层面的变化(dtype 不变):group32 预重排 FP8
wkvGEMM 并将 inverse RoPE 融合到输出投影、固定顺序的 router GEMV、mono decode kernel。--kv_cache_dtype bf16和--index-cache-dtype fp4只影响缓存存储;draft 没有 indexer,FP4 index cache 不作用于 draft。TP4 c32:prefill-decode interval 16
TP4 c32 设置
ATOM_PREFILL_DECODE_INTERVAL=16。ATOM 的 prefill 和 decode 分开跑,每个新请求带来约 2.3 次纯 prefill forward,期间所有在跑的 decode 都要等待。在 CI 36681286104 里,TP4 c32 约 40% 的 decode 时间花在这种等待上,vLLM 约 20%。开启后,ATOM 的 PrefillDelayer(默认关闭)每次 prefill 后至少先跑 16 步 decode,并把这期间到达的 prefill 攒到一起跑。本地 3600 秒回放:P90 交互性 108.2 → 150.9(interval 4 为 137.9),ITL p90 9.24 → 6.63 ms,TTFT p50 0.51 → 1.14 s,吞吐不变(53.3k → 53.8k tok/s/GPU)。CI 上 vLLM TP4 c32 为 131.0。吞吐不变是因为 AgentX 由 trace 节奏决定,用户约 74% 的时间空闲;每轮省下的 decode 时间(−1.04 s)基本被增加的 TTFT(+0.96 s)抵消。
TP2 c64:prefill-decode interval 4
TP2 c64 设置
ATOM_PREFILL_DECODE_INTERVAL=4。CI 上这个点的交互性与 vLLM 持平(31.6 对 31.5),吞吐却低 7.4%(118.7k 对 128.2k tok/s/GPU),ATOM 约 1/3 的时间花在纯 prefill forward 上。在这个负载下,攒批后一次 prefill forward 能服务多个请求,所以吞吐和交互性都会提升。本地 3600 秒回放:交互性 30.3 → 38.8,吞吐 105.4k → 115.2k tok/s/GPU(+9.3%),完成请求 6487 → 6941,TTFT p90 2.3 → 6.4 s。interval 8 和 16 的交互性更高(41.7、52.1),但吞吐不如 4,TTFT p90 分别达到 10.1 s 和 15.3 s,因此选 4。验证
在本 PR 较早的版本(镜像
nightly_202609291501/nightly_202610011450,ATOM74fd942b)上完成,未针对 1007 镜像重跑:git diff --check、YAML 解析、changelog 追加检查通过;build_overrides检查每个点唯一匹配一个变体,吞吐注入 AL 3.51,eval 不注入;配方中的 ATOM 参数和dsml_v41解析器在74fd942b上均存在。pydantic matrix generator、validate_perf_changelog和 srtctl override 展开由 CI 覆盖。背景:为什么 0925 上的 c8/c16 不能作为基线
以下在
nightly_202609291501上测得(早于升级到 1007),保留用于说明为何不应与 #3387 的数字比较。CI 36681286104(
nightly_202609291501)的 TP2 c8 X 为 207.9,#3387 的nightly_202609250902为 239.9;本地回放复现为 207.6。但在 ATOM#2419(ATOM_GROUP32_WEIGHT_PRESHUFFLE,0929 起默认开启)之前,DSV4.1-Flash TP2 小 batch decode 会输出乱码:0925 镜像在 1–4 个并发请求时输出乱码,64 个并发时正常;关闭 DSpark、eager 模式或关闭双 stream MoE 仍是乱码;0929 设置ATOM_GROUP32_WEIGHT_PRESHUFFLE=0同样乱码;只有 0929 默认配置输出正常。other=127加载,在 Triton 3.7/3.8 上会读到 LDS 残留数据;小 M(5–6 行)时每次调用约 1000 个 NaN/Inf。应用 ROCm/aiter#6007(other=0)后恢复正常。默认路径使用 FlyDSL 预重排 GEMM,不受影响。结论:不要为该配置设置
ATOM_GROUP32_WEIGHT_PRESHUFFLE=0;0925 上测得的 c8/c16 不应作为参照。🤖 Generated with Claude Code