Skip to content

[Power] feat: extend dcgm energy lanes to gb dsv4/qwen3.5 fp4 / 扩展 dcgm 能耗采集到 gb dsv4 与 qwen3.5 fp4 - #2507

Open
edwingao28 wants to merge 4 commits into
mainfrom
feat/power-fp4-gb-lanes
Open

[Power] feat: extend dcgm energy lanes to gb dsv4/qwen3.5 fp4 / 扩展 dcgm 能耗采集到 gb dsv4 与 qwen3.5 fp4#2507
edwingao28 wants to merge 4 commits into
mainfrom
feat/power-fp4-gb-lanes

Conversation

@edwingao28

@edwingao28 edwingao28 commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Extends the dcgm-power measurement lanes (built in #2323/#2437/#2456) to the fp4 recipes the scale campaign needs: five DSV4 8k1k Pareto points (gb200 c1/c512/c256, gb300 c1/c1024) and the qwen3.5-fp4 gb300 low-latency ladder. Recipes opt in through the same telemetry block the fp8 lanes use; gb300 recipes take port 19401 for the known cluster-exporter collision.

Launcher changes, kept surgical:

  • gb200: the existing dynamo-sglang && dsv4 branch clones the pinned producer when the resolved recipe carries an enabled dcgm-power block, and keeps its current NVIDIA/srt-slurm:main clone otherwise. The recipe overlay is unchanged.
  • gb300: a new branch routes only power runs of dsv4 dynamo-sglang to the pinned producer plus the in-repo recipe overlay. Non-power dsv4 keeps the generic fallthrough exactly as before.
  • The fp8-only fail-fast becomes a framework fail-fast: power lanes are validated for dynamo-sglang only; any other framework still exits early instead of silently cloning a diverging ref (aflowers branch / sa-submission).

Safety checks done before opening:

  • All six recipes parse clean with the pinned producer's (6fc1bed) config loader — none of them use sa-submission-only schema fields (warmup_req_rate, spread placement, request-plane options).
  • sa_bench_tokenizers.sglang_deepseek_v4 (used by the gb300 DSV4 recipes) is present at the pin.
  • The gb200 DSV4 lane already runs on the main lineage the pin descends from; the qwen3.5 fp4 recipe pins dynamo by version (pip path), which the pin supports.
  • Contract tests updated: the power-recipe allowlist grows to 8 entries and every entry's telemetry block is asserted per platform port. 16/16 pass locally; both launchers pass bash -n.

Scope: the config keys already exist; dispatches for validation use exact-key test-config. One master-yaml line changes: the dsv4-fp4-gb300-dynamo-sglang image pin, whose nightly (20260520) has been garbage-collected from Docker Hub — bumped to the live 20260721 nightly the B300 DSV4 family already runs (recipe container fields bumped to match). Heads-up for maintainers: several other multinode pins (gb200 DSV4 20260528, gb300 qwen3.5-fp4 20260624) are also gone from the Hub and currently survive only on per-cluster squash caches.

Canary validation (both from this branch, require-power=true):

  • DSV4 gb200 1P1D TP8/TP8 c1 (4 nodes, 16 GPUs): 31081927656 — power_valid=1, manifest producer == the pin, 16/16 devices observed, publication_valid=true, prefill/decode energy split present. First multi-node DSV4 power capture.
  • Qwen3.5-fp4 gb300 low-latency ladder c1–c256 (1P1D TP4, 8 GPUs, eval job included): 31081941962 — 7/7 windows power_valid=1, producer == pin, publication_valid=true. Against the merged fp8 N=3 ladder on the same topology, fp4 saves 4% J/out-token at c1 growing to 23% at c64.
  • DSV4 gb300 1P1D TP4/TP4 c1 (2 nodes, 8 GPUs): 31092050733 — power_valid=1, producer == pin, publication_valid=true, on the bumped 20260721 image (fresh arm64 pull, no cache).

The first canary attempt failed at srtctl preflight ("model alias resolved to a path unavailable") and produced the second commit: these fp4 models live on compute-node-local NVMe (gb200 /mnt/numa1, gb300 /scratch), which the login-side runner cannot stat — the same situation the existing agentic/glm5.1/qwen3.5-fp8 --no-preflight exemptions cover. The power lanes join that list, scoped to USES_DCGM_POWER=1; the gb200 power lane also points MODEL_PATH at the /mnt/numa1 checkpoint the agentic path already loads from (the shared lustre alias stays untouched for the external-cluster staging).

中文:把能耗采集扩展到 scale campaign 需要的 fp4 配方(DSV4 五个点位 + qwen3.5-fp4 gb300 低延迟梯子)。launcher 改动保持外科式:gb200 dsv4 分支仅在 power 时改克隆 pinned producer;gb300 新增仅 power 生效的 dsv4 路由,非 power 路径逐字节不变;fp8 精度门换成 framework 门。六个配方已在 pin 的 loader 下解析通过,契约测试 16/16 绿。canary 链接补充后转正式 review。

@github-actions

github-actions Bot commented Aug 5, 2026

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

…gm 能耗采集到 gb dsv4 与 qwen3.5 fp4

recipe 侧:5 个 DSV4 8k1k 点位与 qwen3.5-fp4 gb300 lowlat 配方加 telemetry 块(gb300 用 19401 端口)。launcher 侧:gb200 dsv4 分支在 power 时改克隆 pinned producer;gb300 新增仅 power 生效的 dsv4 路由(非 power 路径保持原样);precision 门换成 framework 门(dynamo-sglang 之外仍然快速失败)。契约测试同步:recipe 白名单 8 项 + 逐配方 telemetry 断言。
@edwingao28
edwingao28 force-pushed the feat/power-fp4-gb-lanes branch from 8e2ca1c to 3ad142d Compare August 6, 2026 00:22
@edwingao28
edwingao28 marked this pull request as ready for review August 6, 2026 00:22
@edwingao28
edwingao28 requested a review from a team August 6, 2026 00:22
@claude

claude Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Claude finished @edwingao28's task in 4m 58s —— View job


Review of PR #2507

  • Gather context (diff, both launchers, master config, contract tests)
  • Review recipe telemetry blocks (ports, exporter config)
  • Review launcher routing changes (gb200/gb300)
  • Review contract test updates
  • Post review feedback

Found 1 blocking issue (inline comment on runners/launch_gb300-nv.sh): the two new gb300 power lanes (dsv4-fp4 and qwen3.5-fp4) now clone the pinned producer — which follows the main lineage carrying srtctl's login-node model-path preflight — but the --no-preflight condition at runners/launch_gb300-nv.sh:436 still only covers IS_AGENTIC/glm5.1/qwen3.5+fp8. Both new lanes resolve model.path to compute-node-only /scratch/models/... that the GHA runner pod can't stat, so srtctl apply should fail before sbatch. Until now these fp4 lanes ran on sa-submission-q2-2026, which (per the launcher's own comments) has no preflight, which is why this never bit. Suggested fix: add || "$USES_DCGM_POWER" == "1" to the condition. A gb300 canary run would confirm or refute this before merge.

Everything else checked out clean:

  • The routing is correctly ordered — the new gb300 dsv4 power branch sits after the agentic branches and can't be shadowed; non-power dsv4 sglang still reaches the generic fallthrough.
  • The awk telemetry detection matches the exact 2-space indentation the six recipe blocks use, and gb200/gb300 ports (9401 vs 19401) are consistent between recipes and the contract test's POWER_RECIPES table.
  • gb200 side is fine as-is: its dsv4 and qwen3.5 model paths are on login-visible Lustre, so no preflight concern there.
  • Contract test changes are statically sound (imports, helpers, and the v1.0.25 not in launcher assertion all hold against the new launcher text).

Note: this sandbox's permissions blocked running pytest / bash -n and cloning the pin (6fc1bed) to confirm the preflight exists there, so those verifications are static-only; the author reports 16/16 tests passing locally, and nothing in the test file contradicts that.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3ad142d752

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

# dynamo-sglang lanes run on (fp8 validated end-to-end, fp4 recipes
# parse-verified against the pin); other frameworks clone diverging refs
# (aflowers branch, sa-submission), so fail fast for them instead.
if [[ "$USES_DCGM_POWER" == "1" && "$FRAMEWORK" != "dynamo-sglang" ]]; then

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Skip GB300 FP4 power preflight / 跳过 GB300 FP4 能耗预检

When the new GB300 DSV4 or Qwen3.5 FP4 recipes enable telemetry, this relaxed gate routes them to the pinned producer, but both models resolve to compute-node-only /scratch/models paths (launch_gb300-nv.sh:44-54,83-87) while the submission block still adds --no-preflight only for agentic, GLM5.1, or Qwen3.5 FP8 runs (launch_gb300-nv.sh:420-437). The launcher explicitly documents that this preflight stats the model path from the login pod, so these new FP4 power jobs abort before sbatch; extend the skip condition to these power cases or retain the FP8 gate. 中文:新增的 GB300 DSV4 和 Qwen3.5 FP4 配方启用 telemetry 后会切换到带模型路径预检的 producer pin,但模型只存在于计算节点的 /scratch/models,当前 --no-preflight 条件又未覆盖这些 FP4 通道,因此任务会在提交 Slurm 作业前失败;应为这些能耗通道跳过预检,或暂时保留 FP8 精度限制。

AGENTS.md reference: AGENTS.md:L152-L152

Useful? React with 👍 / 👎.

Comment on lines +298 to +310
elif [[ $FRAMEWORK == "dynamo-sglang" && $MODEL_PREFIX == "dsv4" && "$USES_DCGM_POWER" == "1" ]]; then
# Note (wenyao): only the power lane routes here — non-power dsv4 sglang
# keeps the generic fallthrough untouched. The overlay is required: the
# telemetry-tagged DSV4 recipes are version-controlled in-repo only,
# neither upstream ref ships them.
git clone "$POWER_SRT_SLURM_URL" "$SRT_REPO_DIR"
cd "$SRT_REPO_DIR"
git checkout "$POWER_SRT_SLURM_PIN" || exit 1
# The power lane must run the exact pinned producer SHA, never a moving branch.
test "$(git rev-parse HEAD)" = "$POWER_SRT_SLURM_PIN" || { echo "Error: srt-slurm HEAD does not match POWER_SRT_SLURM_PIN=$POWER_SRT_SLURM_PIN" >&2; exit 1; }
git rev-parse HEAD > "$GITHUB_WORKSPACE/power-producer-sha.txt"
mkdir -p recipes/sglang/deepseek-v4
cp -rT "$GITHUB_WORKSPACE/benchmarks/multi_node/srt-slurm-recipes/sglang/deepseek-v4" recipes/sglang/deepseek-v4

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: The two new gb300 power lanes (dsv4-fp4 and qwen3.5-fp4) route onto the pinned producer without also getting --no-preflight, so srtctl apply will fail before sbatch is ever called.

Why it matters: The pin follows the srt-slurm main lineage, which carries srtctl's pre-submit model-path stat (this launcher's own comment at the --no-preflight block says v1.0.25 "has the preflight"; sa-submission-q2-2026, where non-power fp4 lanes ran until now, "has none"). Both new lanes resolve model.path to compute-node-only NVMe that the GHA runner pod can't stat:

  • dsv4 fp4 → /scratch/models/DeepSeek-V4-Pro (lines 44–55 warn preflight "may fail" for exactly this path)
  • qwen3.5 fp4 → /scratch/models/Qwen3.5-397B-A17B-NVFP4 (the agentic branch comment at lines 188–198 states this path makes "the Path.is_dir() preflight ... fail before sbatch is ever called")

The --no-preflight condition at line ~436 only covers IS_AGENTIC, glm5.1, and qwen3.5 && fp8 — the fp8 power lane is protected, the two new fp4 power lanes are not.

Fix: gate --no-preflight on the power lane too (every gb300 power recipe resolves weights on compute-node /scratch; qwen3.5-fp8 already takes the flag, so this only adds the two lanes that need it):

if [[ "$IS_AGENTIC" == "1" || "$MODEL_PREFIX" == "glm5.1" || ( "$MODEL_PREFIX" == "qwen3.5" && "$PRECISION" == "fp8" ) || "$USES_DCGM_POWER" == "1" ]]; then
    SRTCTL_APPLY_ARGS+=(--no-preflight)
fi

(Note: I couldn't clone the pin from this sandbox to confirm the preflight exists at 6fc1bed — if your gb300 canary run passes preflight, this is moot; but the PR notes canaries haven't run yet, and the in-repo evidence above points at a submit-time failure.)

Comment on lines 308 to +314

# Note (wenyao): the producer pin descends from the fp8 srt-slurm lineage
# (cargo/maturin bootstrap); a non-fp8 power recipe would silently clone the
# wrong lineage, so fail fast instead.
if [[ "$USES_DCGM_POWER" == "1" && "$PRECISION" != "fp8" ]]; then
echo "Error: dcgm-power lanes are only validated for PRECISION=fp8, got: $PRECISION" >&2
# Note (wenyao): the producer pin follows the srt-slurm main lineage that the
# dynamo-sglang lanes run on (fp8 validated end-to-end, fp4 recipes
# parse-verified against the pin); other frameworks clone diverging refs
# (aflowers branch, sa-submission), so fail fast for them instead.
if [[ "$USES_DCGM_POWER" == "1" && "$FRAMEWORK" != "dynamo-sglang" ]]; then
echo "Error: dcgm-power lanes are only validated for FRAMEWORK=dynamo-sglang, got: $FRAMEWORK" >&2

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.

🟡 AGENTS.md:152 still says dcgm-power lanes are validated for PRECISION=fp8 only, but this PR replaces that fp8 fail-fast in both launch_gb200-nv.sh and launch_gb300-nv.sh with a FRAMEWORK=dynamo-sglang gate and ships six new fp4 dcgm-power recipes (5 DSV4 fp4 + 1 qwen3.5 fp4). That doc sentence is now factually false and should be updated in this PR to describe the new framework-based gate.

Extended reasoning...

AGENTS.md:152 is the canonical guidance for the exact area this PR touches: "Power lanes: a recipe telemetry: block with provider: dcgm-power enables official energy collection for that config. ... dcgm-power lanes are validated for PRECISION=fp8 only." That last sentence describes the fail-fast that used to gate the dcgm-power lane.

This PR removes exactly that fail-fast. In both runners/launch_gb200-nv.sh (lines 308-314) and runners/launch_gb300-nv.sh, the check changes from:

if [[ "$USES_DCGM_POWER" == "1" && "$PRECISION" != "fp8" ]]; then

to:

if [[ "$USES_DCGM_POWER" == "1" && "$FRAMEWORK" != "dynamo-sglang" ]]; then

and the PR adds six new fp4 recipes with an enabled telemetry: {provider: dcgm-power} block: five DSV4 8k1k fp4 recipes (gb200 c1/c512/c256, gb300 c1/c1024) and the qwen3.5-fp4 gb300 low-latency ladder recipe. utils/test_gb200_power_official_contract.py's POWER_RECIPES dict confirms this — it now lists these fp4 recipes alongside the original fp8 ones, and test_exactly_the_declared_recipes_opt_into_dcgm_power / test_every_power_recipe_declares_the_same_telemetry_contract assert they all carry the same enabled telemetry contract.

So after this PR merges, AGENTS.md:152's claim "dcgm-power lanes are validated for PRECISION=fp8 only" is simply wrong — fp4 dcgm-power lanes exist and are validated by the same contract tests. A contributor or coding agent who reads AGENTS.md before touching a power lane (which is exactly the workflow this doc section is written for — it's the "single source of truth" pointer for the producer pin and contract tests) would be misled into thinking fp4 power recipes are unsupported or need special justification, when the code and tests already treat them as first-class.

Step-by-step proof of staleness:

  1. Before this PR: launch_gb200-nv.sh gates power lanes with "$PRECISION" != "fp8" — matches AGENTS.md:152 exactly.
  2. This PR's diff on runners/launch_gb200-nv.sh (and the identical block in launch_gb300-nv.sh) replaces that condition with "$FRAMEWORK" != "dynamo-sglang" — precision is no longer part of the gate at all.
  3. This PR adds telemetry: {enabled: true, provider: dcgm-power, ...} to 6 new recipes, all of which declare precision: "fp4" in their model: block (e.g. disagg-gb200-1p1d-dep8-dep16-6-c512.yaml, 8k1k_stp_lowlat_0.yaml).
  4. utils/test_gb200_power_official_contract.py::POWER_RECIPES now enumerates these fp4 recipes and test_every_power_recipe_declares_the_same_telemetry_contract passes for them — i.e., CI itself now certifies fp4 dcgm-power lanes as valid.
  5. AGENTS.md:152 was never touched by this diff and still reads "validated for PRECISION=fp8 only," which directly contradicts steps 2-4.

The fix is small: update the sentence to describe the new framework gate, e.g. "dcgm-power lanes are validated for FRAMEWORK=dynamo-sglang only." This is a documentation-only fix with no runtime impact — nothing breaks if it's merged as-is, but the doc should be corrected in the same PR since it directly describes the mechanism this PR changes, and letting it drift makes AGENTS.md a less reliable source of truth for the next contributor or agent working in this exact area.

… lanes / 为 node-local fp4 能耗 lane 加 no-preflight 与 numa1 模型路径

两个 canary 都死在同一处:模型在 compute-node 本地盘(gb200 /mnt/numa1、gb300 /scratch),login 侧 runner stat 不到,srtctl preflight 必然误报。沿用 repo 已有豁免机制(agentic/glm5.1/qwen3.5-fp8 同款),范围限定 USES_DCGM_POWER=1;gb200 power lane 的 MODEL_PATH 指向 agentic 与 llm-d 实测在用的 /mnt/numa1 检查点,共享的 lustre 路径保持不动。
… gb300 dsv4 能耗配方镜像换成仍在线的 nightly

原 pin nightly-dev-cu13-20260520 已从 Docker Hub 过期删除(404),gb300 无 sqsh 缓存,lane 无法拉起。换成 B300 DSV4 家族(#2362/#2363)在用且仍在线的 nightly-dev-cu13-20260721-8905cbd4;仅动两个 power 点位,其余 gb300 dsv4 配方保持原 pin。
…dia-master 中已失效的 gb300 dsv4 镜像 pin

launcher 的 import_squash 用的是 master yaml 的 image 字段,0520 nightly 已被 Docker Hub GC;与配方一致换成仍在线的 0721(B300 DSV4 家族同款)。仅动 dsv4-fp4-gb300-dynamo-sglang 一个 key,mtp key 不碰。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

1 participant