Skip to content

[NV] Add B300 DeepSeek-V4-Pro AgentX with SGLang DSpark6 / 使用 SGLang DSpark6 新增 B300 DeepSeek-V4-Pro AgentX - #2624

Closed
weireweire wants to merge 22 commits into
mainfrom
perf/dsv4-b300-dspark-agentx
Closed

[NV] Add B300 DeepSeek-V4-Pro AgentX with SGLang DSpark6 / 使用 SGLang DSpark6 新增 B300 DeepSeek-V4-Pro AgentX#2624
weireweire wants to merge 22 commits into
mainfrom
perf/dsv4-b300-dspark-agentx

Conversation

@weireweire

@weireweire weireweire commented Aug 16, 2026

Copy link
Copy Markdown
Collaborator

Summary / 概要

Adds an independent B300 DeepSeek-V4-Pro DSpark6 AgentX submission using Dynamo-SGLang, following the GB300 tuning in #2623 without depending on that PR.

新增独立的 B300 DeepSeek-V4-Pro DSpark6 AgentX 提交,使用 Dynamo-SGLang,并参考 #2623 的 GB300 调优,但不依赖该 PR。

  • Adds aggregate DEP4 and DEP8 recipes with Dynamo session-affinity routing and HiCache host offload.

  • Adds the B300 AgentX sweep: DEP4 concurrency 48/64 and DEP8 concurrency 128/256/384/512/576.

  • Uses the DSpark6 checkpoint, SGLang image, 8K prefill window, 0.02 SWA cache ratio, and synthetic acceptance length 3.77.

  • Keeps real draft/verify behavior for eval-only runs.

  • 新增带 Dynamo 会话亲和路由及 HiCache 主机卸载的 DEP4、DEP8 聚合 recipe。

  • 新增 B300 AgentX sweep:DEP4 并发 48/64,DEP8 并发 128/256/384/512/576。

  • 使用 DSpark6 checkpoint、SGLang 镜像、8K prefill、0.02 SWA cache ratio,以及 3.77 合成验收长度。

  • eval-only 运行仍使用真实 draft/verify。

Validation / 验证

  • Bash syntax check / Bash 语法检查
  • YAML parsing for the master config and both recipes / master 配置及两个 recipe 的 YAML 解析
  • Git whitespace check / Git 空白检查

Independence / 独立性

The PR targets main directly. Its final diff contains only the B300 recipes, B300 runner support, master sweep entry, tokenizer mount support, and changelog entry; no GB300 configuration changes are included.

本 PR 直接以 main 为 base。最终差异只包含 B300 recipe、B300 runner 支持、master sweep 配置、tokenizer 挂载支持和 changelog,不包含任何 GB300 配置改动。

Root cause:
- The GB300 DeepSeek-V4-Pro AgentX matrix still used the older EAGLE/MTP serving path and an outdated SGLang nightly.
- The previous draft targeted vLLM recipes instead of the existing SGLang topology ladder.

Fix:
- Replace the SGLang aggregate and disaggregated GB300 recipes with DSpark block size 6 on DeepSeek-V4-Pro-DSpark.
- Use nightly-dev-cu13-20260816-4a6dc267, which already includes the required DSpark performance and MegaMoE support, without a runtime patch overlay.
- Force thinking-on AL 3.82 with static ragged verification, retain MegaMoE on DEP workers, and set the 8P4D throughput endpoint to concurrency 1536.

Validation:
- Passed srtctl dry-run for all seven recipes.
- Passed 224 matrix and schema tests.
- Generated the eight targeted matrix jobs at concurrency 1, 4, 8, 32, 192, 400, 640, and 1536.

中文:将 GB300 DeepSeek-V4-Pro AgentX 的 SGLang 配置从 EAGLE/MTP 更新为 DSpark6,使用已包含所需上游修复的 20260816 nightly,不再注入补丁;固定 AL 3.82 与 static ragged verify,并将 8P4D 吞吐端点设为并发 1536。七份 recipe dry-run、224 项矩阵与 schema 测试以及八个目标矩阵任务生成均已通过。
Root cause:
- The InferenceX port hard-coded SGLANG_SIMULATE_ACC_* in every recipe instead of carrying NVIDIA InferenceMAX PR #214 throughput-only master-config injection.
- Eval-only launch therefore skipped the injector but still inherited synthetic acceptance from the checked-in recipe.
- The DSpark AL 3.82 source curve and the focused injection regression tests were also omitted.

Fix:
- Keep SGLANG_RAGGED_VERIFY_MODE=static in all six recipes while moving synthetic AL 3.82 into each throughput search-space entry.
- Commit the probabilistic DeepSeek-V4-Pro-DSpark golden curve from Actions run 31279568355 and reference it from the bilingual index and performance changelog.
- Add tests covering all six recipes, throughput injection, eval preservation, launcher ordering, DSpark6 parameters, tokenizer paths, and the committed golden value.

Validation:
- Passed matrix, schema, changelog, runner, and synthetic-acceptance tests.
- Generated seven throughput points and four eval-only points at the intended concurrencies.
- Passed YAML parsing, changelog validation, formatting checks, and git diff checks.

中文:将模拟接受长度改为仅在吞吐测试启动时注入,精度评测继续使用真实 DSpark 验证;同时补充黄金 AL 曲线、模型路径映射和回归测试,并删除表现不佳的 c32 点。
Root cause: SemiAnalysis InferenceX lacked the validated B300 Dynamo-SGLang DSpark6 AgentX configurations, including session-affinity routing and sufficient host HiCache capacity for DEP4 and DEP8.\n\nFix: add DEP4/DEP8 aggregate recipes, the B300 master sweep, DSpark checkpoint selection, srt-slurm v1.0.38 overlay, serialized image imports, workspace/tokenizer mounts, and the shared synthetic-acceptance injector used by GB300.\n\nValidation: bash syntax, YAML parsing, and git diff whitespace checks pass.\n\n根因:SemiAnalysis InferenceX 缺少已验证的 B300 Dynamo-SGLang DSpark6 AgentX 配置,包括会话亲和路由,以及 DEP4/DEP8 所需的主机端 HiCache 容量。\n\n修复:新增 DEP4/DEP8 聚合 recipe 与 B300 master sweep,并加入 DSpark checkpoint 选择、srt-slurm v1.0.38 overlay、镜像导入串行化、workspace/tokenizer 挂载,以及与 GB300 共用的合成验收率注入逻辑。\n\n验证:Bash 语法、YAML 解析及 git diff 空白检查均通过。
@github-actions

Copy link
Copy Markdown
Contributor

Thanks for the contribution! Please reach out to respective companies' CODEOWNER to fill in the latest PR_REVIEW_CHECKLIST.md before pinging core maintainer on Slack for review. In order for the signoff PR check bot to trigger, you must follow the PR_REVIEW_CHECKLIST.md template correctly, including the phrase As a PR reviewer and CODEOWNER, I have reviewed this and have.

For PR verification, add the full-sweep-fail-fast label (strongly recommended) to this PR — the benchmark sweep only runs on labeled PRs. Use full-sweep-enabled only if you need matrix jobs to keep running past a failure.

PR authors are responsible for ensuring that after merging, all GitHub Action jobs fully pass. A lot of the time, failures are just flakes and simply re-running the failed jobs will fix it. See GitHub's docs on re-running failed jobs


感谢你的贡献!请联系相应公司的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,然后再在 Slack 上联系核心维护者进行审阅。为了触发 signoff PR 检查机器人,你必须正确遵循 PR_REVIEW_CHECKLIST.md 模板,包括保留英文语句 As a PR reviewer and CODEOWNER, I have reviewed this and have

如需进行 PR 验证,请为此 PR 添加 full-sweep-fail-fast 标签(强烈推荐)— 基准测试 sweep 仅在带有标签的 PR 上运行。仅当需要矩阵任务在失败后继续运行时才使用 full-sweep-enabled

PR 作者有责任确保合并后所有 GitHub Action 任务完全通过。 很多时候失败只是偶发抖动(flake),重新运行失败的任务即可解决。参见 GitHub 关于重新运行失败任务的文档

Root cause: the new B300 performance key was not yet registered in the append-only performance changelog.\n\nFix: append the B300 DSpark6 Dynamo-SGLang AgentX configuration and PR link.\n\nValidation: YAML parsing and git diff whitespace checks pass.\n\n根因:新的 B300 性能配置键尚未登记到只追加的性能变更日志。\n\n修复:追加 B300 DSpark6 Dynamo-SGLang AgentX 配置及 PR 链接。\n\n验证:YAML 解析及 git diff 空白检查均通过。
@weireweire
weireweire marked this pull request as ready for review August 16, 2026 16:05
@claude

claude Bot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Claude finished @weireweire's task in 8m 48s —— View job


Review of PR #2624 — 1 blocking issue, 1 warning

  • Gather context and diff against base perf/dsv4-gb300-dspark-agentx
  • Review recipe YAMLs, master config, launcher, and benchmark_lib changes
  • Validate per repo review checklist (perf-changelog position, images, MTP flags, enroot import)
  • Post inline comments and summary

Findings

🔴 BLOCKINGconfigs/nvidia-master.yaml:8559: the new dsv4-fp4-b300-dynamo-sglang-agentic-mtp-agg block is inserted in the middle of glm5.1-fp8-b200-tilert's fixed-seq-len scenario list. The tilert isl: 8192 point re-attaches to the new config's agentic-coding list — the glm5.1 B200 tilert config silently loses its 8k1k benchmark point, and the B300 AgentX sweep gains a bogus entry with no CONFIG_FILE that will fail at launch. The YAML still parses, so the PR's YAML-parse validation didn't catch it. Fix: move the whole block to the end of the file. (inline comment)

🟡 WARNING — both new recipes omit SGLANG_DSV4_REASONING_EFFORT: high, which every existing DSV4 AgentX recipe (GB300 agg/disagg, H200) sets. This changes the generation profile vs. the GB300 results this PR claims parity with, and the golden AL 3.82 was measured at effort high. Suggested one-line fixes posted inline on both files.

Checked and OK

  • perf-changelog.yaml updated alongside the master config, entry correctly appended at the end of the file.
  • Container image lmsysorg/sglang:nightly-dev-cu13-20260816-4a6dc267 is a public Docker Hub reference; Dynamo hash and srt-slurm v1.0.38 are pinned.
  • The launcher keeps the enroot import ... docker:// pattern and improves it with flock-serialized, validity-checked imports; the new DSpark model-path branch is reachable (the earlier SELECTED_MODEL_PATH branch is dynamo-vllm-only), and the new agentic clone branch can't hijack existing B300 agentic configs (they use sglang/vllm, not dynamo-sglang).
  • inject_synthetic_acceptance exists in slurm_utils.sh with a registered dynamo-sglang backend whose regex matches the new recipes' aggregated_environment: block; eval-only runs keep real draft/verify per the base branch's gating.
  • The benchmark_lib.sh --tokenizer addition is the intended consumer of INFMAX_AIPERF_TOKENIZER, which the GB300 recipes on the base branch already set.

One note (not blocking): the DEP4 recipe uses gpus_per_node: 4 while every other B300 recipe uses 8 (B300 HGX nodes have 8 GPUs; the value looks carried over from the 4-GPU-per-node GB300 recipe). With agg_nodes: 1 / gpus_per_agg: 4 explicit it should still allocate correctly, and the recipe comments cite B300-measured values, so it appears deliberate half-node usage — worth confirming that's intended for TCO/per-GPU accounting.

additional-settings:
- "DECODE_NODES=1"

dsv4-fp4-b300-dynamo-sglang-agentic-mtp-agg:

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.

🔴 BLOCKING: This new config block is inserted in the middle of glm5.1-fp8-b200-tilert's fixed-seq-len scenario list, splitting it in two.

Why it matters: The tilert config's second point (- isl: 8192 / osl: 1024, now at lines 8609–8628) sits at the same 4-space indent as this config's agentic-coding: list items, so YAML re-attaches it as a third entry of dsv4-fp4-b300-dynamo-sglang-agentic-mtp-agg's agentic-coding scenario. Two concrete breakages:

  1. glm5.1-fp8-b200-tilert silently loses its 8k1k benchmark point from the matrix.
  2. The new B300 AgentX config gains a bogus fixed-seq-len-shaped entry carrying tilert settings (tp: 8, ep: 1, PREFILL_IMAGE=vllm/vllm-openai:v0.26.0, DECODE_NODES=1) and no CONFIG_FILE — when the sweep reaches it, launch_b300-nv.sh exits with Error: CONFIG_FILE is not set (or the matrix generator chokes on isl/osl inside agentic-coding first).

The file still parses as valid YAML, which is why the PR's YAML-parse validation didn't catch it.

Fix: Move the entire dsv4-fp4-b300-dynamo-sglang-agentic-mtp-agg block (lines 8558–8608) to the end of the file, after the glm5.1 config's final - "DECODE_NODES=1" (line 8628).

Fix this →

Comment on lines +8558 to +8583

dsv4-fp4-b300-dynamo-sglang-agentic-mtp-agg:
image: lmsysorg/sglang:nightly-dev-cu13-20260816-4a6dc267
model: deepseek-ai/DeepSeek-V4-Pro-DSpark
model-prefix: dsv4
runner: cluster:b300-nv
precision: fp4
framework: dynamo-sglang
router: { name: dynamo-router, version: "7a4e47ead90ec6b479e397996f6479ce7d251510" }
multinode: true
disagg: false
scenarios:
agentic-coding:
- dram-utilization: 0.95
search-space:
- spec-decoding: draft_model
conc-list: [48, 64]
kv-offloading: dram
kv-offload-backend: { name: hicache }
prefill:
num-worker: 1
tp: 4
ep: 4
dp-attn: true
additional-settings:
- "SYNTHETIC_ACCEPTANCE=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.

🔴 The new dsv4-fp4-b300-dynamo-sglang-agentic-mtp-agg block (configs/nvidia-master.yaml:8558-8583) is inserted mid-list inside glm5.1-fp8-b200-tilert's fixed-seq-len scenario, right before its pre-existing - isl: 8192 item. Since that item sits at the same 4-space indent as the new block's - dram-utilization: 0.95 item, YAML re-parents it into the new agentic-coding list — corrupting both configs: the new B300 AgentX sweep gains a bogus fixed-seq-len-style scenario carrying incompatible vllm PREFILL_IMAGE settings, and glm5.1-fp8-b200-tilert silently loses its isl:8192/osl:1024 sweep point. Fix by moving the new top-level key to after the complete glm5.1 entry (i.e. after - isl: 8192 ... DECODE_NODES=1).

Extended reasoning...

What the bug is: In configs/nvidia-master.yaml, the new top-level key dsv4-fp4-b300-dynamo-sglang-agentic-mtp-agg is inserted at line 8558, in the middle of the pre-existing glm5.1-fp8-b200-tilert entry. Specifically, it lands between the first and second items of glm5.1-fp8-b200-tilert.scenarios.fixed-seq-len, right before the pre-existing - isl: 8192 list item.

Why this corrupts the YAML structure: The new block's own scenario list item, - dram-utilization: 0.95, is indented at 4 spaces under agentic-coding:. The pre-existing - isl: 8192 item (glm5.1's second fixed-seq-len entry) happens to sit at that exact same 4-space indentation. Because YAML determines list membership purely from indentation of the - markers, the parser has no way to know - isl: 8192 was meant to continue the previous key's list — it reads as a second element of the new key's agentic-coding list instead.

Verified directly against the tree with yaml.safe_load:

dsv4 agentic-coding entries: 2
0 ['dram-utilization', 'search-space']
1 ['isl', 'osl', 'search-space']          # <- stolen from glm5.1
glm5.1 fixed-seq-len entries: 1
0 {'isl': 1024, 'osl': 1024}              # <- lost its isl:8192/osl:1024 entry

This confirms both halves of the corruption in the current working tree, not just in the diff context.

Concrete proof/walkthrough:

  1. Before this PR, glm5.1-fp8-b200-tilert.scenarios.fixed-seq-len had 2 entries: {isl:1024,osl:1024} and {isl:8192,osl:1024}.
  2. The PR inserts the new dsv4-fp4-b300-dynamo-sglang-agentic-mtp-agg key directly after glm5.1's first fixed-seq-len entry ends (... DECODE_NODES=1) and directly before the second entry's - isl: 8192 line.
  3. YAML parses top-to-bottom by indentation; once it sees the new top-level key dsv4-fp4-...:, it starts a fresh mapping. Its scenarios.agentic-coding list begins with - dram-utilization: 0.95 at 4-space indent.
  4. The next line at that same 4-space indent, - isl: 8192, is indistinguishable (structurally) from a second element of agentic-coding, so it — and everything nested under it through the eval/mtp/vllm-prefill scenario — becomes agentic-coding[1].
  5. Result: glm5.1-fp8-b200-tilert silently drops its 8k/1k benchmark point from the sweep, and the brand-new B300 dynamo-sglang AgentX config picks up a nonsensical second scenario entry carrying spec-decoding: mtp, PREFILL_IMAGE=vllm/vllm-openai:v0.26.0, and other vLLM-specific settings that don't apply to a dynamo-sglang aggregate config.

Why nothing else catches this: YAML syntax is fully valid (no parse error), so any lint/syntax check passes. The bug is purely structural/semantic — a silent mis-nesting — which won't be caught by tests unless something actually diffs scenario counts per top-level config before/after.

Impact: Two sweeps are broken: the glm5.1 config silently loses a benchmark data point (no error, just missing coverage), and the new B300 AgentX sweep would attempt to run a scenario with settings incompatible with its framework (dynamo-sglang vs. vllm PREFILL_IMAGE), likely causing that scenario to fail or produce meaningless results.

Fix: Move the new dsv4-fp4-b300-dynamo-sglang-agentic-mtp-agg: block to after the complete glm5.1-fp8-b200-tilert entry finishes (i.e., after its - isl: 8192 ... "DECODE_NODES=1" block), rather than splitting it apart.

Comment thread runners/launch_b300-nv.sh
Comment on lines +157 to +186
import_squash() {
local squash_file="$1"
local image_ref="$2"

srun -N 1 -A "$SLURM_ACCOUNT" -p "$SLURM_PARTITION" \
bash -s -- "$squash_file" "$image_ref" <<'IMPORT_SQUASH'
set -euo pipefail
squash_file="$1"
image_ref="$2"
lock_dir="$(dirname "$squash_file")/.locks"
mkdir -p "$lock_dir"
lock_file="$lock_dir/$(basename "$squash_file").lock"

(
flock -w 3600 9 || {
echo "Failed to acquire lock for $squash_file" >&2
exit 1
}
if unsquashfs -l "$squash_file" > /dev/null 2>&1; then
echo "Squash file already exists and is valid, skipping import: $squash_file"
else
rm -f "$squash_file"
enroot import -o "$squash_file" "docker://$image_ref"
unsquashfs -l "$squash_file" > /dev/null 2>&1 || {
echo "enroot import did not produce a valid squash file: $squash_file" >&2
exit 1
}
chmod a+r "$squash_file" || true
fi
) 9>"$lock_file"

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.

🟡 sweep:import_squash()
runners/launch_b300-nv.sh:157-188 defines its own import_squash() that duplicates the existing runners/launch_gb300-nv.sh:124-137 (flock + unsquashfs validity check + serialized enroot import); both files already source runners/slurm_utils.sh. Consider factoring a single parameterized helper there (lock path, timeout, post-import re-validation differ) so future locking/import fixes land in one place instead of two.

Extended reasoning...

What/where: runners/launch_b300-nv.sh:157-188 introduces a new import_squash() shell function implementing enroot-container-squash import under a per-file flock, with an unsquashfs -l validity check used both as a cache-hit test and post-import re-validation. runners/launch_gb300-nv.sh:124-137 already has an import_squash() doing the same core job: srun onto a compute node, flock -w N 9 on a lock file, unsquashfs -l as a cache-hit check, and rm -f + enroot import on a miss. This PR's launcher now carries a second, independently-maintained copy of that concurrency-control logic.

Why it matters: Both launchers already source runners/slurm_utils.sh (added at launch_b300-nv.sh:3 in this very PR, and already present in launch_gb300-nv.sh:8), and that file already centralizes other cross-launcher helpers such as inject_synthetic_acceptance. That makes it the natural home for this locking/import logic too. As written, any future fix to the concurrency handling — e.g. a lock-acquisition bug, a corrupted-squash edge case, or a change to how validity is checked — has to be found and applied twice, in two Bash scripts that will inevitably drift further apart over time.

Addressing the refutation: One reviewer objected that the two implementations aren't a literal copy-paste and that unifying them isn't a clean, risk-free move. That's correct as far as it goes — b300's version uses a quoted heredoc (bash -s -- ... <<'IMPORT_SQUASH') instead of gb300's inline bash -c "..." string interpolation, a dedicated .locks/ subdirectory instead of a sibling .lock file, a 3600s vs 600s flock timeout, and adds a post-import re-validation + chmod a+r step gb300 doesn't have. But none of that contradicts the underlying finding: the duplication is real regardless of the two versions not being byte-identical, and a shared helper is still very feasible — it would just need to take the differing lock path, timeout, and 'validate-after-import' behavior as parameters rather than being a straight copy/move. That's a normal refactor, not a rewrite, and it would also fix a real behavioral gap: gb300's version doesn't re-validate after a fresh import (see its own comment noting this), so consolidating would incidentally harden gb300 rather than degrade b300.

Concrete proof of duplication: Compare the core bodies. gb300 (launch_gb300-nv.sh:124-137): acquire flock on ${squash}.lock; unsquashfs -l "" — if valid, skip; else rm -f + enroot import -o "" "docker://". b300 (launch_b300-nv.sh:157-188, new): acquire flock on .locks/$squash_file.lock; unsquashfs -l "" — if valid, skip; else rm -f + enroot import -o "" "docker://" + re-validate + chmod a+r. Strip the cosmetic differences (variable names, invocation mechanism, lock path, timeout) and the control flow, lock discipline, and validity-check semantics are identical — this is the same helper reimplemented with small variations, not two independently-designed pieces of logic.

Suggested fix: Move a parameterized import_squash() into runners/slurm_utils.sh, taking squash_file, image_ref, slurm_account, slurm_partition, an optional lock timeout, and an optional 'revalidate after import' flag, and have both launch_b300-nv.sh and launch_gb300-nv.sh call it. This is a nit — it doesn't block merging this PR — but it's worth doing before a third launcher needs the same logic.

aggregated_environment:
PIP_BREAK_SYSTEM_PACKAGES: "1"
SGLANG_RAGGED_VERIFY_MODE: "static"
SGLANG_DEFAULT_THINKING: "1"

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.

🟡 WARNING: Missing SGLANG_DSV4_REASONING_EFFORT: high in aggregated_environment.

Why it matters: Every existing DSV4 AgentX recipe sets it in each worker env block (GB300 agg-gb300-tp4/tp8-mtp-lowlatency.yaml, all four disagg-gb300-*-mtp-kvoffload.yaml, and agg-h200-tp8-mtp-kvoffload.yaml). Without it the model runs at the default reasoning effort, which changes generation length/profile — so the B300 curve isn't comparable with the GB300/H200 DSV4 AgentX results this PR claims parity with, and the golden acceptance length 3.82 (measured at effort high) no longer matches what eval-only real-verify runs will observe.

Fix:

Suggested change
SGLANG_DEFAULT_THINKING: "1"
SGLANG_DEFAULT_THINKING: "1"
SGLANG_DSV4_REASONING_EFFORT: high

(Same fix needed in agg-b300-dep8-mtp-kvoffload.yaml line 60.)

aggregated_environment:
PIP_BREAK_SYSTEM_PACKAGES: "1"
SGLANG_RAGGED_VERIFY_MODE: "static"
SGLANG_DEFAULT_THINKING: "1"

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.

🟡 WARNING: Same as DEP4 — missing SGLANG_DSV4_REASONING_EFFORT: high, which every other DSV4 AgentX recipe (GB300 agg/disagg, H200) sets in each worker env block. Affects comparability and the effort-high-derived golden AL 3.82.

Fix:

Suggested change
SGLANG_DEFAULT_THINKING: "1"
SGLANG_DEFAULT_THINKING: "1"
SGLANG_DSV4_REASONING_EFFORT: high

@weireweire
weireweire force-pushed the perf/dsv4-gb300-dspark-agentx branch from 8a4a0a0 to d9a6672 Compare August 16, 2026 16:26
Root cause: the B300 PR was stacked on the open GB300 DSpark6 branch, so its non-main base prevented the performance sweep workflow from triggering.\n\nFix: restore every GB300-only recipe, runner, golden curve, master entry, and changelog entry to main while retaining only the B300 DEP4/DEP8 configuration and support changes.\n\nValidation: the resulting diff against main contains only six B300-related files; Bash syntax, YAML parsing, and whitespace checks pass.\n\n根因:B300 PR 堆叠在尚未合并的 GB300 DSpark6 分支上,非 main base 导致性能 sweep 工作流无法触发。\n\n修复:将所有 GB300 专属 recipe、runner、golden curve、master 和 changelog 改动恢复为 main,仅保留 B300 DEP4/DEP8 配置及必要支持。\n\n验证:相对 main 的最终差异仅包含六个 B300 相关文件;Bash 语法、YAML 解析及空白检查均通过。
@weireweire
weireweire changed the base branch from perf/dsv4-gb300-dspark-agentx to main August 16, 2026 16:31
@weireweire
weireweire requested a review from a team August 16, 2026 16:31
Root cause: the B300 DSpark6 sweep used acceptance length 3.82, but the DeepSeek-V4-Pro-0813 probabilistic golden curve measures thinking-on block size 6 at 3.77.\n\nFix: set both B300 DEP4 and DEP8 synthetic acceptance lengths to 3.77 and add the complete thinking-on/off block-size curve as the committed source of truth.\n\nValidation: YAML parsing passes and an automated consistency check confirms both master sweep arms equal the thinking-on block-size-6 golden value.\n\n根因:B300 DSpark6 sweep 使用了 3.82,但 DeepSeek-V4-Pro-0813 概率 golden 曲线中 thinking-on、block size 6 的测量值为 3.77。\n\n修复:将 B300 DEP4 和 DEP8 的合成 acceptance length 都改为 3.77,并提交完整的 thinking-on/off block-size 曲线作为依据。\n\n验证:YAML 解析通过,自动一致性检查确认两个 master sweep arm 都等于 thinking-on block-size-6 的 golden 值。
Root cause: the B300 master entry was inserted between two fixed-sequence scenarios of the preceding configuration, so YAML parsed the trailing 8K scenario as a second AgentX scenario with forbidden isl/osl fields.\n\nFix: move the complete B300 entry after the preceding configuration's final scenario at the true top level.\n\nValidation: the repository master-config schema loader accepts the entry and reports only the agentic-coding scenario group; YAML and whitespace checks pass.\n\n根因:B300 master 条目被插入到前一个配置的两个 fixed-sequence scenario 之间,导致 YAML 将后续 8K scenario 解析成带有非法 isl/osl 字段的第二个 AgentX scenario。\n\n修复:将完整 B300 条目移动到前一配置最后一个 scenario 之后,作为真正的顶层配置。\n\n验证:仓库 master-config schema loader 已接受该条目,且只报告 agentic-coding scenario group;YAML 与空白检查通过。
Root cause: DEP8 hicache-ratio 2.0 allocates about 1.545 TB of explicit host KV pools. Together with model loading, JIT, compiler, and page-cache overhead, startup exceeds the B300 x86 node host-memory budget and is OOM-killed before AgentX begins.

Fix: cap the DEP8 HiCache ratio at 1.5, reducing the explicit host KV allocation by about 386 GB while retaining host prefix-cache offload.

Validation: YAML parsing, whitespace checks, perf changelog validation, and exact-key matrix generation pass for all seven AgentX throughput points. The repository has no configured pre-commit executable in this checkout.

根因:DEP8 的 hicache-ratio 2.0 会分配约 1.545 TB 的显式主机 KV 池;叠加模型加载、JIT、编译器和页缓存开销后,启动阶段超过 B300 x86 节点的主机内存预算,在 AgentX 开始前被 OOM 杀死。

修复:将 DEP8 HiCache ratio 限制为 1.5,使显式主机 KV 分配减少约 386 GB,同时保留主机端 prefix cache offload。

验证:YAML 解析、空白检查、性能变更日志校验以及精确配置键的矩阵生成均通过,覆盖全部七个 AgentX 吞吐点;当前 checkout 未配置可执行的 pre-commit。
Root cause: the HiCache fix changed only the checked-in recipe, while the Run Sweep synchronize trigger is path-filtered to perf-changelog.yaml, so no workflow was created for the repaired commit.

Fix: record the DEP8 ratio 1.5 host-DRAM constraint in the PR changelog entry, satisfying the benchmark-change invariant and triggering a fresh sweep.

Validation: perf-changelog.yaml parses successfully, remains append-only relative to main, and whitespace checks pass.

根因:HiCache 修复只修改了提交进仓库的 recipe,而 Run Sweep 的 synchronize 触发器只监听 perf-changelog.yaml,因此修复 commit 没有创建 workflow。

修复:在本 PR 的 changelog 条目中记录 DEP8 ratio 1.5 的主机 DRAM 约束,满足 benchmark 变更规则并触发新一轮 sweep。

验证:perf-changelog.yaml 解析成功,相对 main 仍保持仅在末尾追加,且空白检查通过。
@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

Root cause: build_replay_cmd always emitted --tokenizer $MODEL and the B300 DSpark recipe appended a second --tokenizer /model through INFMAX_AIPERF_TOKENIZER. AIPerf Click parsing rejects duplicate tokenizer options before profiling starts.

Fix: select INFMAX_AIPERF_TOKENIZER when provided, otherwise fall back to $MODEL, and emit exactly one tokenizer option.

Validation: Bash syntax passes; focused command-construction checks verify one --tokenizer /model for the B300 recipe and one --tokenizer org/model for the fallback path; perf changelog YAML parses successfully.

根因:build_replay_cmd 固定生成 --tokenizer $MODEL,而 B300 DSpark recipe 又通过 INFMAX_AIPERF_TOKENIZER 追加 --tokenizer /model。AIPerf 的 Click 参数解析在 profiling 开始前拒绝重复 tokenizer 选项。

修复:存在 INFMAX_AIPERF_TOKENIZER 时优先使用,否则回退到 $MODEL,并且只生成一个 tokenizer 参数。

验证:Bash 语法通过;聚焦命令构造测试确认 B300 recipe 只生成一个 --tokenizer /model,回退路径只生成一个 --tokenizer org/model;性能变更日志 YAML 解析成功。
Root cause: the c128 diagnostic run exceeded the 3600-second Dynamo session-affinity lease, and multiple frontend processes maintain separate affinity state.\n\nFix: use one Dynamo frontend for both B300 topologies and extend the affinity lease to four hours.\n\nValidation: parsed both changed YAML files and ran git diff --check.
Root cause: chunked-prefill-size is DP-global. Values of 8192 resolved to only 2048 tokens per DEP4 rank and 1024 per DEP8 rank, delaying radix-cache materialization for concurrent AgentX branches. The GB300 reference resolves to 8192 tokens per rank and sustains near-theoretical cache hits.\n\nFix: set the B300 DEP4 and DEP8 global chunk budgets to 32768 and 65536 respectively, preserving an 8192-token local chunk on each DP rank.\n\nValidation: parsed both recipes, verified the configured values, and ran git diff --check.
@github-actions

Copy link
Copy Markdown
Contributor

Root cause: independent DP schedulers can place some ranks in prefill while peers remain in decode, creating uneven expert-parallel work and idle time.\n\nFix: enable SGLang's prefill delayer with its bounded 30-pass delay on both B300 DEP4 and DEP8 AgentX recipes.\n\nValidation: parsed both YAML recipes, passed git diff checks, and successfully generated both recipes with srt-slurm dry-run on the B300 environment.
@github-actions

Copy link
Copy Markdown
Contributor

@kedarpotdar-nv

Copy link
Copy Markdown
Collaborator

crashing, we will resubmit

@github-actions

Copy link
Copy Markdown
Contributor

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

Labels

None yet

Projects

Development

Successfully merging this pull request may close these issues.

2 participants