Repository navigation
[power_model] rate B300 HGX GPUs at 1,100 W / [power_model] 将 B300 HGX GPU 额定功耗改为 1,100 W - #4960
Conversation
1,200 W was a pre-launch estimate; the air-cooled HGX B300 is rated 1,100 W per GPU, the part our B300 cluster runs.
There was a problem hiding this comment.
I reviewed this PR and didn't find any bugs. The changed paths fall under the repo-wide CODEOWNERS entry, and whether B300 should be rated at 1,100 W is a modeling choice, so a maintainer should still take a look.
What was reviewed:
- Recomputed the B300 rows in
test_hgx_fans_psu.pyby hand. Design heat is 8 × 1,100 + 1,448 = 10,248 W, and fans at design are about 607.54 W. Also recomputed thetest_boards.pyfan values with the controlled cubic policy (0.1·L³/D² per chassis, three chassis), which gives 18.322 W idle and 23.475 W active. All of these match the new expected values. - Searched
power_model/srcfor other B300 references to 1,200 W and found none.B300_BOARD_BASELINEdoesn't state a TDP. The only 1,200 W left is the GB200 Bianca board, which is correct. - Not checked: the
test_cli.pyandtest_hgx_inventory.pytotals that include PSU loss, and the cross-repo app PR. The description still has the APP_PR_URL placeholder there.
Extended reasoning...
The change lowers the B300HGXBoard default GPU TDP from 1200 W to 1100 W, bumps the HGX_FAN_BASELINE provenance to version 2 with updated assumption text, and re-pins the B300 expected values in four test files. It touches no security-sensitive surface. The fan-sizing math checks out for the design-heat and controlled-policy test rows. I deferred because the repo-wide CODEOWNERS entry covers these paths, the 1,100 W rating is a domain decision for a maintainer, and the required app port PR isn't linked yet.
Summary
B300HGXBoardaccepts onlygpu_tdp_w=1200, a pre-launch estimate. The air-cooled HGX B300 is rated 1,100 W per GPU (Supermicro HGX B300 datasheet). The InferenceX-app GPU registry already rates B300 at 1,100 W, so the dashboard draws a 1,100 W TDP line while this model sizes B300 cooling for 1,200 W.NormalizedHGXFanPowersizes fans from GPU count times GPU TDP, so the higher rating gives a larger design heat and a lower fan duty at the same load. B300 design heat drops from 11,048 W to 10,248 W per chassis. For one B300 chassis at 100 W per GPU, idle, modeled IT power moves from 2,034.83 W to 2,035.94 W.Changes:
B300HGXBoard.gpu_tdp_w(ubb/b300_hgx.py) accepts and defaults to 1100. A value of 1200 now fails validation.HGX_FAN_BASELINE(hgx_fans.py) lists B300 at 1100 W. Its version goes from 1 to 2 because a profile assumption changed, as in [power_model] calibrate Pollara NIC power from nicctl readings / [power_model] 基于 nicctl 实测校准 Pollara 网卡功耗 #4753, [power_model] calibrate DDR5 DIMM power and AMD DIMM counts from BMC readings / [power_model] 基于 BMC 实测校准 DDR5 DIMM 功耗与 AMD DIMM 配置 #4741 and [power_model] calibrate x86 and Grace CPU state power from measurements / [power_model] 基于实测校准 x86 与 Grace CPU 状态功耗 #4645.test_boards.pynow rejects 1200 for B300 (it previously used 1000), so a revert fails.test_boards.py,test_cli.py,test_hgx_inventory.pyandtest_hgx_fans_psu.pymove to the new fan sizing. Non-fan component watts are unchanged.Testing:
pytest power_model/tests: 401 passed.test_incomplete_or_inconsistent_board_component_power_is_rejected).test_hgx_fans_psu.pyB300 row matches a hand check. Design heat is 8 × 1,100 + 1,448 = 10,248 W, and fans are 10,248 × 563.2 / 9,500 = 607.54 W.test_boards.py, each changed total equals its changed fan watts (+2.557 W idle, +3.277 W active, three chassis), so only cooling moved.python -m infx.matrix.changed --base origin/main: 0 of 186 config keys changed, so there is noperf-changelog.yamlentry.ruff checkandruff format --checkpass.Limits:
Delivery:
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.