system_power.json¶
The provisioned-power descriptor for one system. One per system, not per point: provisioned
power and node counts are the same for the whole frontier; a point can scale it with nodes_used in
point.yaml. Why it exists and what it's used for: What is MLPerf
Endpoints?.
Required, and authored by you
Every system needs one. A system without it, or with a file from which no total can be derived,
fails the submission checker. Put it at the top level of at least one run folder of the system;
the builder places it at results/<system>/system_power.json in the bundle. Authored in step
5.
Fields¶
The checker reads the shape below. Every field is optional on its own, but the file as a whole has to yield a total.
| Field | Type | Description |
|---|---|---|
provisioned_power_w |
number | A declared total, in watts. If present it is used as-is and the component groups are ignored |
rack_power_w, rack_nodes, submitted_nodes |
number | Rack-level node scaling (§4.5.2.1): the published power of a full rack of rack_nodes nodes, scaled to the submitted_nodes you submit |
cpu |
group | Host CPUs |
accelerator |
group | GPUs, ASICs and similar |
compute |
group | Optional. CPU and accelerator as one figure, where the vendor publishes them that way. Replaces cpu and accelerator |
scale_up_network |
group | The high-bandwidth fabric between accelerators — NVLink switches, TPU ICI, UALink over Ethernet. Zero in a system with no switches |
scale_out_network |
group | Only for multi-node systems with a scale-out fabric. Rules §4.5.2 counts it in the total, in two parts (below); the rules' schema makes scale_out required (E.4) |
overhead_fraction |
number | Optional, and normally left out: the checker takes it from cooling in system_desc.json (below) |
Each group has a count, a rated power per unit in watts, and a link to a public specification. The checker accepts the field names from rules §4.5.2, or a generic spelling on any group:
| Group | Count | Power per unit |
|---|---|---|
cpu |
num_cpu |
tdp_per_cpu |
accelerator |
num_accelerator |
tdp_per_accelerator |
scale_up_network, scale_out_network |
num_switches |
tdp_per_switch |
| Any group | count |
tdp_per_unit |
The rules also have the scale-out group declare its NICs and its cabling, passive or active
optical. The checker shape has no field for either, so NIC counts and power are not read; the
Appendix E shape has scale_out.nics and scale_out.cabling (E.4).
The link goes in link or public_specification. Count what's installed, as provisioned, not the
chassis maximum.
Declare cooling in system_desc.json
The overhead fraction comes from the system description's cooling field, read at system
level or from node_types: 0.30 if it says liquid (or water, or immersion), 0.50 if it says
air. A system whose nodes are cooled differently gets 0.50. Without a fraction there is no
total, so power-descriptor fails. Passive cooling matches neither value; in that case state
overhead_fraction here.
Appendix E schema¶
Appendix E now defines a new shape for this file. The checker shape above
predates it, and this page hasn't confirmed that the checker reads the new one. Two of its
structural choices are open working-group items (E.7), so treat it as provisional. In
outline: every power figure is a sourced value, with a public source or an MLCommons default, never
a bare number (E.1); the top level names the system and its cooling
(E.2); there is one entry per set of identical nodes, with its power method and
components (E.3, E.3.1); a scale_out object is required, set to
{ "present": false } for a single node (E.4); and the checker derives the computed
block (E.5). A declared_provisioned_power overrides the computed total
(E.6.2). Default CPU and accelerator TDPs are in D.2 and
D.3; worked examples in E.6.1 and E.6.2.
How the total is computed¶
What the checker computes from the fields above. The power model it implements is in §4.5.2, Power Model.
total_w = provisioned_power_w if declared
= rack_power_w × submitted_nodes / rack_nodes else, if all three are given
= major × (1 + overhead_fraction) otherwise
major = cpu + accelerator + scale_up_network
(compute replaces cpu + accelerator when given)
provisioned_power_kw = total_w / 1000
Each point's system_tps_per_kw divides by point_power_kw, which is provisioned_power_kw scaled
by the nodes that point engages (§4.5.3).
The block above is the checker's behaviour, which this page hasn't confirmed against the rules'
current scale-out terms. Rules §4.5.2 now adds scale-out NIC power to major, so the overhead is
overhead_fraction × (CPU + Accelerator + Scale-up + Scale-out NICs). It also adds scale-out
switch power to the total outside the overhead base.
Both are zero for a single-node system. Whether the checker implements this is unconfirmed.
Reference NIC and switch values are in Appendix D.4; default accelerator
TDPs, where MLCommons has one, are in Appendix D.3.
Example¶
A liquid-cooled node with two CPUs, eight accelerators and one scale-up switch. Its
system_desc.json says the node is liquid-cooled, so the fraction is 0.30:
{
"cpu": { "num_cpu": 2, "tdp_per_cpu": 350, "link": "https://vendor.example/cpu-spec" },
"accelerator": { "num_accelerator": 8, "tdp_per_accelerator": 700, "link": "https://vendor.example/accel-spec" },
"scale_up_network": { "num_switches": 1, "tdp_per_switch": 3500, "link": "https://vendor.example/switch-spec" }
}
Evidence, partial systems and estimates¶
These are policy, and live in the rules:
- Which sources count as evidence for a power figure, and what a component running below its rated TDP has to show: §4.5.2, Methodology.
- How to state the power of a partially populated system, whether a partial rack, a node with
empty accelerator slots, or a system under a TDP cap: §4.5.2.1. Linear scaling
is allowed only at whole-node granularity, over identical nodes, with
Yrounded up to a whole node. A rack of mixed node types is split into sets of identical nodes, scaled separately and summed. - What MLCommons does with values you leave out, and the "MLC Estimated Power" tag the result then carries: §4.5.2.
Where a published figure is a range, the rules use the upper bound. Every value needs a public source unless it is an MLCommons default, and a published rack or system rating is specific to the vendor and SKU that published it (Component Template).
If the MLCommons formula or a default diverges materially from your actual provisioned power, report it to MLCommons, whether it overstates or understates. Knowingly keeping an understated estimate is a misrepresentation (Component Template, Submission Rules §8.4).
The bundle build also fails if two runs of the same system carry different system_power.json
contents.
Caveats
- Scope. Rules §4.5 applies normalization to Standardized CoP and CoN, makes it optional for RDI, and defers Serviced. The same section says every submission must include the file, and the checker requires it for every system regardless of division. Until that's reconciled, include it whatever your division. Tracked as B11.
- Pending ratification. Tier definitions, overhead fractions, reference components and the metric's name and units are all marked subject to change.
Last verified against: mlcommons/endpoints_policies@main (1818269) and
mlcommons/endpoints-submission-cli@main (a42a056, v1.1.0.0), 2026-10-02.