Repository navigation
[PowerX] collect multinode power by default / [PowerX] 默认采集多节点功耗 - #3670
Conversation
|
Thanks for the contribution!
中文感谢你的贡献!
|
553d776 to
03eaa88
Compare
|
Claude finished @edwingao28's task in 1m 53s —— View job LGTM - no blocking issues found The PR's pytest suites were not run here because this job's permissions blocked |
There was a problem hiding this comment.
I reviewed this PR and didn't find any clear-cut bugs. Because it's a large change (88 files) introducing default NVL72 power-telemetry collection across the SLURM launch path, driver init, power-decision logic, and collection enforcement — with several intertwined code paths for cluster-default vs. legacy per-recipe power opt-in and require_power/adapter propagation — a human look would still be worthwhile.
What was reviewed: the decide_power/resolve_power rewrite in power.py (cluster-default settings path vs. legacy per-recipe DCGM opt-in, require_power propagation); adapter flag handling in the settings branch of resolve_power — not carried into the final PowerDecision, checked whether any caller relies on it (none found in this diff, so not flagged as a confirmed bug); single-node AgentX --require-power enforcement wiring in collect.py; and multinode REQUIRE_POWER env propagation in drivers/srt/__init__.py for the eval-only/cluster-default branch.
Extended reasoning...
The change adds default GPU/CPU power telemetry collection for GB200/GB300 SRT recipes: it touches infx/launch/drivers/srt/{init.py,power.py,collect.py}, infx/clusters/slurm.py, infx/results code, ~70 recipe YAMLs, docs, and tests. No auth/crypto/injection surface is touched; the sensitive logic is benchmark-config correctness (whether power enforcement/defaults apply on the right lanes). Four candidate issues around require_power/adapter propagation were investigated and ruled out as confirmed bugs, but the branching is dense enough (cluster-default settings vs legacy opt-in, eval-only short circuits, multinode vs single-node enforcement) that I deferred rather than approved given the size and the non-trivial design decisions embedded in the propagation logic.
|
@claude. review plz |
|
Claude finished @edwingao28's task in 5m 41s —— View job Review of PR #3670: NVL72 power collection on by defaultI found no blocking bugs. Below are the checks I ran myself and a few non-blocking notes.
Checks I ran
Non-blocking notes
Topology and performanceThe placement changes alter host contention. Dedicated discovery/client nodes become dedicated frontend heads with etcd/nats and the client on head. The DSV4 trtllm and vllm frontend/client move from decode nodes to head. Before merge: the PR has no primary sweep label yet, and the hardware sweep (373 matrix + 242 eval entries) depends on #3296. Every perf number for these keys should come from a fresh run on this branch, not from reuse. |
d08c1bc to
9fb655d
Compare
|
Generally most InferenceX submissions don't need to add changes to the infx package. On the off chance they do, generally the diff is small. Please prompt your agent to clean your PR to keep your diff to only necessary & minimal changes too. We have an increased code quality bar for changes to the infx package. 中文大多数 InferenceX 提交通常不需要修改 infx 包。即使确实需要,改动通常也很小。请让你的 agent 清理 PR,使改动只包含必要且最小的内容。infx 包的改动有更高的代码质量要求。 |
9fb655d to
ec878a6
Compare
70d62dd to
d08c1bc
Compare
There was a problem hiding this comment.
Findings marked 🟡 are optional suggestions and need no follow-up push.
Additional findings (outside the current diff — GitHub can't attach inline comments there):
-
🟡
inferencex-e2e/infx/srt_slurm/generate.py— Recipes written byinfx generatefor GB200/GB300 NVL72 fixed-sequence disagg points withoutpower: trueno longer match what the launcher submits. The generator skips the power binding at generate.py:110 whenever a non-agentic point lackspower. The launcher'sdecide_powernow turns on DCGM and Grace CPU telemetry for every gb200-nv/gb300-nv SRT_MULTI point. Fix: decide power binding the same way the launcher does, by always callingdecide_powerfor placed multi-node points, so NVL72 points get telemetry, the CPU source and REQUIRE_POWER. [also at: inferencex-e2e/infx/launch/drivers/srt/power.py:170 - On GB200/GB300 multi-node fixed-sequence points withoutpower: true,infx generateoutput no longer matches what is launched.]Why this was flagged
The trigger is a multi-node fixed-seq-len disagg point on runner gb200/gb300 (cluster gb200-nv or gb300-nv) whose search-space entry has no
power: true, such as the dsr1 trtllm 8k1k disagg points. At launch,decide_power(power.py:153-170) seesdefaulttrue and returns dcgm=True, cpu=True.run_multinode(init.py:193) then binds the recipe with the exporter port, thecpu_power_exportersource and REQUIRE_POWER. Ininfx generate,_binder_inputs(generate.py:110) returnsNone, None, {}becausepoint.get("power")is falsy, sodecide_powernever runs. The written recipe has no telemetry block, no CPU exporter and no REQUIRE_POWER. The module docstring says it writes "the recipes the launcher submits". On the base branch these points got no power at launch either, so both paths agreed. Now the generated recipe silently differs from the submitted one, so recipe review and composed checks built on it no longer cover the telemetry that actually runs.Verification: The generator and the launcher now disagree.
_binder_inputsin generate.py:110 never callspower.decide_powerfor these points. In power.py, theif default:branch returnsPowerDecision(dcgm=True, ..., cpu=True)whether or notrequest.poweris set. On the base branch,decide_powerreturned NO_POWER whenpowerwas not set, so the generator matched the launcher for these points.
58191c7 to
57306c2
Compare
634cfd3 to
1e9feb6
Compare
…exporter Only a row's power field sets telemetry.required, so failed telemetry no longer skips a default point's benchmark.
Summary
Multinode points now measure GPU power by default wherever the cluster has a GPU exporter: DCGM on GB200, GB300, B200, B300 and H200, the native exporter on MI355X. CPU power comes from Grace (GB200/GB300) and RAPL (MI355X). Failed telemetry keeps the result unless the row sets
power: true. Recipes with dedicated etcd/NATS nodes skip collection. No config key changes, so no changelog entry.Testing: Unit tests pass. Hardware proofs, each a point without
power:MI355X TP4-prefill variants idle some GPUs, so their power is invalid; results stay.
PR checklist and change type
Type of Change
Checklist
python -m infx.matrix.changed --base origin/mainlists affected config keys, I have appended one new entry covering them to the physical end ofinferencex-e2e/perf-changelog.yaml; if it lists none, I have added none. I have not edited historical entriesinferencex-e2e/perf-changelog.yamlentry, it carries exactly one primary sweep label (a maintainer applies it on fork PRs):full-sweep-fail-fast(recommended),full-sweep-enabled, ornon-canary-full-sweep-enabled. Optional modifiersall-evals,evals-only, andagentx-fastrequire a primary label; the last two block reuse while applied.OWNER/MEMBER/COLLABORATOR) has commented/use <run_id>(or the legacy/reuse-sweep-run) on this PR. Do this only once there is a final full sweep that is all green with evals passing, since after this comment the primary sweep label will no longer automatically kick off new sweeps. Remove and re-add the primary sweep label to force a new sweep.