Skip to content

perf: add GB200 DeepSeek V4 FP4 vLLM MTP AgentX - #2567

Open
cquil11 wants to merge 8 commits into
mainfrom
agent/gb200-dsv4-vllm-mtp-agentx
Open

perf: add GB200 DeepSeek V4 FP4 vLLM MTP AgentX#2567
cquil11 wants to merge 8 commits into
mainfrom
agent/gb200-dsv4-vllm-mtp-agentx

Conversation

@cquil11

@cquil11 cquil11 commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds a new GB200 DeepSeek-V4-Pro FP4 Dynamo-vLLM MTP AgentX submission using released vLLM v0.27.1, Dynamo 1.3.1, and NVIDIA srt-slurm v1.0.45.

The initial agentx-fast discovery matrix deliberately spans:

  • aggregate TP8: c1, c2, c4, c8
  • aggregate DEP8: c4, c8, c16, c24, c32, c48, c64, c96
  • disaggregated 1P1D DEP8/DEP8: c32 through c384
  • disaggregated 2P1D DEP8/DEP8: c192 through c512

This follows the public vLLM GB200 recommendation that the checkpoint needs two NVL4 trays and uses DEP8 as the throughput-oriented baseline. The broad fast pass will be pruned to the measured Pareto frontier before the official full sweep.

Metrics correctness

  • srt-slurm v1.0.45 supplies ordered, deduplicated logical worker metrics endpoints to the custom benchmark.
  • Disaggregated runs therefore pass every prefill and decode leader URL once through AIPerf's single server-metrics argument.
  • AIPERF_REQUIRED_SERVER_METRIC_PREFIX is vllm:, so missing or empty server metrics fail final validation.
  • Session IDs come from AgentX correlation IDs; legacy conversation-aware routing is disabled.

Validation

  • all four recipes parse and dry-run with NVIDIA srt-slurm v1.0.45
  • 15 targeted srt-slurm custom benchmark/logical endpoint tests pass
  • 105 InferenceX matrix-generator tests pass
  • generated matrix contains exactly 23 throughput points
  • synthetic MTP injection modifies throughput only; eval remains real MTP
  • shell syntax and git diff checks pass

@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 关于重新运行失败任务的文档

@cquil11 cquil11 added the agentx-fast Run AgentX throughput with 1 warmup request per lane and a 20-minute profile; not reusable label Aug 11, 2026
@cquil11
cquil11 marked this pull request as ready for review August 11, 2026 21:58
@cquil11
cquil11 requested a review from a team August 11, 2026 21:58
@claude

claude Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Claude finished @cquil11's task in 6m 57s —— View job


Review of PR #2567

  • Gather context and read the full diff
  • Review recipe YAMLs (MTP requirements, EP flags, formatting)
  • Review configs/nvidia-master.yaml (image accessibility, model prefixes)
  • Review perf-changelog.yaml (entry appended at end)
  • Review runners/launch_gb200-nv.sh (enroot import pattern)
  • Post review feedback

Summary

One 🟡 WARNING posted inline: the new launcher branch in runners/launch_gb200-nv.sh:394 matches on IS_AGENTIC + dsv4 + dynamo-vllm only, so it also reroutes the existing non-MTP GB200 dsv4 agentic lanes (dsv4-fp4-gb200-dynamo-vllm-agentic-2p1d-dep8-dep8, ...-3p2d-tep8-tp8) from the pinned cquil11/srt-slurm-nv@de59739 fork to NVIDIA/srt-slurm v1.0.45 — and those recipes pin dynamo.wheel, a field the launcher's own comment attributes to the fork. Suggested scoping the condition to *-mtp-agentic.yaml, or validating the existing recipes on v1.0.45 and listing their keys in the changelog. (I could not verify the v1.0.45 tag commit or upstream dynamo.wheel support externally — network API calls aren't permitted in this environment — hence WARNING rather than BLOCKING; the commit-pin check itself fails closed, which is good.)

Everything else checked out: perf-changelog.yaml entry is correctly appended at the end and documents both new config keys; vllm/vllm-openai:v0.27.1 is a public Docker Hub image; the launcher imports it via the existing enroot import docker:// path (import_squash); the 23-point matrix math matches the PR description; SYNTHETIC_ACCEPTANCE_LENGTH=2.49 with num_speculative_tokens: 3 is handled by the vLLM injector (explicit AL, YAML-anchor merge means the single speculative-config line covers prefill and decode); and the AIPERF_REQUIRED_SERVER_METRIC_PREFIX / session-ID-from-correlation-ID env vars are consumed by benchmark_lib.sh and follow the established GB300 recipe pattern.

# Agentic DeepSeek-V4 uses the latest released srt-slurm. v1.0.45 carries
# custom-benchmark support plus ordered logical-worker Prometheus endpoint
# injection, so disaggregated AIPerf runs receive every P/D metrics URL.
if [[ "$IS_AGENTIC" == "1" && "$MODEL_PREFIX" == "dsv4" && "$FRAMEWORK" == "dynamo-vllm" ]]; then

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: This condition doesn't only route the new MTP recipes — it also captures the existing non-MTP DSV4 GB200 agentic lanes (dsv4-fp4-gb200-dynamo-vllm-agentic-2p1d-dep8-dep8 and ...-3p2d-tep8-tp8, configs/nvidia-master.yaml ~lines 7240–7326, both agentic-coding/dynamo-vllm/dsv4, so IS_AGENTIC=1). They previously fell through to the elif below and cloned the pinned cquil11/srt-slurm-nv@de59739; after this PR they clone NVIDIA/srt-slurm v1.0.45.

Why it matters: Those existing recipes pin dynamo.wheel: "1.3.0.dev20260618" — a field this file's own comment attributes to the fork ("DynamoConfig.wheel (recipes pin the ai-dynamo wheel)"). If upstream v1.0.45 doesn't accept dynamo.wheel, the existing lanes break at srtctl apply on their next main-branch run; if it silently ignores it, they run an unpinned dynamo build — a silent toolchain change to already-published lanes. The PR states only the four new MTP recipes were dry-run against v1.0.45, and the perf-changelog entry doesn't list the existing config keys as affected.

Fix: Scope the new branch to the new recipes (the stripped CONFIG_FILE basename is a clean discriminator — only the new GB200 recipes end in -mtp-agentic.yaml on this runner):

Suggested change
if [[ "$IS_AGENTIC" == "1" && "$MODEL_PREFIX" == "dsv4" && "$FRAMEWORK" == "dynamo-vllm" ]]; then
if [[ "$IS_AGENTIC" == "1" && "$MODEL_PREFIX" == "dsv4" && "$FRAMEWORK" == "dynamo-vllm" && "${CONFIG_FILE%%:*}" == *-mtp-agentic.yaml ]]; then

Alternatively, if migrating the existing non-MTP dsv4 lanes to v1.0.45 is intentional, dry-run those two recipes against it (including the dynamo.wheel field) and add their config keys to the perf-changelog entry.

Comment on lines +391 to +404
# Agentic DeepSeek-V4 uses the latest released srt-slurm. v1.0.45 carries
# custom-benchmark support plus ordered logical-worker Prometheus endpoint
# injection, so disaggregated AIPerf runs receive every P/D metrics URL.
if [[ "$IS_AGENTIC" == "1" && "$MODEL_PREFIX" == "dsv4" && "$FRAMEWORK" == "dynamo-vllm" ]]; then
git clone --branch v1.0.45 --single-branch https://github.com/NVIDIA/srt-slurm.git "$SRT_REPO_DIR"
cd "$SRT_REPO_DIR"
test "$(git rev-parse HEAD)" = "9d8d92b20c350a5d42f0709f5a0b64e30eb37d33" || {
echo "Error: NVIDIA/srt-slurm v1.0.45 resolved to an unexpected commit" >&2
exit 1
}
mkdir -p recipes/vllm/deepseek-v4/agentic
cp -rT "$GITHUB_WORKSPACE/benchmarks/multi_node/srt-slurm-recipes/vllm/deepseek-v4/agentic" \
recipes/vllm/deepseek-v4/agentic
# TODO(CJQ): migrate the remaining Agentic model paths to released srt-slurm.

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 branch guard [[ $IS_AGENTIC == 1 && $MODEL_PREFIX == dsv4 && $FRAMEWORK == dynamo-vllm ]] in runners/launch_gb200-nv.sh (lines 391-404) is broader than the MTP recipes it was added for: it also matches two pre-existing configs, dsv4-fp4-gb200-dynamo-vllm-agentic-3p2d-tep8-tp8 and dsv4-fp4-gb200-dynamo-vllm-agentic-2p1d-dep8-dep8 (configs/nvidia-master.yaml:7217, :7275), which previously fell into the elif [[ $IS_AGENTIC == 1 ]] branch that clones the cquil11 fork. Rerouting them onto NVIDIA/srt-slurm v1.0.45 will likely break them, since their recipes still declare dynamo: { install: true, wheel: "1.3.0.dev20260618" } — a fork-specific field the new v1.0.45 recipes deliberately dropped in favor of dynamo: { version, install }. The condition should be scoped to only the new MTP recipes (e.g. gate on an MTP-specific marker) instead of every dsv4/dynamo-vllm/agentic-coding config.

Extended reasoning...

The bug: The new first branch in runners/launch_gb200-nv.sh (added at line 394) tests [[ "$IS_AGENTIC" == "1" && "$MODEL_PREFIX" == "dsv4" && "$FRAMEWORK" == "dynamo-vllm" ]]. This was written to route the four brand-new MTP recipes added in this PR (dsv4-fp4-gb200-dynamo-vllm-agentic-mtp-agg and -mtp-disagg) onto the newly-released NVIDIA/srt-slurm v1.0.45. However, the condition has no MTP-specific discriminator, so it also matches two pre-existing, previously-working configs that happen to share the same model-prefix: dsv4, framework: dynamo-vllm, and scenarios: agentic-coding combination: dsv4-fp4-gb200-dynamo-vllm-agentic-3p2d-tep8-tp8 and dsv4-fp4-gb200-dynamo-vllm-agentic-2p1d-dep8-dep8 (configs/nvidia-master.yaml lines ~7217 and ~7275, just above the new MTP entries added by this PR at line 7330+).\n\nWhy IS_AGENTIC/MODEL_PREFIX/FRAMEWORK line up for the old configs too: IS_AGENTIC is derived purely from scenario-type in .github/workflows/benchmark-multinode-tmpl.yml:247 (1 iff scenario-type == 'agentic-coding'). Both pre-existing configs declare scenarios: agentic-coding, model-prefix: dsv4, and framework: dynamo-vllm — exactly the same triple as the new MTP configs. Before this PR, they fell through to the retained elif [[ "$IS_AGENTIC" == "1" ]] branch (line ~405), which clones cquil11/srt-slurm-nv at commit de59739b.... After this PR, they hit the new, more specific first branch instead and get NVIDIA/srt-slurm v1.0.45 cloned in its place, with the entire benchmarks/multi_node/srt-slurm-recipes/vllm/deepseek-v4/agentic directory (old recipes included) copied in via cp -rT.\n\nWhy this breaks the old recipes: The two rerouted recipe files, disagg-gb200-3p2d-tep8-tp8-agentic.yaml and disagg-gb200-2p1d-dep8-dep8-agentic.yaml, still declare dynamo: { install: true, wheel: "1.3.0.dev20260618" }. The retained elif branch's own comment explicitly documents this as a feature that only the cquil11 fork provides: DynamoConfig.wheel (recipes pin the ai-dynamo wheel). The new v1.0.45 MTP recipes added by this very PR (e.g. agg-gb200-tp8-mtp-agentic.yaml) deliberately use dynamo: { version: "1.3.1", install: true } instead — no wheel field — strongly implying that stock v1.0.45's DynamoConfig schema does not accept wheel. Running srtctl apply against v1.0.45 with a recipe that still sets wheel will therefore either fail schema validation or silently ignore the pin and install a different Dynamo build than the one these sweeps were validated against.\n\nWhy nothing else catches this: The PR's Validation section only exercises the four new MTP recipes ("all four recipes parse and dry-run with NVIDIA srt-slurm v1.0.45"); it never re-validates the pre-existing 3p2d/2p1d configs under the new branch, since the author's intent was only to add MTP coverage, not to touch those sweeps. There is no test or guard in launch_gb200-nv.sh that distinguishes MTP configs from non-MTP ones within the dsv4/dynamo-vllm/agentic-coding space, so the reroute is silent — it will only surface as a build/apply failure (or a silently wrong Dynamo version) the next time those two sweeps run.\n\nStep-by-step proof:\n1. dsv4-fp4-gb200-dynamo-vllm-agentic-2p1d-dep8-dep8 (nvidia-master.yaml:7275) has scenarios: agentic-coding, model-prefix: dsv4, framework: dynamo-vllm.\n2. The workflow template sets IS_AGENTIC=1 for this scenario, and MODEL_PREFIX/FRAMEWORK env vars are populated from the config's own fields, so at runtime: IS_AGENTIC=1, MODEL_PREFIX=dsv4, FRAMEWORK=dynamo-vllm.\n3. In launch_gb200-nv.sh, the new condition [[ "$IS_AGENTIC" == "1" && "$MODEL_PREFIX" == "dsv4" && "$FRAMEWORK" == "dynamo-vllm" ]] evaluates true — matching this config even though it has no MTP recipe.\n4. The script clones NVIDIA/srt-slurm v1.0.45 and copies the whole agentic recipe directory into it, including disagg-gb200-2p1d-dep8-dep8-agentic.yaml.\n5. srtctl apply runs this recipe (which still has dynamo.wheel: "1.3.0.dev20260618") against v1.0.45, whose DynamoConfig schema (per the new recipes' switch to version+install) no longer models a wheel field — the previously-working sweep now either errors out or silently drops the pinned wheel install.\n\nThe fix: Scope the new branch's condition to something MTP-specific — e.g. check for an MTP marker in the config (a spec-decoding: mtp search-space key, a distinct model-prefix/config-key suffix like -mtp-, or an explicit env var set only by the new MTP configs) rather than the broad dsv4+dynamo-vllm+agentic-coding triple that also matches the pre-existing 3p2d/2p1d configs.

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@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

agentx-fast Run AgentX throughput with 1 warmup request per lane and a 20-minute profile; not reusable full-sweep-enabled

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

1 participant