Skip to content

[NVIDIA][AgentX] Retune GB300 DSV4.1-Flash Dynamo + SGLang HiCache disagg points on the 20261030 nightly / [NVIDIA][AgentX] 在 20261030 nightly 上重新调整 GB300 DSV4.1-Flash Dynamo + SGLang HiCache 分离式点位 - #4673

Merged
nvpohanh merged 14 commits into
mainfrom
weireweire/dsv41flash-gb300-sgl-disagg-pareto
Nov 6, 2026

Conversation

@weireweire

@weireweire weireweire commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator

Move the GB300 DeepSeek-V4.1-Flash Dynamo + SGLang agg and prefill-HiCache disagg keys to digest-pinned lmsysorg/sglang:nightly-dev-cu13-20261030-302b78cc (SGLang 0.0.0.dev1+g52604e1d4, Dynamo 1.7.0.dev20261029), and keep one point per interactivity range.

Based on main after #4595 and #4679. The commits change disagg-dep16-hicache-variants.yaml, agg-variants.yaml, the two keys' search spaces and image pins, and add one changelog entry that lists both keys, so the whole Dynamo + SGLang curve comes from this PR's sweep.

Point Prefill Concurrency Decode CUDA graph max BS (per rank) Decode max-running-requests Decode DP balancing Change
agg TP4 c1 / c4 / c16 — 1 / 4 / 16 — — — unchanged
disagg 3 × DEP2 700 18 288 total_tokens new, right of agg TP2/EP2 c16 on p90 interactivity
disagg 3 × DEP2 1228 24 384 total_tokens kept (from #4679)
disagg 5 × DEP2 2884 40 640 total_tokens kept
disagg 7 × DEP2 5540 96 1536 total_tokens new, replaces 8 × DEP2 c4096
disagg 9 × DEP2 7480 192 3072 total_requests new, replaces 9 × DEP2 BS 160 c7480

Disagg decode is always one DEP16 worker. Removed: agg TP2/EP2 c16 (from #4679), 8 × DEP2 c4096 and 9 × DEP2 BS 160 c7480.

Why these points:

  • 3 × DEP2 c700 replaces agg TP2/EP2 c16 on the chart. The site plots p90 interactivity (1/p90 TPOT). On 302b78cc (1200 s, 22 GPUs), c700 gives p90 299.2 vs the published 292.4 of agg TP2/EP2 c16, at 220,700-223,300 tok/s/GPU after the 1200 s → 3600 s factor (about 3.8x), with mean interactivity 290.2 and E2E-normalized p90 136.8. c800 (296.8) and c900 (294.5) were within 1.5% and 0.7% of TP2/EP2 c16, inside run-to-run noise, so c700 is the point with margin.
  • Prefill stays saturated at every point. Concurrency is sized so prefill always has queued work; the decode batch is whatever the prefill rate supports (Little's law: running requests = request rate × decode time per request).
  • Binding decode cap (c5540). The decode CUDA graph cap sits at the per-rank equilibrium batch. Throughput is the same as with a high cap, because prefill sets the request rate; the extra requests wait for admission instead of widening every decode step.
  • Free decode cap (c7480). At 9 prefill workers, cap 192 with total_requests balancing lets decode take every request prefill delivers. total_requests keeps the per-rank running counts within 2-7 of each other (11-26 with total_tokens); the step is paced by the busiest rank.

Removed published points (rule 18(g), mean interactivity and throughput per GPU; agg TP4 c16, 3 × DEP2 c1228 and the removed points as published, the other kept points from our 3600 s runs below):

Removed point Published Covered by Line value at the removed point's mean interactivity
agg TP2/EP2 c16 57,670 @ mean 377.4 agg TP4 c16 (29,428 @ 545.0) to 3 × DEP2 c1228 (383,313 @ 267.4) about 243,000
8 × DEP2 c4096 803,198 @ 191.4 5 × DEP2 c2884 (717,972 @ 221.9) to 7 × DEP2 c5540 (1,033,494 @ 150.7) about 853,100
9 × DEP2 BS 160 c7480 1,094,347 @ 111.1 7 × DEP2 c5540 (1,033,494 @ 150.7) to 9 × DEP2 BS 192 c7480 (1,117,063 @ 101.6) about 1,100,900

Throughput gain at the same p90 interactivity (tok/s/GPU). Our points were measured on our GB300 cluster on 302b78cc with the bound recipes of this PR and the AgentX client, not in this PR's sweep. The vLLM column linearly interpolates the currently published GB300 DeepSeek-V4.1-Flash Dynamo + vLLM and vLLM points on their Pareto frontier at our p90 interactivity. A blank cell means no gain.

This recipe Run Throughput p90 interactivity E2E-normalized p90 vs vLLM
5 × DEP2, BS 40, c2884 3600 s 717,972 233.2 50.0
7 × DEP2, BS 96, c5540 3600 s 1,033,494 157.5 23.5 +5.0 %
9 × DEP2, BS 192, c7480 3600 s 1,117,063 97.4 24.5 +11.1 %

At p90 97.4, the vLLM frontier lies between 1,011,514 @ 75.5 and 993,521 @ 145.6, which gives 1,005,893. At p90 157.5 it lies between 993,521 @ 145.6 and 954,146 @ 196.5, which gives 984,316.

The 3 × DEP2 c1228 point keeps #4679's settings; on 302b78cc a 1200 s run gave about 371,000 tok/s/GPU after the 1200 s → 3600 s factor, at p90 interactivity 281.2 and E2E-normalized p90 91.1, matching the published 383,313 @ 283.3 within the fast-run projection.

Validation details

All runs used nightly-dev-cu13-20261030-302b78cc through srt-slurm on GB300 with the AgentX client (reasoning_effort high, temperature 1) and the golden acceptance length 3.51. Each run's resolved recipe matches the recipe that infx generate binds for this PR, apart from cluster NIC names, scheduler directives and local image/model packaging of the same digest.

中文

将 GB300 DeepSeek-V4.1-Flash Dynamo + SGLang 的 agg 与 prefill-HiCache 分离式 key 换到固定 digest 的 nightly-dev-cu13-20261030-302b78cc(SGLang 0.0.0.dev1+g52604e1d4、Dynamo 1.7.0.dev20261029),每个交互性区间只保留一个点。

基于 #4595 与 #4679 合入后的 main。 本 PR 新增一条同时列出两个 key 的 changelog,让整条 Dynamo + SGLang 曲线都来自本 PR 的 sweep。

  • 保留的点: agg TP4 c1 / c4 / c16(不变);分离式 3 × DEP2 c700(新增,decode BS 18、max-running-requests 288)、3 × DEP2 c1228(来自 [NVIDIA][AgentX] Append GB300 DSV4.1-Flash Dynamo + SGLang TP2/EP2 c16 and 3P1D c1228 points (append-only, follows #4595) / [NVIDIA][AgentX] 追加 GB300 DSV4.1-Flash Dynamo + SGLang TP2/EP2 c16 和 3P1D c1228 点(仅追加,接续 #4595) #4679)、5 × DEP2 c2884、7 × DEP2 c5540(BS 96)、9 × DEP2 c7480(BS 192、max-running-requests 3072、total_requests DP 均衡)。decode 都是一个 DEP16 worker。
  • 去掉的点及覆盖关系(按平均交互性与每卡吞吐):
    • agg TP2/EP2 c16(57,670 @ 377.4):在 agg TP4 c16 与 3 × DEP2 c1228 的连线下方(约 243,000)。
    • 8 × DEP2 c4096(803,198 @ 191.4):在 5 × DEP2 c2884 与 7 × DEP2 c5540 的连线下方(约 853,100)。
    • 9 × DEP2 BS 160 c7480(1,094,347 @ 111.1):在 7 × DEP2 c5540 与 9 × DEP2 BS 192 的连线下方(约 1,100,900)。
  • 3 × DEP2 c700 取代 agg TP2/EP2 c16: 网站按 p90 交互性画图。302b 上 c700 的 p90 为 299.2,高于 TP2/EP2 c16 已发布的 292.4,吞吐约 22.1–22.3 万 tok/s/GPU(约 3.8 倍)。c800、c900 只高 1.5% 和 0.7%,在噪声内,所以选 c700。
  • 原则: 每个点都让 prefill 跑满,decode 的 batch 由 prefill 速率决定(Little 定律)。BS 96 的上限等于每 rank 的平衡 batch,多出来的请求在准入处等待;BS 192 让 decode 接收 prefill 送来的全部请求。
  • 同交互性下相对 vLLM(302b,3600 s): 9 × DEP2 BS 192 为 1,117,063 @ 97.4(+11.1%);7 × DEP2 BS 96 为 1,033,494 @ 157.5(+5.0%);5 × DEP2 低于 vLLM。
AI model disclosure
  • Claude Opus 5.5 (runtime identifier aws/anthropic/eccn-claude-opus-5-5) planned the point set from the P/D rate analysis, ran the cluster experiments through delegated agents on the same model, wrote the recipe overrides, master config, changelog entry and this description, and ran independent reviews of the diff through separate delegated agents on the same model.

@github-actions

Copy link
Copy Markdown
Contributor

Thanks for the contribution!

  • Review: If this PR changes files owned by someone other than a repository admin or @SemiAnalysisAI/core, ask one eligible CODEOWNER to complete the latest PR_REVIEW_CHECKLIST.md before contacting a core maintainer on Slack. Follow the template exactly, including As a PR reviewer and CODEOWNER, I have reviewed this and have, so sign-off verification triggers.
  • PR verification: Sweeps run only when the PR appends an inferencex-e2e/perf-changelog.yaml entry and carries exactly one primary label: full-sweep-fail-fast (strongly recommended; canary plus per-matrix fail-fast), full-sweep-enabled (canary; matrix jobs continue after a failure), or non-canary-full-sweep-enabled (no canary or fail-fast). The modifiers all-evals, evals-only, and agentx-fast require a primary label. On fork PRs, a maintainer applies the label. See sweep labels and reuse.
  • After merging: PR authors must ensure all GitHub Actions jobs pass. Transient failures often pass on rerun; see how to rerun failed jobs.
中文

感谢你的贡献!

  • **审阅:**如果 PR 修改的文件归属于仓库管理员及 @SemiAnalysisAI/core 之外的 CODEOWNER,请先联系一位有资格的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,再通过 Slack 联系核心维护者。必须严格遵循模板,并保留 As a PR reviewer and CODEOWNER, I have reviewed this and have,才能触发签核验证。
  • **PR 验证:**只有当 PR 在 inferencex-e2e/perf-changelog.yaml 末尾追加了条目,并且恰好带有一个主标签时,才会运行扫描:full-sweep-fail-fast(强烈推荐;canary 加逐矩阵 fail-fast)、full-sweep-enabled(有 canary;矩阵任务在失败后继续运行)或 non-canary-full-sweep-enabled(无 canary,也无 fail-fast)。修饰标签 all-evals、evals-only 和 agentx-fast 必须与主标签一起使用。fork PR 的标签由维护者添加。参见扫描标签与复用。
  • **合并后:**PR 作者必须确保所有 GitHub Actions 任务通过。临时性失败通常可以通过重新运行恢复;参见重新运行失败任务的说明。

Add 5P bs48 c3615, 6P bs64 c4370 and 7P bs96 c5540 with the decode cap at the
P/D equilibrium batch, and 7P c5800 and 9P c7480 at cap 192 with total_requests
decode balancing. Drop 8P c4096. Each point's bound recipe matches the measured
run's resolved config apart from the unused Mooncake services.
…ys to the 20261030 nightly

nightly-dev-cu13-20261030-302b78cc (index digest d4b7701d) bundles SGLang
52604e1d46, 181 commits after 586355a8, and Dynamo 1.7.0.dev20261029. Recipes
are unchanged; the points are being re-measured on this image before the sweep.
In 3600 s runs on 586355a8, 7P BS 96 c5540 gave 1,031,199 tok/s/GPU at p90
interactivity 155.2 and 7P BS 192 c5800 gave 1,029,432 at 127.1.
@weireweire
weireweire force-pushed the weireweire/dsv41flash-gb300-sgl-disagg-pareto branch from 8542d92 to b8510e8 Compare November 2, 2026 02:39
@weireweire weireweire changed the title [NVIDIA][AgentX] Retune GB300 DSV4.1-Flash Dynamo + SGLang HiCache disagg points (stacked on #4595) / [NVIDIA][AgentX] 重新调整 GB300 DSV4.1-Flash Dynamo + SGLang HiCache 分离式点位(基于 #4595) [NVIDIA][AgentX] Retune GB300 DSV4.1-Flash Dynamo + SGLang HiCache disagg points on the 20261030 nightly / [NVIDIA][AgentX] 在 20261030 nightly 上重新调整 GB300 DSV4.1-Flash Dynamo + SGLang HiCache 分离式点位 Nov 2, 2026
…t covers

Root cause: #4679 added agg TP2/EP2 c16 back to fill the interactivity gap
between agg TP4 c16 and disagg 5P c2884, at ~58k tok/s/GPU.

Fix: add 3 x DEP2 prefill + DEP16 decode at c1024 (decode CUDA graph batch
20, max-running-requests 320, extra slots 30) and remove override_tp2_c16 and
its search-space entry.

Validation: 302b78cc fast run with this recipe: ~320k tok/s/GPU projected full
at conv p90 288-294 (agg TP2/EP2 c16 published: 57,670 @ 292.4) and
E2E-normalized p90 107.9 vs 91.4.
…-gb300-sgl-disagg-pareto

# Conflicts:
#	inferencex-e2e/perf-changelog.yaml
…tivity range

Root cause: the disagg key carried neighbouring points that add little to the
curve (5P c3615 next to 5P c2884, 9P batch 160 next to 9P batch 192, and the
new 3P c1024 next to 3P c1228).

Fix: drop override_5p1d_dep2_dep16_b48_c3615, override_9p1d_dep2_dep16_b160_c7480
and override_3p1d_dep2_dep16_b20_c1024 with their search-space entries, and
rewrite this PR's changelog entry for the final point set.

Validation: rule 18(g) on mean interactivity and tput per GPU with the 302b
3600 s fulls: published 9P batch 160 lies under the 7P c5540 - 9P batch 192
line (+0.6%), agg TP2/EP2 c16 under the agg TP4 c16 - 3P c1228 line, and
8P c4096 under the 5P - 6P line; 5P bs48 cost 0.6% of curve at mean 199.7.
@weireweire weireweire added the full-sweep-enabled Full sweep with canary gate; matrix jobs run to completion despite failures label Nov 2, 2026
…-gb300-sgl-disagg-pareto

# Conflicts:
#	inferencex-e2e/perf-changelog.yaml
@weireweire
weireweire marked this pull request as ready for review November 2, 2026 09:44
@weireweire
weireweire requested a review from a team November 2, 2026 09:44
@claude

claude Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @weireweire's task in 32s —— View job


Review

  • Read the diff (recipes, master config, changelog)
  • Checked the changelog position, image accessibility, recipe/master consistency and references to removed overrides

LGTM - no blocking issues found

What I checked
  • Changelog: the new entry is appended at the end of inferencex-e2e/perf-changelog.yaml, covers both changed keys and is not append-only.
  • Images: both keys use the public, digest-pinned lmsysorg/sglang:nightly-dev-cu13-20261030-302b78cc@sha256:d4b7…. The router versions and the recipe identity.frameworks both say Dynamo 1.7.0.dev20261029 / SGLang g52604e1d4.
  • Prefill sizing in the recipes: 6×DEP2 on 3 nodes, 7×DEP2 on 4 nodes, and 9×DEP2 on the base nodes: 5. Each fits in 4 GPUs per node.
  • Recipe vs master: the num-worker values and srt-recipe override names in nvidia-master.yaml match the recipe overrides.
  • Removed overrides: override_tp2_c16, override_8p1d_dep2_dep16_c4096 and override_9p1d_dep2_dep16_b160_c7480 are no longer referenced by any config. The remaining matches are in other recipe files or in historical changelog text.
  • Not run: infx.matrix.changed needed a permission I didn't have. The changelog entry is present, so this does not affect the review.

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

I reviewed this PR and found no bugs. nvidia-master.yaml and the gb300 srt-slurm recipes have designated CODEOWNERS, so one of them should still look over the retuned points.

What was reviewed:

  • Every srt-recipe reference in the two master-config keys points to an override that exists. Prefill num-worker (6/7/9) matches the recipe workers, and the node counts (3/4/inherited 5) have room for those DEP2 workers.
  • The removed overrides (override_tp2_c16, override_8p1d_dep2_dep16_c4096, b160_c7480) are no longer referenced anywhere. Image digests, the dynamo-router version and the recipe identity.frameworks pins agree across both keys.
  • The perf-changelog block is appended only at the end, lists both config keys, and says the base extra-slots of 256 still applies, which matches the recipe.
Extended reasoning...

The change is benchmark config only: two GB300 DSV4.1-Flash Dynamo + SGLang srt-slurm variant recipes, their matching nvidia-master.yaml search-space rows and image/router pins, and one appended perf-changelog entry. It touches no security-sensitive code. The recipe and master config agree, and no dangling override references remain. I deferred instead of approving because .github/CODEOWNERS assigns nvidia-master.yaml and the gb300 srt-slurm recipe paths to specific NVIDIA owners. The tuning choices (decode batch caps, removed points, total_requests balancing) are also performance decisions those owners should confirm.

@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

…-gb300-sgl-disagg-pareto

# Conflicts:
#	inferencex-e2e/perf-changelog.yaml
3x DEP2 prefill + one DEP16 decode at c700 (decode CUDA graph batch 18,
max-running-requests 288, extra slots 27) sits right of agg TP2/EP2 c16 on
p90 interactivity: 299.2 vs 292.4, at about 3.8x its throughput per GPU
(302b78cc, 1200 s fast run, 22 GPUs).
…-gb300-sgl-disagg-pareto

# Conflicts:
#	inferencex-e2e/perf-changelog.yaml
The point between 5P c2884 and 7P c5540 is not needed for the curve. The
published 8P c4096 (803,198 @ mean 191.4) stays covered: the line between
5P c2884 and 7P c5540 gives about 837,000 there.
@weireweire

Copy link
Copy Markdown
Collaborator Author

@nvpohanh sweep finished, please have a look

@nvpohanh

nvpohanh commented Nov 4, 2026

Copy link
Copy Markdown
Collaborator

[by Claude Code] The SGLang cookbook integration of this PR's AgentX configs (dsv41flash-fp4-gb300-dynamo-sglang-agentic-agg, dsv41flash-fp4-gb300-dynamo-sglang-agentic-dspark-disagg-hicache) will happen in sgl-project/sglang#48392, in the Agentic Long-Context Deployment section of the DeepSeek-V4.1 cookbook page.

This PR has no authorized /use <run_id> comment yet, so the cookbook shows the recipe at this PR's head (be7bc6df6) as "in progress". A later cookbook PR switches it to the measured run once a run is pinned or this PR merges.

@nvpohanh

nvpohanh commented Nov 4, 2026

Copy link
Copy Markdown
Collaborator

[by Claude Code] sgl-project/sglang#48392 has been merged. This PR's AgentX configs (dsv41flash-fp4-gb300-dynamo-sglang-agentic-agg, dsv41flash-fp4-gb300-dynamo-sglang-agentic-dspark-disagg-hicache) are now in the Agentic Long-Context Deployment section of the SGLang DeepSeek-V4.1 cookbook: https://docs.sglang.io/cookbook/autoregressive/DeepSeek/DeepSeek-V4_1#agentic-long-context-deployment

This PR has no authorized /use <run_id> comment yet, so the cookbook shows the recipe at this PR's head (be7bc6df6) as "in progress". A later cookbook PR switches it to the measured run once a run is pinned or this PR merges.

@nvpohanh

nvpohanh commented Nov 4, 2026

Copy link
Copy Markdown
Collaborator

/use 41581664540

@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

@nvpohanh staged run 41581664540.

This run remains available across future /stage-results requests. Staging the same run ID again updates its staged data. Staging workflow

@nvpohanh

nvpohanh commented Nov 4, 2026

Copy link
Copy Markdown
Collaborator

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

Checklist items
  • 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_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:

  • Assessed head: be7bc6df6bb01ad03aed970aa962bc002424694e, which is the current PR head. The pinned run is Run Sweep 41581664540 (pull_request, head be7bc6df, conclusion success after attempt 3), named by /use 41581664540, the only /use on this PR. Its results_bmk, eval_results_all and 8 bmk_agentic_* artifacts are unexpired until 2027-02-01.

  • Code quality:

    • The diff is config-only. In agg-variants.yaml it bumps the framework identity and drops override_tp2_c16. In disagg-dep16-hicache-variants.yaml it bumps the identity, adds override_3p1d_dep2_dep16_c700, replaces override_8p1d_dep2_dep16_c4096 with override_7p1d_dep2_dep16_b96_c5540, and replaces override_9p1d_dep2_dep16_b160_c7480 with override_9p1d_dep2_dep16_b192_c7480. nvidia-master.yaml changes the two keys' image/router pins and search spaces to match.
    • It appends one perf-changelog.yaml entry at the end of the file and edits no existing entry. Against current main, git merge-tree reports a conflict only in perf-changelog.yaml, caused by other appends.
    • Master and recipe agree. The results report 22 GPUs for 3P c700/c1228 (3 × DEP2 + DEP16), 26 for 5P, 30 for 7P (4 prefill nodes, 7 workers) and 34 for 9P. The served c700 decode resolves max_running_requests: 288, cuda_graph_max_bs_decode: 18 and disaggregation_decode_extra_slots: 27, as in the override.
    • The changelog entry is accurate. It names the image, the Dynamo and SGLang versions, the new and dropped points, and their decode caps, and 7P c5540 does inherit the base 256 extra slots. No quantization, KV dtype, checkpoint or speculative-method change is omitted.
  • PR validation:

    • In run 41581664540, all 8 multi-node agentic / benchmark jobs succeeded: agg TP4 c1 (canary), c4 and c16, and disagg 3P c700, 3P c1228, 5P c2884, 7P c5540 and 9P c7480. All 8 multi-node agentic eval / jobs, check-changelog, collect-results and collect-evals also succeeded. The skipped jobs are fixed-sequence, single-node and al-gate lanes that these keys do not generate.
    • Attempts 2 and 3 reran only the 3P c700 eval job. Attempt 1 failed because the DEP16 decode workers never became healthy within the startup window: the job was killed with exit 137 while still "waiting for 0 prefills and 1 decodes", and the server never served a request. Attempt 2 failed before the server started, because uv could not install pyarrow==26.0.1 on the node ("doesn't have a source distribution or wheel for the current platform"). Both are infrastructure failures. The same c700 recipe's benchmark job passed in attempt 1, and the eval passed in attempt 3 on the same commit.
  • Evals (gsm8k em_strict, n=1319, from eval_results_all on the PR image). The threshold is the default 0.90 in infx/evals/thresholds.yaml, which has no dsv41flash entry. Every row also clears the stricter 0.91 dsv4 value.

    Config em_strict
    agg TP4 c1 0.9773
    agg TP4 c4 0.9742
    agg TP4 c16 0.9742
    disagg 3P c700 0.9765
    disagg 3P c1228 0.9773
    disagg 5P c2884 0.9727
    disagg 7P c5540 0.9719
    disagg 9P c7480 0.9735
    • The largest sibling gap is 0.0054, within 2σ ≈ 0.009. The rows match the previous cohort for these keys (run 40989481011: 0.9719–0.9773).
    • Each disagg eval ran its own new override. For example, the c700 eval decode served max_running_requests: 288 and cuda_graph_max_bs_decode: 18.
  • Chat template: The AgentX client replays through the Dynamo chat endpoint. Both recipes set AIPERF_EXTRA_INPUTS={"chat_template_kwargs":{"reasoning_effort":"high","thinking":true},"temperature":1}, which is the thinking-on regime of the golden curve.

  • Draft precision:

    • The draft is the DSpark head bundled in deepseek-ai/DeepSeek-V4.1-Flash. The agg c1 and the disagg c700 prefill and decode logs show speculative_draft_model_path: deepseek-ai/DeepSeek-V4.1-Flash and Draft checkpoint bundles a DSpark head; loading draft arch DeepseekV4ForCausalLMDSpark, so no checkpoint is substituted.
    • Shipped precision: The checkpoint has quant_method: fp8 with weight_block_size: [32, 32] and scale_fmt: ue8m0, and expert_dtype: fp4. That is MXFP8 dense weights and MXFP4 experts, with BF16 norms, gate and markov, and F32 hc_*/attn_sink. By default, the pinned image loads the DSpark wo_a as BF16 and keeps markov_w2 in BF16 (SGLANG_DSPARK_OPT_MARKOV_W2_BF16 = EnvBool(True) in environ.py at the GB300 build commit 52604e1d).
    • Effective precision: It matches the shipped baseline. Agg c1 and disagg c700 prefill and decode all resolve dtype: auto, quantization: None, speculative_draft_model_quantization: None and speculative_draft_kv_cache_dtype: None, so the draft KV inherits the target's. kv_cache_dtype resolves to fp8_e4m3 on the disagg workers, which do not set it, so agg c1's explicit fp8_e4m3 restates the image default.
    • None of the other settings lowers draft precision:
      • SGLANG_ENABLE_NV_MEGA_RUNTIME_OPTIMIZATION=1 (agg c1) only changes scheduling and fusion defaults. The megakernel draft_* slots reuse the weights SGLang already loaded.
      • SGLANG_SPEC_TP_SYNC=rng,-dspark-accept-sample only selects which speculative decisions rank 0 broadcasts.
      • SGLANG_OPT_DEEPGEMM_MEGA_GATE runs the BF16 gate in a fused BF16 kernel.
      • SGLANG_DSV4_KV_LAYOUT=v41_new is a byte layout.
      • SGLANG_OPT_DSV41_ENGRAM_PEER_SHARDS changes where Engram rows are read from.
      • enable-fp32-lm-head raises precision.
    • SGLANG_NVFP4_CKPT_FP8_NEXTN_MOE: It is not enabled. It is absent from both recipes at be7bc6df, from the generated config.yaml and sbatch_script.sh, and from every worker log and config dump of agg c1 and disagg c700. environ.py at 52604e1d defines it as EnvBool(False).
  • Golden AL:

    • The agg c1 config dump and the c700 prefill and decode config dumps all show SGLANG_SIMULATE_ACC_LEN=3.51, SGLANG_SIMULATE_ACC_METHOD=match-expected and SGLANG_SIMULATE_ACC_TOKEN_MODE=real-draft-token.
    • This matches dsv41flash_dspark.yaml deepseek-v4.1-flash.thinking_on.5 = 3.51 for speculative-dspark-block-size: 5 with thinking on.
    • Measured mean accept length is 3.510 on agg TP4 c1 (5,297 decode lines) and 3.511 on the c700 decode (34,143 lines).
    • SGLANG_SIMULATE_ACC_GREEDY: '0' on agg c1 restates the EnvBool(False) default. The eval-only jobs run real acceptance.
  • MODELS.md: It lists dsv41flash Agentic coding (SGLang DSpark) as active, with no deprecated scenario.

  • Benchmark hacks and integer all-reduce:

    • There is no --hf-overrides, --json-model-override-args (it resolves to {}), model-config edit, layer skipping or indexer skipping.
    • EPLB with 16 redundant experts on decode only re-places experts. total_requests DP balancing only changes request placement. SGLANG_OPT_DSV41_BF16_INDEX_LOGITS changes only the storage dtype of the target indexer's top-k scores, and the disagg evals above cover it.
    • This is an NVIDIA CUDA path with no integer all-reduce control, and dsv41flash is an existing model.
  • Dynamo TRT-LLM metrics: N/A. These are dynamo-sglang configs, not Dynamo TRT-LLM.

  • Upstream image and main-branch provenance:

    • Both keys use lmsysorg/sglang:nightly-dev-cu13-20261030-302b78cc@sha256:d4b7701dc94d287e4fc135dfb4c1a88df0778a936255021aeb26eb54d396e579, an upstream lmsysorg nightly. The tag still resolves to that digest on Docker Hub today. Dynamo 1.7.0.dev20261029 is bundled (dynamo.install: false), and the worker config dumps report dynamo_version 1.7.0.dev20261029 and sglang_version 0.0.0.dev1+g52604e1d4.
    • GB300 runs the arm64 build. Its SGLANG_BUILD_COMMIT is 52604e1d46c1… (sgl-project/sglang actions run 40978821580).
    • Both 52604e1d and the tag commit 302b78cc are ancestors of sgl-project/sglang main (0 ahead; 406 and 412 behind).
  • Engine-first ordering: This is an SGLang (in-tree engine) entry, so the ordering rule is satisfied.

  • Upstream recipe:

    • Merged cookbook PR sgl-project/sglang#48392 (MERGED 2026-11-04T12:42:12Z) publishes this PR's head be7bc6df and the nightly-dev-cu13-20261030-302b78cc@sha256:d4b7701d… image. The file is docs/src/snippets/agentx/deepseek-ai/deepseek-v4_1.jsx on sglang main, shown in the SGLang DeepSeek-V4.1 cookbook, Agentic Long-Context Deployment section. Earlier revisions of these keys were published by #47027, #47214 and #47464, all merged.
    • It covers every affected point of both keys: agg override_tp4_c1, override_tp4_c4 and override_tp4_c16, and disagg override_3p1d_dep2_dep16_c700, override_3p1d_dep2_dep16_c1228, override_5p1d_dep2_dep16_c2884, override_7p1d_dep2_dep16_b96_c5540 and override_9p1d_dep2_dep16_b192_c7480. That includes the new per-point decode --max-running-requests, --cuda-graph-max-bs-decode, --disaggregation-decode-extra-slots and --load-balance-method total_requests.
    • For disaggregation, the cookbook gives the etcd and Dynamo frontend/router commands, the DEP2 HiCache prefill launch, the DEP16 decode launch, and the Mooncake transfer settings.
    • Agg: the TP4 c1 megakernel launch and its environment, and the Dynamo 1.7 DYN_BACKEND_ADMISSION_* limits.
    • @fabric.rdma-devices and {node} appear in the cookbook as $IB_DEVICES and $NODE_IP.
    • Excluded InferenceX-only settings have no production serving effect:
      • logging (PYTHONUNBUFFERED, PYTHONNOUSERSITE)
      • cluster plumbing (HF_HUB_CACHE, Slurm/srun/sbatch options, placement, health checks, the tachometer and otel-collector services)
      • the AIPERF_* client env
      • the SGLANG_SIMULATE_ACC_* synthetic-acceptance controls
  • No engine patches: At be7bc6df, neither recipe has a setup script, .patch, overlay, git apply, sed -i, site-packages edit or wheel install. Both use dynamo.install: false, so the sbatch Dynamo wheel prefetch branch does not run. The PR does not touch runners/srt-slurm/patches/, and there is no docs/waiver/4673.md.

  • append-only: N/A. The new changelog entry does not use append-only: true.

  • Removed points (Check 18g):

    • The PR removes agg TP2/EP2 c16, 8P c4096, and 9P c7480 at decode batch 160. Their last measurements come from main's pinned run 41081085818 ([NVIDIA][AgentX] Append GB300 DSV4.1-Flash Dynamo + SGLang TP2/EP2 c16 and 3P1D c1228 points (append-only, follows #4595) / [NVIDIA][AgentX] 追加 GB300 DSV4.1-Flash Dynamo + SGLang TP2/EP2 c16 和 3P1D c1228 点(仅追加,接续 #4595) #4679), read from the public unofficial-run API.
    • I ran signoff_facts.dominance from main (tput_per_gpu against mean_intvty) on the combined Dynamo + SGLang curve. undominated_removed is empty:
      • agg TP2/EP2 c16 (57,670 @ 377.4) lies under the segment from 3P c700 (226,225 @ 295.0) to agg TP4 c16 (29,353 @ 523.6).
      • 8P c4096 (803,198 @ 190.8) lies under the segment from 5P c2884 (715,623 @ 220.3) to 7P c5540 (1,014,363 @ 150.2).
      • 9P c7480 at batch 160 (1,094,347 @ 110.6) lies under the segment from 7P c5540 to 9P c7480 at batch 192 (1,113,381 @ 103.0). Treated as a re-tune of the same shape and concurrency instead, it changes by +1.74% throughput and −6.90% mean interactivity.
    • Re-tune deltas against run 41081085818 for the other kept points are within ±1.6% throughput and −3.1% to +0.9% mean interactivity: agg c1 −0.13%/−0.94%, agg c4 −1.51%/−0.61%, agg c16 −0.25%/−3.14%, 3P c1228 +0.08%/−0.27%, 5P c2884 +0.15%/+0.88%.
  • Pareto coverage:

    • There is one affected curve: dsv41flash / agentic-coding / gb300_dynamo-sglang / fp4 / run 41581664540, with agg and disagg points in one series.

    • Metrics are per_gpu.total_tput_tps against E2EL, from the 8 bmk_agentic_* artifacts, all on the PR image. Counts come from infx.workflows.pareto_coverage on main. Error-dropped records are 0–2 per point, far below the 10% failed-request threshold.

      Point GPUs P90 E2EL (s) P75 E2EL (s) tput/GPU
      agg TP4 c1 4 5.17 2.76 8,244
      agg TP4 c4 4 6.18 2.65 10,371
      agg TP4 c16 4 6.31 2.91 29,353
      3P1D c700 22 8.12 3.67 226,225
      3P1D c1228 22 9.13 4.30 383,628
      5P1D c2884 26 12.74 6.49 715,623
      7P1D c5540 30 20.58 11.88 1,014,363
      9P1D c7480 34 26.51 13.79 1,113,381
    • P90 E2EL: 8/8 frontier points.

    • P75 E2EL: 7/8 frontier points. Only agg TP4 c1 is off the frontier; agg TP4 c4 dominates it.

    • Both percentiles meet the 5-point recommendation.

Signed: nvpohanh

@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

✅✅✅ Verdict: PASS ✅✅✅

Passed and not applicable checks

✅ Check 0 (CODEOWNER): PASS — @nvpohanh is a named owner of inferencex-e2e/configs/nvidia-master.yaml and the **/gb300-*/ srt-slurm recipes; perf-changelog.yaml falls only under the * catch-all.

✅ Check 1 (Sweep on in-PR commit): PASS — Run Sweep 41581664540 (pull_request, head be7bc6df = pinned head, attempt 3 success): all 8 multi-node agentic / (incl. canary) and all 8 multi-node agentic eval / jobs succeeded; no commits after the validated SHA.

✅ Check 2 (Evals): PASS — eval_results_all on nightly-dev-cu13-20261030-302b78cc@sha256:d4b7701d…: gsm8k em_strict 0.9719–0.9773 across all 8 points (n=1319); max sibling gap 0.0053 vs 2σ 0.0123, every cohort gap vs run 40989481011 ok; config-only retune, and each new override has its own eval job.

✅ Check 3 (Upstream recipe): PASS — sgl-project/sglang#48392 MERGED 2026-11-04T12:42:12Z publishes deepseek-v4_1.jsx at provenance be7bc6df with the same image, agg TP4 c1/c4/c16, and disagg 3P c700 (decode BS 18/MRR 288/extra slots 27), 3P c1228, 5P c2884, 7P c5540 (BS 96/MRR 1536/extra slots 256), 9P c7480 (BS 192/MRR 3072/total_requests), plus the etcd, Dynamo frontend, prefill and decode commands; the exclusions listed in the sign-off are harness-only settings.

✅ Check 4 (Reuse command): PASS — /use 41581664540 posted by nvpohanh (COLLABORATOR) on its own line, naming the Check 1 run.

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

✅ Check 6 (Upstream image / ordering / provenance): PASS — lmsysorg/sglang upstream image for both dynamo-sglang keys (no ordering rule applies to Dynamo + SGLang); built by the scheduled sglang main build run 40978821580 (head 302b78cc), and both 302b78cc and 52604e1d are ancestors of sglang main (0 ahead).

✅ Check 7 (Deprecated models): PASS — MODELS.md lists dsv41flash Agentic coding (SGLang DSpark) as active, with no deprecated scenario.

✅ Check 8 (Benchmark hacks): PASS — no --hf-overrides, model-config edits, or layer/indexer skipping in either recipe; EPLB and DP balancing only change placement; SGLANG_OPT_DSV41_BF16_INDEX_LOGITS is covered by the passing disagg evals; this is a CUDA path with no integer all-reduce control, and dsv41flash is an existing model.

✅ Check 9 (Chat template): PASS — the AgentX client replays through the Dynamo chat endpoint with AIPERF_EXTRA_INPUTS chat_template_kwargs (thinking on, reasoning_effort high) in both recipes.

✅ Check 10 (Engine patches): PASS — at be7bc6df neither recipe has a setup script, patch, overlay, or wheel install, and both use dynamo.install: false; no waiver is needed.

✅ Check 11 (Golden AL): PASS — benchmark job logs show the connector applying SGLANG_SIMULATE_ACC_LEN=3.51 with match-expected and real-draft-token (agg role, and prefill and decode roles for c700), which equals dsv41flash_dspark.yaml thinking_on block size 5 = 3.51; the eval-only job applies no simulation.

➖ Check 12 (Append-only): N/A — the new changelog entry has no append-only: true.

✅ Check 13 (Draft precision): PASS — the draft is the DSpark head bundled in deepseek-ai/DeepSeek-V4.1-Flash; the recipes set no draft quantization, dtype, draft path, or NextN env; at 52604e1d, environ.py sets SGLANG_NVFP4_CKPT_FP8_NEXTN_MOE = EnvBool(False) and SGLANG_DSPARK_OPT_MARKOV_W2_BF16 = EnvBool(True), so the draft runs at the image's default precision.

✅ Check 14 (Pareto coverage): PASS — one curve, dsv41flash / agentic-coding / gb300_dynamo-sglang / fp4 / run 41581664540 (agg and disagg, 8 bmk_agentic_* artifacts, PR image, per_gpu.total_tput_tps vs E2EL); pareto_coverage gives P90 8/8 frontier points and P75 7/8.

✅ Check 15 (PR description): PASS — the body's per-point prefill count, concurrency, decode BS, MRR, and DP-balancing table matches the pinned recipes; its throughput figures are clearly labeled as off-sweep cluster runs or published values.

✅ Check 16 (NVIDIA overview): PASS — the NVIDIA overview Framework Recipes table lists DeepSeek-V4.1-Flash with a populated SGLang cell that links the SGLang DeepSeek-V4.1 cookbook.

➖ Check 17 (Metrics publication): N/A — dynamo-sglang configs, not Dynamo TRT-LLM.

✅ Check 18 (Recipe/image/sweep consistency): PASS — no generation errors; master and recipe agree (22/26/30/34 GPUs in results); the image digest resolves; changelog decode caps and the 7P base extra slots of 256 are accurate; on the combined agg+disagg curve, signoff_facts dominance covers every removed point (agg TP2/EP2 c16 under 3P c700–agg TP4 c16, 8P c4096 under 5P–7P, 9P b160 under 7P–9P b192); re-tune deltas are agg c1 −0.13%/−0.94%, c4 −1.51%/−0.61%, c16 −0.25%/−3.14%, 3P c1228 +0.08%/−0.27%, 5P c2884 +0.15%/+0.88% (tput/mean intvty).

Assessed commit: be7bc6df6bb01ad03aed970aa962bc002424694e.

@nvpohanh

nvpohanh commented Nov 5, 2026

Copy link
Copy Markdown
Collaborator

[by Claude Code] The SGLang cookbook update of this PR's AgentX configs (dsv41flash-fp4-gb300-dynamo-sglang-agentic-agg, dsv41flash-fp4-gb300-dynamo-sglang-agentic-dspark-disagg-hicache) will happen in sgl-project/sglang#48634, in the Agentic Long-Context Deployment section of the DeepSeek-V4.1 cookbook page. The configs have been live in that section since sgl-project/sglang#48392; sgl-project/sglang#48634 refreshes them with the pin below.

The commands mirror the launch measured in run 41581664540, pinned by this PR's /use comment.

@nvpohanh

nvpohanh commented Nov 5, 2026

Copy link
Copy Markdown
Collaborator

[by Claude Code] sgl-project/sglang#48634 has been merged. This PR's AgentX configs (dsv41flash-fp4-gb300-dynamo-sglang-agentic-agg, dsv41flash-fp4-gb300-dynamo-sglang-agentic-dspark-disagg-hicache) are now in the Agentic Long-Context Deployment section of the SGLang DeepSeek-V4.1 cookbook: https://docs.sglang.io/cookbook/autoregressive/DeepSeek/DeepSeek-V4_1#agentic-long-context-deployment

The commands mirror the launch measured in run 41581664540, pinned by this PR's /use comment.

# Conflicts:
#	inferencex-e2e/perf-changelog.yaml
@nvpohanh
nvpohanh merged commit a117e48 into main Nov 6, 2026
30 checks passed
@nvpohanh
nvpohanh deleted the weireweire/dsv41flash-gb300-sgl-disagg-pareto branch November 6, 2026 01:38
@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

Ingest report — ✅ Results ingested into the production database.

Ingest workflow · Merge Ingest run · Benchmark source run

Category new duplicate skipped unmapped failed
benchmark 8 0 8 0 0
eval 8 8 0 0 0
trace 8 0 0 0 0
power 0 0 8 0 0

benchmarkFiles 9, rawBenchmarkRows 16, coveredByPerJobFiles 8, purgedPoints 0, failedRunRows 0, runStatsNew 0, runStatsDuplicate 0, evalSamplesNew 10552, gpuMetricSamplesNew 0, powerPublicationPoints 8, changelogEntriesWritten 1

Counts cover only this run. Rows: benchmark_results, eval_results, agentic rows linked to a trace, gpu_metrics series. This comment updates if the ingest is rerun.

中文

Ingest 报告 — ✅ 结果已写入 production 数据库。

上表仅统计本次运行写入的数据,各行单位依次为 benchmark_results 行、eval_results 行、已关联 trace 的 agentic 行和 gpu_metrics 序列。重新运行 ingest 时本评论会原地更新。

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

Labels

full-sweep-enabled Full sweep with canary gate; matrix jobs run to completion despite failures

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants