Skip to content

[NVIDIA][AgentX] Move GB300 DSV4.1-Flash Dynamo + SGLang to the bonus-fixed nightlies with prefill-HiCache disagg points and TP4 c1 megakernel / [NVIDIA][AgentX] GB300 DSV4.1-Flash Dynamo + SGLang 升级到含 bonus 修复的 nightly,分离式改用 prefill HiCache,TP4 c1 启用 megakernel - #4595

Open
weireweire wants to merge 12 commits into
mainfrom
weireweire/dsv41flash-gb300-sgl-disagg-hicache

Conversation

@weireweire

@weireweire weireweire commented Oct 28, 2026 •

Copy link
Copy Markdown
Collaborator

Move the GB300 DeepSeek-V4.1-Flash Dynamo + SGLang AgentX curve to nightlies that include sgl-project/sglang#46404: the disaggregated points to digest-pinned lmsysorg/sglang:nightly-dev-cu13-20261028-586355a8 and the aggregated points to nightly-dev-cu13-20261029-c10e0e17 (below). The 586355a8 image bundles Dynamo 1.7.0.dev20261027 and SGLang 0.0.0.dev1+g586355a83. #46404 draws the DSpark simulated-acceptance bonus at the simulated row instead of the real mismatch row. No SGLang engine patch is added.

The disaggregated points move to a new key, dsv41flash-fp4-gb300-dynamo-sglang-agentic-dspark-disagg-hicache, whose prefill uses a local host-DRAM HiCache tier instead of the Mooncake external linker. The existing dsv41flash-fp4-gb300-dynamo-sglang-agentic-dspark-disagg key (nightly-dev-cu13-20261025-65633129, which predates #46404) and its disagg-variants.yaml recipe are retired.

Prefill Decode Concurrency Decode CUDA graph max BS (per rank) Decode max-running-requests
5 × DEP2 1 × DEP16 2884 40 640
8 × DEP2 1 × DEP16 4096 64 1024
9 × DEP2 1 × DEP16 7480 160 2560

Removed points. The retired key's published points were measured on 65633129, before #46404. Each one is covered by this PR's points on the same Dynamo + SGLang curve (tput_per_gpu @ mean_intvty; head values are our 1200 s runs, which understate the sweep):

Retired point Published Covered by
c4096 654,247 @ 154.6 8 × DEP2 c4096, 692,348 @ 189.7 (dominates)
c2884 573,579 @ 194.6 5 × DEP2 c2884, 619,465 @ 220.8 (dominates)
c1228 367,046 @ 247.5 the segment from agg TP4 c16 (published 29,353 @ 561.8) to 5 × DEP2 c2884, which is about 573,000 at 247.5

c1228 is not carried over. It also sat under the published curve's own line from agg TP2/EP2 c16 (58,177 @ 401.6) to c2884 (about 442,000 at 247.5).

Why this recipe:

  • Prefill uses a local host-DRAM HiCache tier (hicache-ratio 1.2, write-back, direct I/O, mem-fraction-static 0.85, 64 running requests per DP rank) instead of the Mooncake external linker.
    • With the linker, an L3 hit is read layer by layer at forward time with one blocking get per layer, so the forward waits on it.
    • At c7480, the client's turn burst in minutes 6-8 builds deep prefill queues. Device-radix prefixes then age out, L3 reloads grow, and prefill stalls (inter-batch gaps were about 40 % of wall time) and does not recover.
    • With the host tier, evicted prefixes reload from local DRAM, off the forward path. Prefill drains after the burst, and the prompt hit rate reaches 0.966 (theoretical 0.971).
  • Memory fractions follow the image's KV sizing. On this image the DSv4 KV pool sizes at about 890 B/token, so the same fraction holds about 1.8× more tokens than on earlier nightlies.
    • At hicache-ratio 1.8, the host mirror of that larger pool exceeds node memory.
    • At decode mem-fraction-static 0.85, decode runs out of memory during CUDA graph capture; 0.75 leaves the headroom capture needs.
  • Decode admits transferred requests every step, keeping SGLang's default disaggregation-decode-polling-interval of 1; the retired key set 8. At 8, each admission batch stalled the decode loop about 2 ms.
  • Dynamo 1.7 compatibility.
  • The Mooncake store and master services are not started; without the linker nothing reads them. Mooncake still carries the prefill-to-decode KV transfer.

Aggregated row: dsv41flash-fp4-gb300-dynamo-sglang-agentic-agg moves to digest-pinned nightly-dev-cu13-20261029-c10e0e17 (Dynamo 1.7.0.dev20261028, SGLang 0.0.0.dev1+gc10e0e177).

Throughput gain at the same p90 interactivity (tok/s/GPU). Our points were measured on our GB300 cluster 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 vs vLLM
5 × DEP2, c2884 1200 s 619,465 233.6
8 × DEP2, c4096 1200 s 692,348 192.4
9 × DEP2, BS 160, c7480 3600 s 1,104,326 107.1 +10.1 %

At p90 107.1, the vLLM frontier lies between 1,011,514 @ 75.5 and 993,521 @ 145.6, which gives 1,003,413. The 1200 s values understate a 3600 s run by a factor of about 1.17-1.20 at these concurrencies, but even after that, c2884 and c4096 stay below vLLM's c10888 point (954,146 @ 196.5).

Validation details

All runs used the image above 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 the unused Mooncake services. The 1200 s runs had 0 request errors; the 3600 s run had 3 empty responses out of about 1.05M requests.

Point Run Throughput @ p90 TTFT p90 Prompt hit rate (theoretical)
5 × DEP2, c2884 1200 s 619,465 @ 233.6 4.9 s 0.964 (0.968)
8 × DEP2, c4096 1200 s 692,348 @ 192.4 5.1 s 0.963 (0.967)
9 × DEP2, BS 160, c7480 3600 s 1,104,326 @ 107.1 8.7 s 0.966 (0.971)
  • The 9 × DEP2 point ran a decode batch of about 159 per rank with a 29.8-30.1 ms step and accept length 3.50.
  • 10 × DEP2 at the same decode BS 160 gave 1,051,622 @ 106.5 (3600 s): the same interactivity with two more GPUs, so 9 × DEP2 is used.
  • 10 × DEP2 at decode BS 128 gave 825,382 @ 122.4 in 1200 s, about 957-990k after the 1200 s → 3600 s factor, below the vLLM frontier at that interactivity (about 999k), so it is not included.
中文

将 GB300 DeepSeek-V4.1-Flash Dynamo + SGLang AgentX 曲线换到包含 sgl-project/sglang#46404(DSpark 模拟接受的 bonus 改在模拟位置采样)的 nightly:分离式点用固定 digest 的 lmsysorg/sglang:nightly-dev-cu13-20261028-586355a8(Dynamo 1.7.0.dev20261027、SGLang 0.0.0.dev1+g586355a83),聚合式点用 nightly-dev-cu13-20261029-c10e0e17(见下)。不添加 SGLang 引擎补丁。

  • 分离式: 新 key dsv41flash-fp4-gb300-dynamo-sglang-agentic-dspark-disagg-hicache,DEP2 prefill 加一个 DEP16 decode。
    • 5 × DEP2 跑 c2884(decode 每 rank CUDA graph max BS 40)。
    • 8 × DEP2 跑 c4096(BS 64)。
    • 9 × DEP2 跑 c7480(BS 160,max-running-requests 2560)。
  • 退役旧 key: 旧的 dspark-disagg key(65633129,早于 #46404)及其 disagg-variants.yaml recipe 退役。它已发布的三个点都被本 PR 的点覆盖(按 tput_per_gpu 与 mean_intvty):c4096 和 c2884 分别被 8 × DEP2 和 5 × DEP2 支配;c1228(367,046 @ 247.5)低于 agg TP4 c16 到 5 × DEP2 c2884 的连线(在 247.5 处约 573,000),因此不保留。
  • Prefill 缓存: 用本地主机内存 HiCache 层(hicache-ratio 1.2、write-back、direct I/O、mem-fraction-static 0.85、每个 DP rank 64 个运行请求)替代 Mooncake external linker。
    • linker 在前向时逐层阻塞读取 L3,c7480 的突发请求之后 prefill 会停住,且无法恢复。
    • 改用主机内存层后,被逐出的前缀从本地内存读回,不在前向路径上。突发后 prefill 能排空,命中率 0.966(理论值 0.971)。
  • 显存比例: 该镜像的 KV 每 token 约 890 B,相同比例下 KV pool 约为之前的 1.8 倍。
    • hicache-ratio 1.8 时主机镜像超出节点内存,改为 1.2。
    • decode mem-fraction-static 0.85 时,CUDA graph capture 阶段 OOM,改为 0.75。
  • Decode 准入: decode 每步接收已传输的请求(默认 polling interval 1);旧 key 设为 8 时,每批准入让 decode 停顿约 2 ms。
  • 不再启动 Mooncake store 和 master 服务(没有 linker 就没有读取方);prefill 到 decode 的 KV 传输仍走 Mooncake。
  • Dynamo 1.7 兼容:
  • 聚合式: 聚合式 key 换到固定 digest 的 nightly-dev-cu13-20261029-c10e0e17(Dynamo 1.7.0.dev20261028)。该镜像自带 sgl-nvidia-mega 54b428921749(megakernel API 2,[Fix] docker: update NVIDIA megakernel pin to tested commit sgl-project/sglang#47145),TP4 c1 重新启用 --enable-nvidia-megakernel,4 个 TP rank 上 target 和 draft megakernel 均生效。TP4 c1 原先逐个设置的 16 个 megakernel 运行时优化变量改为 SGLANG_ENABLE_NV_MEGA_RUNTIME_OPTIMIZATION=1([Feat] [NVIDIA] runtime: Add a master switch for megakernel runtime optimizations sgl-project/sglang#47105);该开关同时打开 Qwen3.5/EAGLE 那组优化,在此路径上大多不生效。SIM_DRAW_AHEAD、模拟设置、megakernel slots、Engram 和 NCCL 设置仍显式指定。放开 admission 上限;删除 TP2/EP2 c16,TP4 c4/c16 配置不变。

同交互性(p90 interactivity)下相对 vLLM 的吞吐提升: 数据在我们的 GB300 集群上用本 PR 的配方测得,不是本 PR 的 sweep;在这些并发下,3600 s 结果约为 1200 s 的 1.17-1.20 倍。vLLM 用已发布的 Dynamo + vLLM 与 vLLM 点的 Pareto 前沿,在相同交互性处线性插值。

点 时长 吞吐 @ p90 相对 vLLM
9 × DEP2、BS 160、c7480 3600 s 1,104,326 @ 107.1 +10.1%(vLLM 插值 1,003,413)
5 × DEP2、c2884 1200 s 619,465 @ 233.6 无提升
8 × DEP2、c4096 1200 s 692,348 @ 192.4 无提升

c2884 和 c4096 即使换算到 3600 s,也低于 vLLM 的 c10888 点(954,146 @ 196.5)。

AI model disclosure
  • Claude Opus 5.5 (runtime identifier aws/anthropic/eccn-claude-opus-5-5) investigated the bottleneck, ran the cluster experiments through delegated agents on the same model, wrote the recipe, master config, changelog entry and this description, and ran an independent review of the diff through a separate delegated agent on the same model.

…HiCache

Root cause: at c7480 the Mooncake external linker reads L3 hits layer by
layer on the forward path; after the AgentX turn burst, prefill stalls on
those reads (about 40 % of wall time), device prefixes age out, and the
deployment does not recover.

Fix: a new config key on nightly-dev-cu13-20261027-5884e4fe (Dynamo
1.7.0.dev20261026) with 9 and 10 DEP2 prefill workers and one DEP16
decode. Prefill keeps evicted prefixes in a local host-DRAM HiCache tier
(ratio 1.8, write-back, direct I/O); decode keeps SGLang's default polling
interval of 1. Dynamo 1.7 backend admission limits are raised so turns
queue in the scheduler, and NVIDIA/srt-slurm#629 is backported so the
readiness wait asks /health?instances=true when /health is status-only.
The agg and dspark-disagg keys are listed so they rerun in the same sweep.

Validation: on GB300 with the same recipe and AgentX client, 10 x DEP2
batch 128 gave 924,652 tok/s/GPU at p90 117.2 tok/s/user over 3600 s.
Comment on lines +9767 to +9781
- spec-decoding: mtp
conc-list: [7480]
srt-recipe: disagg-dep16-hicache-variants.yaml:override_10p1d_dep2_dep16_b160_c7480
kv-offloading: dram
kv-offload-backend: { name: hicache }
prefill:
num-worker: 10
tp: 2
ep: 2
dp-attn: true
decode:
num-worker: 1
tp: 16
ep: 16
dp-attn: 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.

🔴 If either 10-prefill c7480 job of a sweep is rerun, the other 10-prefill job's result is dropped. Klaud's coverage check then fails the sweep. Rows override_10p1d_dep2_dep16_c7480 and override_10p1d_dep2_dep16_b160_c7480 differ only by recipe. They share every field of agentic_key (infx/results/artifacts.py:123), so superseded_attempt_files treats one as a retry of the other. Fix: give each row its own result identity, e.g. key superseded_attempt_files on recipe_fingerprint plus conc, the identity check_coverage already uses.

Why this was flagged

The two rows at nvidia-master.yaml:9752-9781 have the same prefill (10 x tp2 ep2 dpa), decode (1 x tp16 ep16 dpa), conc 7480, spec mtp and kv-offload-backend {name: hicache}. agentic_key (infx/results/artifacts.py:123-168) is built only from those fields, so both point results get the same key. superseded_attempt_files (artifacts.py:197-215) drops any file whose rows all have an older run_attempt than the latest attempt for that key. Klaud recovery POSTs rerun-failed-jobs (infx/klaud/lifecycle.py:705) after a failure or preemption, and only the failed job reruns. Say the b160 job reruns as attempt 2 while the b128 point finished in attempt 1. agentic_point_files (artifacts.py:188-194) then discards the b128 file. check_coverage (infx/klaud/validation.py:307-320) expects (recipe_fingerprint, 7480, image) for both rows and raises "Full-sweep result coverage or consistency failed". RESULT_FILENAME adds the recipe fingerprint, which keeps artifact names distinct, but the superseding logic never reads that fingerprint.

Verification: The rows override_10p1d_dep2_dep16_c7480 and override_10p1d_dep2_dep16_b160_c7480 in configs/nvidia-master.yaml differ only in srt-recipe. agentic_key (infx/results/artifacts.py:123-168) leaves out recipe_fingerprint. On the base branch these rows do not exist, so the failure is new.

@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 任务通过。临时性失败通常可以通过重新运行恢复;参见重新运行失败任务的说明。

@Oseltamivir
Oseltamivir removed the request for review from Steven0706 October 28, 2026 04:02
…6-hicache

# Conflicts:
#	inferencex-e2e/perf-changelog.yaml
…ightly and drop TP2/EP2 c16

nightly-dev-cu13-20261028-586355a8 includes sgl-project/sglang#46404. Raise the Dynamo 1.7 backend admission limits as on the disagg rows. TP2/EP2 c16 sits far below the line from TP4 c16 to the disaggregated points, so it is removed with its override.
@nvpohanh

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#47027, 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 (e480515ce) as "in progress". A later cookbook PR switches it to the measured run once a run is pinned or this PR merges.

@nvpohanh

Copy link
Copy Markdown
Collaborator

[by Claude Code] sgl-project/sglang#47027 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 (e480515ce) as "in progress". A later cookbook PR switches it to the measured run once a run is pinned or this PR merges.

… 20261028 nightly and retire the Mooncake-linker disagg key

The hicache key now runs on nightly-dev-cu13-20261028-586355a8, which includes
sgl-project/sglang#46404. On that image the KV pool sizes at 890 B/token, so
hicache-ratio drops to 1.2 (1.8 exceeds host memory) and decode
mem-fraction-static to 0.75 (0.85 runs out of memory at graph capture).

Points: 5P c2884 (bs40), 8P c4096 (bs64) and 10P c7480 (bs160). The 9P and 10P
bs128 c7480 points are dropped; bs160 is higher at the same interactivity. The
dspark-disagg key on 65633129 and its recipe are retired.
At decode batch 160, 9 x DEP2 reaches the same p90 interactivity as 10 x DEP2
with two fewer GPUs, so its throughput per GPU is higher.
@weireweire weireweire changed the title [NVIDIA][AgentX] Add GB300 DSV4.1-Flash SGLang DEP16 disagg points at c7480 with prefill HiCache / [NVIDIA][AgentX] 新增 GB300 DSV4.1-Flash SGLang DEP16 分离式 c7480 点(prefill HiCache) [NVIDIA][AgentX] Move GB300 DSV4.1-Flash Dynamo + SGLang to the 20261028 nightly with prefill-HiCache disagg points / [NVIDIA][AgentX] GB300 DSV4.1-Flash Dynamo + SGLang 升级到 20261028 nightly,分离式改用 prefill HiCache Oct 28, 2026
…6-hicache

# Conflicts:
#	inferencex-e2e/perf-changelog.yaml
…ightly and use the megakernel runtime-optimization switch at TP4 c1

nightly-dev-cu13-20261029-c10e0e17 bundles sgl-nvidia-mega 54b428921749
(megakernel API 2, sgl-project/sglang#47145), so TP4 c1 starts with
--enable-nvidia-megakernel again. SGLANG_ENABLE_NV_MEGA_RUNTIME_OPTIMIZATION
(sgl-project/sglang#47105) replaces the 16 runtime-optimization variables the
recipe set one by one.
@weireweire weireweire added the full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended) label Oct 29, 2026
@weireweire weireweire changed the title [NVIDIA][AgentX] Move GB300 DSV4.1-Flash Dynamo + SGLang to the 20261028 nightly with prefill-HiCache disagg points / [NVIDIA][AgentX] GB300 DSV4.1-Flash Dynamo + SGLang 升级到 20261028 nightly,分离式改用 prefill HiCache [NVIDIA][AgentX] Move GB300 DSV4.1-Flash Dynamo + SGLang to the bonus-fixed nightlies with prefill-HiCache disagg points and TP4 c1 megakernel / [NVIDIA][AgentX] GB300 DSV4.1-Flash Dynamo + SGLang 升级到含 bonus 修复的 nightly,分离式改用 prefill HiCache,TP4 c1 启用 megakernel Oct 29, 2026
@nvpohanh

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#47214, 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#47027; sgl-project/sglang#47214 refreshes them with the pin below.

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

@nvpohanh

Copy link
Copy Markdown
Collaborator

[by Claude Code] sgl-project/sglang#47214 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 (1b0252fcc) as "in progress". A later cookbook PR switches it to the measured run once a run is pinned or this PR merges.

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