<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mlperf-Power on lo0 — Tech Blog</title><link>https://blog.lo0.es/en/tags/mlperf-power/</link><description>Recent content in Mlperf-Power on lo0 — Tech Blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Mon, 15 Jun 2026 06:00:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/en/tags/mlperf-power/index.xml" rel="self" type="application/rss+xml"/><item><title>MLPerf Power: the standard energy-efficiency benchmark for on-premise ML systems</title><link>https://blog.lo0.es/en/posts/mlperf-power-energy-efficiency-benchmark/</link><pubDate>Mon, 15 Jun 2026 06:00:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/mlperf-power-energy-efficiency-benchmark/</guid><description>&lt;blockquote>
&lt;p>Notation: amounts in &lt;strong>euros (N €)&lt;/strong>, decimals with a point. The dollar sign is not used
(on this site it is a formula delimiter).&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>MLPerf Power is the only standardised benchmark for measuring the energy efficiency of complete ML systems. It is run by the MLCommons Power Working Group and backed by more than 20 organisations. It measures power at the wall (AC wall power) for the whole System Under Test, GPUs, CPUs, memory, interconnect and fans included, with a SPEC PTDaemon certified power analyser (Yokogawa WT310/WT5000) and the public tooling in &lt;code>mlcommons/power-dev&lt;/code>. The central metric for datacenter inference is samples/joule (or tokens/joule for LLMs); for latency, energy per stream. The public corpus adds up to 1,841 reproducible measurements from 60 systems (590 datacenter, 792 edge, 447 tiny, 12 training). GPT-J and Llama 2 show improvements of more than 100× in samples/joule between the first and the latest available rounds. The direct comparison with the software-based measurement of post C3 (DCGM/NVML/RAPL/Kepler) shows that MLPerf Power offers maximum accuracy and reproducibility at the cost of dedicated hardware (~3,000 USD for the Yokogawa 310E) and of the requirement to be an MLCommons member to access PTDaemon; software measurement is continuous, needs no extra hardware, but carries a wider error bar and no external validation.&lt;/p>
&lt;hr>
&lt;h2 id="what-mlperf-power-is-and-how-it-fits-into-the-mlcommons-ecosystem">What MLPerf Power is and how it fits into the MLCommons ecosystem&lt;/h2>
&lt;p>MLCommons is the consortium of more than 100 organisations (NVIDIA, Google, Intel, Dell, AMD, Meta and others) that maintains the MLPerf benchmarks: Training, Inference (Datacenter and Edge), Tiny, HPC, Storage, Client and Automotive. The Power Working Group is the specific group that extends each of those benchmarks by adding the energy dimension (&lt;a href="https://mlcommons.org/working-groups/benchmarks/power/">MLCommons Power Working Group&lt;/a>).&lt;/p>
&lt;p>MLPerf Power is not a standalone benchmark: it is an energy measurement layer overlaid on the existing performance benchmarks. For a submission to be valid with power, it must first satisfy the performance rules (MLPerf Inference, Training or Tiny) and then the additional power measurement rules.&lt;/p>
&lt;h3 id="coupling-with-mlperf-inference">Coupling with MLPerf Inference&lt;/h3>
&lt;p>The integration most relevant to on-premise inference is with MLPerf Inference Datacenter, which defines:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Scenarios&lt;/strong>: &lt;code>Server&lt;/code> (latency, queries per second with a request queue) and &lt;code>Offline&lt;/code> (pure throughput, batch with no latency constraint). Power is measured in both.&lt;/li>
&lt;li>&lt;strong>Benchmarks&lt;/strong>: ResNet-50, BERT, RNN-T, 3D-UNET, RetinaNet, DLRM, GPT-J 6B, Llama 2 70B (from v4.0), Mixtral 8×7B (from v5.0).&lt;/li>
&lt;li>&lt;strong>Divisions&lt;/strong>: &lt;code>closed&lt;/code> (model and preprocessing fixed, only runtime optimisation allowed) and &lt;code>open&lt;/code> (modifications to the model permitted).&lt;/li>
&lt;/ul>
&lt;p>Power is measured during the performance phase, not during accuracy or compliance. The same run that produces the performance log produces the power log: reporting the highest performance of three runs and the lowest power of another three is forbidden (&lt;a href="https://github.com/mlcommons/inference_policies/blob/master/power_measurement.adoc">MLPerf Inference Power Measurement Rules, §5.9&lt;/a>).&lt;/p>
&lt;h3 id="coupling-with-mlperf-training-and-tiny">Coupling with MLPerf Training and Tiny&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>MLPerf Training&lt;/strong>: large-scale power measurement (multi-node, 10K+ GPUs) does not use an external analyser, which would be impracticable. Node telemetry (IPMI/Redfish) plus an estimate for the interconnect network is used instead. The metric is energy to train (J or kWh). In the v4.0 submissions with power, the systems running Llama 2 70B Training range from single nodes to hundreds, revealing the non-linear scaling of energy (&lt;a href="https://arxiv.org/abs/2410.12032">arXiv 2410.12032&lt;/a>).&lt;/li>
&lt;li>&lt;strong>MLPerf Tiny&lt;/strong>: microcontroller systems (from 5.64 mW). Specialised micro-power instrumentation is used, with hardware pins to demarcate the start and end of the inference. The metric is energy per inference (J), not samples/joule.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="measurement-methodology-certified-wall-power">Measurement methodology: certified wall power&lt;/h2>
&lt;h3 id="the-fundamental-principle-the-whole-sut-at-the-wall">The fundamental principle: the whole SUT, at the wall&lt;/h3>
&lt;p>Rule number one is absolute: power must be measured at system level, that is, including every component the benchmark activates: host processors, accelerators, memory, disks, fans, internal interconnect. Measuring the GPUs alone is not enough (&lt;a href="https://github.com/mlcommons/inference_policies/blob/master/power_measurement.adoc">MLPerf Inference Power Measurement Rules, §5.1&lt;/a>):&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;The power consumption must be measured at the system level, i.e. including all components that are sensitized by LoadGen e.g. the host processor on which LoadGen runs, accelerators, memory, fans, etc.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Power is measured in AC (alternating current), at the SUT input, upstream of the PSUs. Any battery or energy storage between the mains socket and the system PSUs is forbidden.&lt;/p>
&lt;h3 id="measurement-hardware-spec-certified-power-analyser">Measurement hardware: SPEC-certified power analyser&lt;/h3>
&lt;p>MLPerf Power requires a power analyser certified by SPEC PTDaemon (&lt;a href="https://open.spec.org/power/docs/specpower-device_list/">official SPEC list&lt;/a>). The most widespread in submissions is the Yokogawa WT310E (~3,000 USD), which connects to the director over USB (Linux) or Ethernet/serial (Windows). Voltage is measured in parallel and current in series with the SUT power line.&lt;/p>
&lt;p>Relevant specifications of the Yokogawa WT310E:&lt;/p>
&lt;ul>
&lt;li>Power accuracy: 0.1 % of reading + 0.1 % of range&lt;/li>
&lt;li>Measurement range: µW to MW (the WT5000 reaches industrial installations)&lt;/li>
&lt;li>Update rate: from 50 ms&lt;/li>
&lt;/ul>
&lt;p>For systems with more than one channel, or multi-PSU nodes, multi-analyser configurations are allowed. The ranging rule: first a ranging run is performed with the range in &lt;code>Auto&lt;/code> mode to determine the maximum current and voltage values; the testing runs use fixed ranges based on those peaks, which maximises accuracy within the range. &lt;code>Auto&lt;/code> mode is not permitted in the testing runs.&lt;/p>
&lt;h3 id="spec-ptdaemon-the-daemon-that-orchestrates-the-measurement">SPEC PTDaemon: the daemon that orchestrates the measurement&lt;/h3>
&lt;p>PTDaemon (Power Thermal Daemon) is the SPEC tool that handles communication with the analyser. MLCommons is licensed to use it within the MLPerf Power flow. Access requires MLCommons membership and signing the corresponding EULA (&lt;a href="https://github.com/mlcommons/inference_policies/blob/master/power_measurement.adoc#frequently-asked-questions-faq">MLPerf Power FAQ&lt;/a>).&lt;/p>
&lt;p>The measurement flow is as follows:&lt;/p>
&lt;div class="diagram" style="max-width:760px;margin:1rem auto;">
&lt;svg viewBox="0 0 760 230" role="img" aria-label="MLPerf Power measurement flow: Director with PTDaemon connected to the Yokogawa analyser, which feeds the SUT; a client on the SUT synchronises timestamps over NTP" xmlns="http://www.w3.org/2000/svg">
&lt;style>.bx{fill:none;stroke:currentColor;stroke-width:1.3}.dsh{fill:none;stroke:currentColor;stroke-width:1.2;stroke-dasharray:5 3}.tl{font:600 12px sans-serif;fill:currentColor}.ts{font:11px sans-serif;fill:currentColor}.ar{fill:none;stroke:currentColor;stroke-width:1.3;marker-end:url(#am)}&lt;/style>
&lt;defs>&lt;marker id="am" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="currentColor"/>&lt;/marker>&lt;/defs>
&lt;rect class="bx" x="20" y="40" width="200" height="64" rx="6"/>
&lt;text x="32" y="62" class="tl">Director (PC)&lt;/text>
&lt;text x="32" y="78" class="ts">server.py + PTDaemon&lt;/text>
&lt;text x="32" y="94" class="ts">NTP sync → CSV logs&lt;/text>
&lt;path class="ar" d="M220,72 L280,72"/>
&lt;rect class="bx" x="280" y="40" width="160" height="64" rx="6"/>
&lt;text x="292" y="62" class="tl">Analyser&lt;/text>
&lt;text x="292" y="78" class="ts">Yokogawa WT310E&lt;/text>
&lt;text x="292" y="94" class="ts">AC wall power&lt;/text>
&lt;path class="ar" d="M440,72 L500,72"/>
&lt;rect class="bx" x="500" y="20" width="240" height="104" rx="6"/>
&lt;text x="512" y="42" class="tl">SUT (System Under Test)&lt;/text>
&lt;text x="512" y="58" class="ts">client.py + LoadGen&lt;/text>
&lt;text x="512" y="74" class="ts">4×H100 SXM + CPU + RAM&lt;/text>
&lt;text x="512" y="90" class="ts">fans + interconnect&lt;/text>
&lt;text x="512" y="106" class="ts">→ performance log + timestamps&lt;/text>
&lt;line class="dsh" x1="360" y1="130" x2="360" y2="190"/>
&lt;text x="280" y="155" class="ts">current in series&lt;/text>
&lt;text x="280" y="170" class="ts">voltage in parallel&lt;/text>
&lt;text x="20" y="215" class="ts">The analyser measures AC at the SUT input. Director and SUT sync over NTP. Power log and performance log are aligned by timestamp to compute the final metric.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>The process step by step (&lt;a href="https://github.com/mlcommons/power-dev">&lt;code>mlcommons/power-dev&lt;/code>&lt;/a>):&lt;/p>
&lt;ol>
&lt;li>&lt;strong>NTP sync&lt;/strong> between Director and SUT to align timestamps.&lt;/li>
&lt;li>&lt;strong>Ranging run&lt;/strong>: power with ranges in &lt;code>Auto&lt;/code>; the analyser determines the current and voltage peaks.&lt;/li>
&lt;li>&lt;strong>Testing run&lt;/strong>: fixed ranges; LoadGen runs the benchmark; the Director records power with timestamps; the SUT records the performance log with start/end timestamps of the execution phase.&lt;/li>
&lt;li>&lt;strong>Post-processing&lt;/strong>: the result summariser cross-references power log and performance log by timestamp to compute the mean power over the execution window.&lt;/li>
&lt;li>&lt;strong>A minimum of 60 seconds&lt;/strong> of valid power data. If the workload finishes before 60 s, it is run in a loop until that threshold is reached.&lt;/li>
&lt;/ol>
&lt;h3 id="what-is-and-is-not-inside-the-sut">What is and is not inside the SUT&lt;/h3>
&lt;p>The SUT includes everything the benchmark activates:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Inside the SUT&lt;/th>
&lt;th>Outside the SUT&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>GPUs / accelerators&lt;/td>
&lt;td>PDU shared with other systems&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Host CPU and RAM&lt;/td>
&lt;td>Datacenter cooling infrastructure (PUE)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Disks / NVMe if the benchmark uses them&lt;/td>
&lt;td>Management network (BMC, out of band)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Node fans and cooling systems&lt;/td>
&lt;td>Datacenter network switches (not the node&amp;rsquo;s)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Internal interconnect (NVLink, PCIe)&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Node PSUs&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The paper makes it explicit: PUE is out of scope for MLPerf Power by design (&lt;a href="https://arxiv.org/abs/2410.12032">arXiv 2410.12032, §III-C&lt;/a>). MLPerf measures the efficiency of the ML system, not that of the datacenter. Including PUE would obscure the differences between systems by mixing hardware efficiency with building efficiency.&lt;/p>
&lt;hr>
&lt;h2 id="metrics-formulas-and-definitions">Metrics: formulas and definitions&lt;/h2>
&lt;h3 id="throughput-benchmarks-datacenter--offline--edge">Throughput benchmarks (Datacenter / Offline / Edge)&lt;/h3>
&lt;p>For throughput benchmarks, Offline and Server in datacenter plus some edge scenarios, the energy efficiency metric is:&lt;/p>
$$\eta = \frac{\text{throughput (samples/s)}}{\text{mean power (W)}} \quad \Rightarrow \quad \left[\frac{\text{samples}}{\text{J}}\right]$$
&lt;p>where mean power is computed over the window of the execution phase of the performance run. The reciprocal gives energy per sample:&lt;/p>
$$E_{\text{sample}} = \frac{\text{mean power (W)}}{\text{throughput (samples/s)}} \quad \left[\text{J/sample}\right]$$
&lt;p>For LLM benchmarks (GPT-J, Llama 2), where the output varies in length, a &amp;ldquo;sample&amp;rdquo; is one complete query (prompt + response). Energy per output token is obtained by dividing by the number of tokens generated, which varies per query and must be reported or estimated.&lt;/p>
&lt;h3 id="latency-benchmarks-single-stream--tiny">Latency benchmarks (Single Stream / Tiny)&lt;/h3>
&lt;p>For latency benchmarks, Single Stream in edge and tiny, where the processing time is fixed, the metric is the inverse of energy per inference:&lt;/p>
$$\eta_{\text{latency}} = \frac{1}{E_{\text{inference}}} \quad \left[\frac{1}{\text{J}}\right]$$
&lt;p>The paper treats both metrics (samples/J and 1/J) as comparable within their category, although they are not interchangeable between categories.&lt;/p>
&lt;h3 id="system-power-and-run-energy">System power and run energy&lt;/h3>
&lt;p>The three quantities that appear in every power submission:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Quantity&lt;/th>
&lt;th>Definition&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>System power&lt;/strong>&lt;/td>
&lt;td>mean of the AC power samples over the execution window&lt;/td>
&lt;td>W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Run energy&lt;/strong>&lt;/td>
&lt;td>mean power × window duration&lt;/td>
&lt;td>J&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Energy efficiency&lt;/strong>&lt;/td>
&lt;td>throughput / system power = samples/J&lt;/td>
&lt;td>samples/J&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The run energy formula:&lt;/p>
$$E_{\text{run}} = \bar{P} \times \Delta t = \frac{\sum_{i} P_i \cdot \Delta t_i}{\Delta t_{\text{total}}} \times \Delta t_{\text{total}} \quad [\text{J}]$$
&lt;p>where \( P_i \) are the analyser samples and \( \Delta t_i \) the intervals between samples, both inside the window demarcated by the LoadGen timestamps.&lt;/p>
&lt;hr>
&lt;h2 id="how-to-read-an-mlperf-power-submission">How to read an MLPerf Power submission&lt;/h2>
&lt;h3 id="divisions-and-availability-categories">Divisions and availability categories&lt;/h3>
&lt;p>Submissions inherit the divisions of MLPerf Inference:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Division&lt;/th>
&lt;th>Constraints&lt;/th>
&lt;th>Comparability&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Closed&lt;/strong>&lt;/td>
&lt;td>Fixed model, fixed preprocessing, only the runtime and the hardware are optimised&lt;/td>
&lt;td>High: submissions directly comparable with each other&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Open&lt;/strong>&lt;/td>
&lt;td>Modifications to the model allowed (aggressive quantisation, distillation, pruning)&lt;/td>
&lt;td>Low: each system may use a different model&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Within closed, there are system availability categories:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Category&lt;/th>
&lt;th>Definition&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Available&lt;/strong>&lt;/td>
&lt;td>System commercially available at the closing date&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Preview&lt;/strong>&lt;/td>
&lt;td>Announced but not commercially available&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>RDI&lt;/strong> (Research, Development, Internal)&lt;/td>
&lt;td>Systems for internal or experimental use&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Only Available systems in closed are comparable without caveats. A Preview system with better energy than an Available one from another company is not a valid comparison for purchasing decisions.&lt;/p>
&lt;h3 id="what-comparability-mlperf-power-gives-and-what-it-does-not">What comparability MLPerf Power gives and what it does not&lt;/h3>
&lt;p>It gives:&lt;/p>
&lt;ul>
&lt;li>An objective comparison of the energy efficiency of complete nodes (not just the GPU) under a standardised ML workload.&lt;/li>
&lt;li>Verified reproducibility: the logs are published on GitHub and anyone can review them.&lt;/li>
&lt;li>Trends over time between rounds: how much the efficiency of each hardware family improves version to version.&lt;/li>
&lt;li>A basis for comparing heterogeneous systems running the same workload under the same rules.&lt;/li>
&lt;/ul>
&lt;p>It does not give:&lt;/p>
&lt;ul>
&lt;li>An isolated GPU-to-GPU comparison (it measures the complete node, not the card alone).&lt;/li>
&lt;li>Broad hardware coverage: the number of submissions with power is small. In v4.0 only four companies (Dell, Fujitsu, NVIDIA, Qualcomm) delivered power numbers for datacenter. In v5.1 there were two power submissions (Lenovo datacenter + GATEOverflow edge).&lt;/li>
&lt;li>Representativeness of your own workloads: the benchmarks are fixed and may not match the distribution of your real load (batch size, prompt length, prefill/decode ratio).&lt;/li>
&lt;li>Datacenter cooling data: PUE, liquid vs air, are out of scope.&lt;/li>
&lt;li>Real-time comparison: results are published months after the closing date.&lt;/li>
&lt;/ul>
&lt;h3 id="structure-of-a-submission">Structure of a submission&lt;/h3>
&lt;p>Every power submission publishes the following in the MLCommons results repository:&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;lt;division&amp;gt;/&amp;lt;submitter&amp;gt;/measurements/&amp;lt;system&amp;gt;/
├── analyzer_table.md # Analyser configuration (model, ranges)
├── power_settings.md # Power management configuration of the SUT
results/&amp;lt;system&amp;gt;/&amp;lt;benchmark&amp;gt;/&amp;lt;scenario&amp;gt;/
├── mlperf_log_summary.txt # Performance results (LoadGen)
├── spl.txt # Power log (power, current, voltage, timestamps)
└── ...
&lt;/code>&lt;/pre>&lt;p>The &lt;code>spl.txt&lt;/code> files contain the raw analyser readings with timestamps, which makes it possible to verify alignment with the LoadGen window.&lt;/p>
&lt;hr>
&lt;h2 id="data-scale-trends-and-reference-hardware">Data: scale, trends and reference hardware&lt;/h2>
&lt;h3 id="the-corpus-1841-measurements-from-60-systems">The corpus: 1,841 measurements from 60 systems&lt;/h3>
&lt;p>The MLPerf Power submissions database covers (&lt;a href="https://arxiv.org/abs/2410.12032">arXiv 2410.12032&lt;/a>):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Category&lt;/th>
&lt;th>Submissions&lt;/th>
&lt;th>Power range&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Datacenter (Inference)&lt;/td>
&lt;td>590&lt;/td>
&lt;td>~200 W – ~10 kW per node&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Edge (Inference)&lt;/td>
&lt;td>792&lt;/td>
&lt;td>~10 W – several kW&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Tiny (Inference)&lt;/td>
&lt;td>447&lt;/td>
&lt;td>&lt;strong>5.64 mW&lt;/strong> – hundreds of mW&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Training / HPC&lt;/td>
&lt;td>12&lt;/td>
&lt;td>up to &lt;strong>500 kW&lt;/strong> (measured); ~10 MW estimated in HPC&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The total range runs from microwatts to megawatts, 9 orders of magnitude, which means no single methodology applies across every segment.&lt;/p>
&lt;h3 id="energy-efficiency-improvements-llms-lead">Energy efficiency improvements: LLMs lead&lt;/h3>
&lt;p>The evolution of the samples/joule metric between rounds, normalised to the first submission of each model (&lt;a href="https://arxiv.org/abs/2410.12032">arXiv 2410.12032, §V-A&lt;/a>):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Workload&lt;/th>
&lt;th>Category&lt;/th>
&lt;th>Cumulative improvement (samples/J)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>GPT-J 6B&lt;/td>
&lt;td>Datacenter&lt;/td>
&lt;td>&lt;strong>&amp;gt;100×&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama 2 70B&lt;/td>
&lt;td>Datacenter&lt;/td>
&lt;td>&lt;strong>&amp;gt;100×&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RetinaNet&lt;/td>
&lt;td>Datacenter&lt;/td>
&lt;td>Largest among the classic models&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>BERT-99.0&lt;/td>
&lt;td>Edge&lt;/td>
&lt;td>~4×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RNN-T&lt;/td>
&lt;td>Edge&lt;/td>
&lt;td>~4×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ResNet-50&lt;/td>
&lt;td>Edge&lt;/td>
&lt;td>~1.5×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ResNet-50&lt;/td>
&lt;td>Tiny&lt;/td>
&lt;td>&lt;strong>&amp;gt;1,000×&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Other Tiny&lt;/td>
&lt;td>Tiny&lt;/td>
&lt;td>79× – 596×&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The &amp;gt;100× improvements in datacenter LLMs reflect the massive industry attention on software optimisation (FP8 kernels, FlashAttention, speculation) and hardware (tensor core architectures, HBM3). Tiny models show even larger gains in relative terms thanks to the low starting point and the progress in specialised chips.&lt;/p>
&lt;h3 id="on-premise-reference-hardware">On-premise reference hardware&lt;/h3>
&lt;p>For a node of 4×H100 SXM 80 GB (the track&amp;rsquo;s generic hardware), the typical values in MLPerf Power:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Indicative value&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Declared TDP 4×H100 SXM&lt;/td>
&lt;td>4 × 700 W = 2,800 W (GPU only)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>System power (complete node) measured at the wall&lt;/td>
&lt;td>~3,500 – 5,000 W depending on load&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CPU + RAM + fans overhead over GPU&lt;/td>
&lt;td>25 – 45 % of the total&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Efficiency: Llama 2 70B offline (closed)&lt;/td>
&lt;td>a function of the runtime; order of magnitude ~0.1 – 1 tokens/J&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The key point: the &amp;ldquo;node overhead&amp;rdquo;, the difference between what the analyser measures at the wall and what NVML reports for the GPUs, is 25–45 % of total consumption. A GPU-only measurement underestimates the real system consumption by that margin.&lt;/p>
&lt;p>For the A100 PCIe 80 GB (4× per node), system consumption is lower (GPU TDP ~300 W each, node ~1,500–2,000 W), with better efficiency per watt but lower absolute throughput. The L40S (4× per node) has an intermediate profile: TDP ~350 W each, good FP8 inference performance, node consumption ~1,800–2,500 W.&lt;/p>
&lt;hr>
&lt;h2 id="contrast-with-the-software-measurement-of-post-c3">Contrast with the software measurement of post C3&lt;/h2>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/measuring-energy-in-production-kepler-dcgm-stack/">Post C3 of this track&lt;/a> covers the DCGM/NVML/RAPL/Kepler stack in production. Here is the data-driven comparison against MLPerf Power:&lt;/p>
&lt;div class="diagram" style="max-width:760px;margin:1rem auto;">
&lt;svg viewBox="0 0 760 190" role="img" aria-label="Comparison of two approaches: software measurement with DCGM/Kepler (continuous, no extra hardware, wider error bar, not certified) vs MLPerf Power with a physical analyser (point in time, dedicated hardware, maximum accuracy, certified)" xmlns="http://www.w3.org/2000/svg">
&lt;style>.bx{fill:none;stroke:currentColor;stroke-width:1.3}.tl{font:600 12px sans-serif;fill:currentColor}.ts{font:11px sans-serif;fill:currentColor}&lt;/style>
&lt;rect class="bx" x="20" y="30" width="340" height="130" rx="6"/>
&lt;text x="32" y="52" class="tl">Software measurement (C3)&lt;/text>
&lt;text x="32" y="70" class="ts">DCGM/NVML → GPU power (on-device)&lt;/text>
&lt;text x="32" y="86" class="ts">RAPL → CPU + DRAM (on-device)&lt;/text>
&lt;text x="32" y="102" class="ts">Kepler eBPF → per pod/MIG&lt;/text>
&lt;text x="32" y="118" class="ts">Continuous in production, no extra hardware&lt;/text>
&lt;text x="32" y="134" class="ts">Error bar: ±5–15 % vs power meter&lt;/text>
&lt;text x="32" y="150" class="ts">Not externally certified&lt;/text>
&lt;rect class="bx" x="400" y="30" width="340" height="130" rx="6"/>
&lt;text x="412" y="52" class="tl">MLPerf Power (C4)&lt;/text>
&lt;text x="412" y="70" class="ts">Yokogawa WT310E analyser (AC, at the wall)&lt;/text>
&lt;text x="412" y="86" class="ts">SPEC PTDaemon (SPEC certified)&lt;/text>
&lt;text x="412" y="102" class="ts">Measures the whole SUT as a system&lt;/text>
&lt;text x="412" y="118" class="ts">Only during the benchmark (not continuous)&lt;/text>
&lt;text x="412" y="134" class="ts">Accuracy: ±0.1 % reading + ±0.1 % range&lt;/text>
&lt;text x="412" y="150" class="ts">Externally certified and reproducible&lt;/text>
&lt;/svg>
&lt;/div>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Dimension&lt;/th>
&lt;th>Software (DCGM/NVML/RAPL/Kepler)&lt;/th>
&lt;th>MLPerf Power (analyser + PTDaemon)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>What it measures&lt;/strong>&lt;/td>
&lt;td>On-device sensors (GPU, CPU, DRAM)&lt;/td>
&lt;td>AC wall power (the whole node)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Coverage&lt;/strong>&lt;/td>
&lt;td>GPU + CPU + DRAM (≠ the wall)&lt;/td>
&lt;td>Complete node including fans, PSU overhead&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Node overhead&lt;/strong>&lt;/td>
&lt;td>Not captured by default&lt;/td>
&lt;td>Included in the measurement&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Accuracy&lt;/strong>&lt;/td>
&lt;td>±5–15 % vs power meter (Kepler estimate); NVML ~3–5 % on the GPU&lt;/td>
&lt;td>±0.1 % reading + ±0.1 % range (Yokogawa WT310E)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Frequency / continuity&lt;/strong>&lt;/td>
&lt;td>Continuous in production (sub-second)&lt;/td>
&lt;td>Only during the benchmark run&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Extra hardware&lt;/strong>&lt;/td>
&lt;td>None (uses system sensors)&lt;/td>
&lt;td>SPEC-certified analyser (~3,000 USD)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Attribution per workload&lt;/strong>&lt;/td>
&lt;td>Per pod/MIG with Kepler&lt;/td>
&lt;td>No: it measures the system, not the individual workload&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>External certification&lt;/strong>&lt;/td>
&lt;td>No&lt;/td>
&lt;td>Yes (SPEC PTDaemon + MLCommons review)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Data access&lt;/strong>&lt;/td>
&lt;td>Real time in Prometheus&lt;/td>
&lt;td>Public logs on GitHub after the round&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Recommended use&lt;/strong>&lt;/td>
&lt;td>Continuous monitoring in production&lt;/td>
&lt;td>Certified comparative benchmarking&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The operational conclusion: the two approaches are complementary, not competing. The DCGM/Kepler stack gives the continuous per-pod view for production; MLPerf Power gives the certified ground truth for hardware comparisons with reproducibility guarantees.&lt;/p>
&lt;hr>
&lt;h2 id="the-myth-of-measuring-only-the-gpu-data-from-the-paper">The myth of measuring only the GPU: data from the paper&lt;/h2>
&lt;p>The arXiv 2410.12032 paper devotes section §III-C to dismantling the myths of power measurement in ML systems. The one most relevant to on-premise inference is Myth 1:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;A common misconception is that measuring the power consumption of specific ML components, such as accelerators or GPUs, is adequate to assess system efficiency. In reality, overall system power consumption is crucial. Different components are active at various stages of ML workloads with varying duty cycles.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>The data from submissions with a wall analyser versus NVML readings confirms that the overhead of the node&amp;rsquo;s non-GPU components (CPU, memory, disks, fans, PSU losses) ranges between 25 and 45 % of total consumption depending on the system. An efficiency comparison based on NVML readings alone systematically underestimates consumption and can distort the ranking between systems with different CPU/GPU proportions.&lt;/p>
&lt;p>Myth 2 (TDP and PSU as power proxies) is also relevant: the TDP of an H100 SXM is 700 W per card, but real consumption in inference with Llama 2 70B depends on the load, the prompt length and the batch size. The MLPerf Power data shows that systems routinely run well below TDP in online inference scenarios (server scenario), where latency limits throughput and the GPU is not at 100 % utilisation.&lt;/p>
&lt;hr>
&lt;h2 id="limitations-of-the-current-submissions">Limitations of the current submissions&lt;/h2>
&lt;p>The limitations are not of the method but of the coverage:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Few submissions with power in datacenter.&lt;/strong> In v4.0 only 4 companies delivered power numbers for datacenter; in v5.1, one (Lenovo). Performance benchmarking has dozens of submitters; energy benchmarking has few. This limits the representativeness of the corpus for comparing on-premise hardware.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Heterogeneous SUTs.&lt;/strong> Each submitter defines its own SUT: number of GPUs, server, interconnect, software stack. A Dell system with 4×H100 is not directly comparable to a Supermicro one with 8×H100, even if both use the same model. Platform differences (NVLink vs PCIe, server vs rack) are captured but not separated out.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Fixed workloads.&lt;/strong> The MLPerf benchmarks are representative but they are not your load. The distribution of prompt lengths, the prefill/decode ratio and your users&amp;rsquo; batch size may differ significantly from the MLPerf synthetic datasets. The benchmark&amp;rsquo;s samples/J result is a reference, not a prediction of your workload.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Publication latency.&lt;/strong> Results are published months after the submission deadline. New hardware (H200, B100, B200) may have no power results available at the moment of the purchasing decision.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>No PUE.&lt;/strong> MLPerf Power does not include datacenter efficiency. Two identical systems in two datacenters with PUE 1.1 and 1.5 give the same MLPerf Power result but a very different electricity cost. For TCO, the MLPerf J/sample must be multiplied by your own datacenter PUE.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="usage-flow-for-an-on-premise-platform">Usage flow for an on-premise platform&lt;/h2>
&lt;p>For anyone who wants to use MLPerf Power as a purchasing reference or as their own benchmark, the practical flow:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Step&lt;/th>
&lt;th>Action&lt;/th>
&lt;th>Resource&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>Consult the publicly available submissions&lt;/td>
&lt;td>&lt;a href="https://mlcommons.org/benchmarks/inference-datacenter/">mlcommons.org/benchmarks/inference-datacenter&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>Filter by model (Llama 2 70B, GPT-J), scenario (Offline/Server) and division (Closed/Available)&lt;/td>
&lt;td>GitHub mlcommons/inference_results_vX.Y&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>Compare samples/J between systems with similar hardware&lt;/td>
&lt;td>power log + performance summary&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>Adjust for your own PUE&lt;/td>
&lt;td>samples/J × (1/PUE) for real energy in the datacenter&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>If you want to measure your own hardware: buy a Yokogawa WT310E, join MLCommons, get access to PTDaemon&lt;/td>
&lt;td>&lt;a href="https://docs.mlcommons.org/inference/power/">docs.mlcommons.org/inference/power&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6&lt;/td>
&lt;td>Calibrate the software stack (DCGM/Kepler) against the analyser once&lt;/td>
&lt;td>see &lt;a href="https://blog.lo0.es/en/posts/measuring-energy-in-production-kepler-dcgm-stack/">post C3&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="cross-links-of-the-energy-track">Cross-links of the energy track&lt;/h2>
&lt;p>This article is C4 of the energy pillar. The related articles:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/ai-energy-benchmarking-frameworks-metrics-state-of-the-art/">C1 — State of the art: energy benchmarking of LLM frameworks&lt;/a>: inventory of tools and overview of the field.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/energy-per-token-spain-methodology-electricity-market-speculation/">C2 — Energy per token: methodology and the Spanish electricity market&lt;/a>: the J/token identity and how the electricity price multiplies it.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/measuring-energy-in-production-kepler-dcgm-stack/">C3 — Measurement tooling in production: Kepler, DCGM and a practical stack&lt;/a>: the continuous stack for production that MLPerf Power complements.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-inference-benchmarking-frameworks-metrics-state-of-the-art/">Benchmarking track — state of the art of frameworks&lt;/a>: context of the performance benchmarking that MLPerf Power extends into energy.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-energy-leaderboards-wh-per-token/">LLM energy efficiency leaderboards&lt;/a> — the public J/token rankings where the MLPerf Power results appear: how to read them and what biases they carry relative to the methodology in this data sheet.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/mlperf-inference-reading-loadgen-comparability/">MLPerf Inference: how to read it and what comparability it offers&lt;/a> — the performance benchmark on which this energy measurement layer is overlaid: scenarios, LoadGen, divisions and comparison rules.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/measuring-gpu-power-nvml-dcgm-sampling-errors/">Measuring the power of a GPU: NVML, DCGM and sampling errors&lt;/a> — the software alternative to certified measurement at the wall, with its sensor and sampling limits quantified.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/watt-to-carbon-pue-grid-intensity-gco2-per-token/">From watt to carbon: PUE, grid intensity and the real cost of a token&lt;/a> — the conversion step from the W measured at the PTDaemon AC meter to gCO₂eq and to euros, applying PUE and the country&amp;rsquo;s energy mix.&lt;/li>
&lt;/ul>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>MLCommons Power Working Group — &lt;a href="https://mlcommons.org/working-groups/benchmarks/power/">https://mlcommons.org/working-groups/benchmarks/power/&lt;/a>&lt;/li>
&lt;li>arXiv 2410.12032 · MLPerf Power: Benchmarking the Energy Efficiency of Machine Learning Systems from Microwatts to Megawatts for Sustainable AI (Tschand et al., 2024) — &lt;a href="https://arxiv.org/abs/2410.12032">https://arxiv.org/abs/2410.12032&lt;/a>&lt;/li>
&lt;li>MLPerf Inference Power Measurement Rules v2.0 (power_measurement.adoc) — &lt;a href="https://github.com/mlcommons/inference_policies/blob/master/power_measurement.adoc">https://github.com/mlcommons/inference_policies/blob/master/power_measurement.adoc&lt;/a>&lt;/li>
&lt;li>MLCommons power-dev · repositorio público de herramientas de medición — &lt;a href="https://github.com/mlcommons/power-dev">https://github.com/mlcommons/power-dev&lt;/a>&lt;/li>
&lt;li>MLPerf Inference Power Measurement Documentation (MLCFlow) — &lt;a href="https://docs.mlcommons.org/inference/power/">https://docs.mlcommons.org/inference/power/&lt;/a>&lt;/li>
&lt;li>SPEC PTDaemon · lista de dispositivos certificados — &lt;a href="https://open.spec.org/power/docs/specpower-device_list/">https://open.spec.org/power/docs/specpower-device_list/&lt;/a>&lt;/li>
&lt;li>MLCommons · MLPerf Inference v1.0 con las primeras mediciones de potencia (abril 2021) — &lt;a href="https://mlcommons.org/2021/04/mlperf-inference-v1-0-results-with-first-power-measurements/">https://mlcommons.org/2021/04/mlperf-inference-v1-0-results-with-first-power-measurements/&lt;/a>&lt;/li>
&lt;li>MLCommons · MLPerf Inference v4.1 results (agosto 2024) — &lt;a href="https://mlcommons.org/2024/08/mlperf-inference-v4-1-results/">https://mlcommons.org/2024/08/mlperf-inference-v4-1-results/&lt;/a>&lt;/li>
&lt;li>MLCommons · MLPerf Inference v5.1 results (septiembre 2025) — &lt;a href="https://mlcommons.org/2025/09/mlperf-inference-v5-1-results/">https://mlcommons.org/2025/09/mlperf-inference-v5-1-results/&lt;/a>&lt;/li>
&lt;li>MLCommons · MLPerf Power benchmark presentado en IEEE HPCA 2025 — &lt;a href="https://mlcommons.org/2025/03/ml-commons-power-hpca/">https://mlcommons.org/2025/03/ml-commons-power-hpca/&lt;/a>&lt;/li>
&lt;li>SPEC Updates PTDaemon Interface (GlobeNewswire, febrero 2024) — &lt;a href="https://www.globenewswire.com/news-release/2024/02/22/2833367/0/en/SPEC-Updates-PTDaemon-Interface-to-Meet-Evolving-Industry-Requirements.html">https://www.globenewswire.com/news-release/2024/02/22/2833367/0/en/SPEC-Updates-PTDaemon-Interface-to-Meet-Evolving-Industry-Requirements.html&lt;/a>&lt;/li>
&lt;li>Yokogawa WT310E Power Analyzer — &lt;a href="https://tmi.yokogawa.com/us/solutions/products/power-analyzers/">https://tmi.yokogawa.com/us/solutions/products/power-analyzers/&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Energy benchmarking in AI: frameworks, metrics and state of the art (tool by tool)</title><link>https://blog.lo0.es/en/posts/ai-energy-benchmarking-frameworks-metrics-state-of-the-art/</link><pubDate>Sat, 13 Jun 2026 02:00:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/ai-energy-benchmarking-frameworks-metrics-state-of-the-art/</guid><description>&lt;blockquote>
&lt;p>Notation: amounts in &lt;strong>euros (N €)&lt;/strong>, decimals with a point. The energy and carbon
references are &lt;strong>European&lt;/strong> (France, Germany, Spain), since this is a sovereign
proposal. The dollar sign is not used (on this site it is a formula delimiter).&lt;/p>
&lt;/blockquote>
&lt;h2 id="what-this-introduction-covers">What this introduction covers&lt;/h2>
&lt;p>Fourth article in the data series and &lt;em>deep dive&lt;/em> on the energy axis. Measuring the watts
of an AI workload looks like a sustainability detail, but it is at once a cost lever
(electricity is 30–50 % of TCO), an axis of sovereignty (carbon per token depends on
the country) and, increasingly, a regulatory obligation (emissions reporting). This
article inventories the metrics, where each figure physically comes from, the data sheet
for each measurement framework, and how to go from watt to carbon with European figures. No
recommendations; only data and methodology, because in energy, even more than in
performance, the measurement method changes the result.&lt;/p>
&lt;hr>
&lt;h2 id="why-measuring-energy-matters-with-numbers">Why measuring energy matters (with numbers)&lt;/h2>
&lt;p>Three quantified reasons, connecting with the &lt;a href="https://blog.lo0.es/en/posts/cost-performance-energy-three-axes-llm-inference/">opening article&lt;/a>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Reason&lt;/th>
&lt;th>Figure&lt;/th>
&lt;th>Implication&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Cost&lt;/strong>&lt;/td>
&lt;td>electricity = 30–50 % of TCO&lt;/td>
&lt;td>measuring energy is measuring almost half the cost&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Sovereignty/carbon&lt;/strong>&lt;/td>
&lt;td>France ~9× fewer gCO₂/token than Germany&lt;/td>
&lt;td>the country of the cluster is a lever&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Scale/regulation&lt;/strong>&lt;/td>
&lt;td>datacenters ~460 TWh in 2025 (≈1.8 % worldwide), &amp;gt;800 TWh projected for 2028&lt;/td>
&lt;td>emissions reporting (CSRD) mandatory&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>At 700 W per H100, an 8-card node draws of the order of 5.6 kW from the boards alone, ~49,000
kWh a year. Applying PUE 1.4 that becomes ~68,700 kWh/year, and there the country decides the
bill: at the French wholesale price (~0.058 €/kWh) that is ~3,980 €/year of electricity per
node; in Germany (~0.091 €/kWh), ~6,250 €/year, 57 % more for the same iron and the same
work. Multiplied across a fleet, it is a first-order cost line, and a carbon footprint that,
in Europe, has to be measured and reported. Energy stopped being an engineering detail and
became a business and compliance variable.&lt;/p>
&lt;hr>
&lt;h2 id="the-energy-metrics">The energy metrics&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Metric&lt;/th>
&lt;th>Definition&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Mean power&lt;/td>
&lt;td>average instantaneous consumption&lt;/td>
&lt;td>W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Energy per token&lt;/strong>&lt;/td>
&lt;td>energy consumed per generated token&lt;/td>
&lt;td>J/token&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Energy per inference&lt;/td>
&lt;td>energy per request&lt;/td>
&lt;td>µJ – Wh&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Total energy&lt;/td>
&lt;td>integral of power over time&lt;/td>
&lt;td>Wh, kWh&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>PUE&lt;/strong> (Power Usage Effectiveness)&lt;/td>
&lt;td>datacenter overhead (cooling, losses)&lt;/td>
&lt;td>ratio ≥ 1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Carbon&lt;/td>
&lt;td>energy × grid intensity&lt;/td>
&lt;td>gCO₂eq&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The two base identities of the whole axis:&lt;/p>
$$\text{energy per token (J)} = \frac{\text{mean power (W)}}{\text{throughput (tok/s)}}$$
$$\text{carbon} = \text{energy (kWh)} \times \text{PUE} \times \text{grid intensity (gCO}_2\text{/kWh)}$$
&lt;p>The first has the same shape as cost per token: it shares the throughput denominator, so
raising tokens/s lowers energy per token. The second brings in the two multipliers
external to the compute, the datacenter PUE and the country&amp;rsquo;s grid intensity, which
can change carbon per token by an order of magnitude without touching the stack.&lt;/p>
&lt;hr>
&lt;h2 id="worked-example-energy-per-token-of-an-8h100-node">Worked example: energy per token of an 8×H100 node&lt;/h2>
&lt;p>To anchor the identities with numbers, the end-to-end calculation on the example node
(8×H100, Llama 3.1 70B FP16, vLLM at 2,800 tok/s):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Step&lt;/th>
&lt;th>Calculation&lt;/th>
&lt;th>Result&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Board power&lt;/td>
&lt;td>8 × 700 W&lt;/td>
&lt;td>5,600 W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Energy per token (boards)&lt;/td>
&lt;td>5,600 ÷ 2,800&lt;/td>
&lt;td>2.0 J/token&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Energy per token (with PUE 1.4)&lt;/td>
&lt;td>2.0 × 1.4&lt;/td>
&lt;td>2.8 J/token&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Energy per 1M tokens (boards)&lt;/td>
&lt;td>2 × 10⁶ J&lt;/td>
&lt;td>0.56 kWh&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Energy per 1M tokens (with PUE)&lt;/td>
&lt;td>0.56 × 1.4&lt;/td>
&lt;td>0.78 kWh&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>From there come the electricity cost and the carbon, by country:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Country&lt;/th>
&lt;th>Electricity cost / 1M tok&lt;/th>
&lt;th>Carbon / 1M tok&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>France (0.058 €/kWh; ~40 gCO₂/kWh)&lt;/td>
&lt;td>~0.045 €&lt;/td>
&lt;td>~31 gCO₂&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Spain (0.054 €/kWh; ~160 gCO₂/kWh)&lt;/td>
&lt;td>~0.042 €&lt;/td>
&lt;td>~125 gCO₂&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Germany (0.091 €/kWh; ~363 gCO₂/kWh)&lt;/td>
&lt;td>~0.071 €&lt;/td>
&lt;td>~283 gCO₂&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>And the link with performance: if an optimisation (FP8, say) raised throughput to
4,200 tok/s, energy per token would drop to ~1.33 J/token (boards) and everything below it in
the same proportion. Electricity cost and carbon per token fall with throughput, by the
identity. Note: these are board + PUE figures; the complete node (CPU, NICs, PSUs)
consumes somewhat more, and energy measured with a power meter can differ from energy
estimated with &lt;code>nvidia-smi&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="where-the-figure-comes-from-the-measurement-layers">Where the figure comes from: the measurement layers&lt;/h2>
&lt;p>Not every energy figure is equally reliable. The figure can come from four layers, with
increasing accuracy and decreasing context:&lt;/p>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 240" role="img" aria-label="Layers the energy figure comes from: GPU counters NVML/DCGM, CPU RAPL, eBPF with models, and a physical power meter as the reference" xmlns="http://www.w3.org/2000/svg">
&lt;style>.bx{fill:none;stroke:currentColor;stroke-width:1.3}.tl{font:600 12px sans-serif;fill:currentColor}.ts{font:11px sans-serif;fill:currentColor}&lt;/style>
&lt;rect class="bx" x="20" y="36" width="360" height="42" rx="6"/>
&lt;text x="32" y="55" class="tl">GPU — NVML / nvidia-smi / DCGM&lt;/text>
&lt;text x="32" y="71" class="ts">card power from a hardware counter&lt;/text>
&lt;rect class="bx" x="20" y="90" width="360" height="42" rx="6"/>
&lt;text x="32" y="109" class="tl">CPU/DRAM — RAPL&lt;/text>
&lt;text x="32" y="125" class="ts">Intel/AMD counters via /proc, perf&lt;/text>
&lt;rect class="bx" x="20" y="144" width="360" height="42" rx="6"/>
&lt;text x="32" y="163" class="tl">Per-process/pod attribution — eBPF + model&lt;/text>
&lt;text x="32" y="179" class="ts">splits the watt between workloads (Kepler)&lt;/text>
&lt;rect class="bx" x="410" y="90" width="350" height="42" rx="6"/>
&lt;text x="422" y="109" class="tl">Physical power meter (reference)&lt;/text>
&lt;text x="422" y="125" class="ts">the ground truth everything is calibrated against&lt;/text>
&lt;text x="410" y="165" class="ts">The higher the layer, the more context (carbon) and&lt;/text>
&lt;text x="410" y="181" class="ts">the less direct accuracy; the meter is the standard.&lt;/text>
&lt;text x="20" y="216" class="ts">The GPU dominates in LLM inference; RAPL covers CPU/DRAM; eBPF splits per pod; the meter calibrates.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>The GPU is the dominant source in LLM inference, and its power is read from a hardware
counter (NVML/nvidia-smi, aggregated by DCGM, the same basis as
&lt;a href="https://blog.lo0.es/en/posts/gpu-observability-llm-inference-twelve-dcgm-vllm-metrics/">GPU observability&lt;/a>). RAPL gives CPU and
DRAM. The eBPF + model layer (Kepler) splits the total watt between containers and pods
without instrumenting the application. And the physical power meter is the ground truth
against which estimates are calibrated: no software estimate is better than the meter, only
more convenient.&lt;/p>
&lt;hr>
&lt;h2 id="how-it-is-instrumented-and-where-the-error-creeps-in">How it is instrumented (and where the error creeps in)&lt;/h2>
&lt;p>Four instrumentation decisions explain most of the discrepancies between energy
measurements:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Sampling rate.&lt;/strong> &lt;code>nvidia-smi&lt;/code>/DCGM read power at intervals; sampling that is too coarse
misses the peaks and underestimates the energy. It must be fine enough to capture the
power variation between prefill (high) and decode (lower).&lt;/li>
&lt;li>&lt;strong>Board vs node.&lt;/strong> GPU (board) power does not include CPU, NICs, fans or PSU losses
(typically an extra 10–20 %). Comparing a board energy figure with a complete-node one is
comparing different things.&lt;/li>
&lt;li>&lt;strong>Idle baseline.&lt;/strong> A powered GPU with no work already draws power. Is that idle attributed
to the workload or discounted? The decision changes energy per token, and idle matters: it
is real energy that someone pays for.&lt;/li>
&lt;li>&lt;strong>Time window.&lt;/strong> Energy is the integral of power over time; the measurement window has
to line up exactly with the workload (without counting warm-up or shutdown), or the number
does not correspond to the work measured.&lt;/li>
&lt;/ul>
&lt;p>These decisions, as in performance benchmarking, mean that &lt;strong>the measurement method matters
as much as the system measured&lt;/strong>. A J/token without a stated sampling rate, board/node
boundary and idle treatment is not comparable.&lt;/p>
&lt;hr>
&lt;h2 id="frameworks-tool-by-tool">Frameworks, tool by tool&lt;/h2>
&lt;h3 id="zeus-mlenergy-university-of-michigan">Zeus (ml.energy, University of Michigan)&lt;/h3>
&lt;p>What it does: measure and optimise the energy of deep learning workloads. Method: NVML
counters. Scope: NVIDIA and AMD GPUs, CPU, DRAM, Apple Silicon and NVIDIA Jetson. Licence:
OSS; academic backing (NSDI'23 paper). Differentiator: it does not only measure, it also
optimises (power capping, frequency selection) to cut energy without significant loss of
performance (&lt;a href="https://ml.energy/zeus/">Zeus Project&lt;/a>, &lt;a href="https://www.usenix.org/system/files/nsdi23-you.pdf">NSDI'23&lt;/a>).
It is the reference tool when the goal is to lower J/token, not just to measure them.&lt;/p>
&lt;h3 id="codecarbon">CodeCarbon&lt;/h3>
&lt;p>What it does: estimates the energy and the CO₂eq of compute processes. Method: reads the
GPU with &lt;code>nvidia-smi&lt;/code> and estimates CPU/RAM. Scope: CPU + GPU + RAM. Licence: OSS (Python).
Differentiator: it integrates into ML flows and CI pipelines, and it is the one that &lt;strong>comes
closest to the power meter&lt;/strong> among the Python tools (&lt;a href="https://medium.com/@prhmma/best-green-code-tools-july-2025-mainly-python-7ab415af0cd6">comparison&lt;/a>).
It brings carbon context out of the box. Limit: a high-level estimate, less exact than direct
hardware measurement.&lt;/p>
&lt;h3 id="carbontracker">CarbonTracker&lt;/h3>
&lt;p>What it does: tracks energy and carbon at GPU run time. Scope: GPU only, it measures
neither CPU nor memory. Licence: OSS. Differentiator: lightweight, easy to add to a
training/inference script. Limit: partial coverage (no CPU/DRAM), so it undercounts the total
system energy.&lt;/p>
&lt;h3 id="scaphandre">Scaphandre&lt;/h3>
&lt;p>What it does: a power metrology agent written in Rust. Method: RAPL (reads &lt;code>/proc&lt;/code>,
splits joules by CPU ticks). Scope: process or VM, with the &lt;strong>raw accuracy of the hardware
layer&lt;/strong>. Licence: OSS. Differentiator: the highest direct accuracy among the general-purpose
tools, at the cost of bringing no carbon context (it is pure metrology)
(&lt;a href="https://github.com/hubblo-org/scaphandre">Scaphandre · GitHub&lt;/a>). Limit: focused on CPU/RAPL;
for GPU it has to be combined with NVML.&lt;/p>
&lt;h3 id="kepler-cncf">Kepler (CNCF)&lt;/h3>
&lt;p>What it does: a Prometheus exporter that measures energy at container, pod and node level
in Kubernetes. Method: eBPF + ML models to estimate consumption per workload. Language:
Go + C. Licence: Apache 2.0 (the &lt;code>sustainable-computing-io&lt;/code> project) (&lt;a href="https://github.com/sustainable-computing-io/kepler">Kepler · GitHub&lt;/a>).
Differentiator: it is the cloud-native option for attributing energy per pod without
instrumenting the app, just as OpenCost attributes cost. Limit: attribution via eBPF + model
is estimation, not direct measurement; its accuracy depends on the model.&lt;/p>
&lt;h3 id="mlperf-power-mlcommons">MLPerf Power (MLCommons)&lt;/h3>
&lt;p>What it does: a standardised benchmark of energy efficiency, from µW to MW.
Maintainer: MLCommons. Differentiator: cross-vendor comparability of efficiency, with a
dataset spanning several years and workload versions (&lt;a href="https://arxiv.org/html/2410.12032v2">MLPerf Power, arXiv 2410.12032&lt;/a>).
It is to energy what MLPerf Inference is to performance: the comparison standard between
vendors.&lt;/p>
&lt;h3 id="comparison-table">Comparison table&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tool&lt;/th>
&lt;th>Method&lt;/th>
&lt;th>Scope&lt;/th>
&lt;th>Licence&lt;/th>
&lt;th>Accuracy / note&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Zeus&lt;/strong>&lt;/td>
&lt;td>NVML / counters&lt;/td>
&lt;td>NV+AMD GPU, CPU, DRAM, Apple, Jetson&lt;/td>
&lt;td>OSS&lt;/td>
&lt;td>measures &lt;strong>and optimises&lt;/strong> DL energy&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>CodeCarbon&lt;/strong>&lt;/td>
&lt;td>nvidia-smi + estimation&lt;/td>
&lt;td>CPU+GPU+RAM, CO₂eq&lt;/td>
&lt;td>OSS (Python)&lt;/td>
&lt;td>the &lt;strong>closest to the power meter&lt;/strong> among Python tools&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>CarbonTracker&lt;/strong>&lt;/td>
&lt;td>GPU runtime&lt;/td>
&lt;td>&lt;strong>GPU only&lt;/strong>&lt;/td>
&lt;td>OSS&lt;/td>
&lt;td>lightweight; no CPU/mem&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Scaphandre&lt;/strong>&lt;/td>
&lt;td>RAPL (/proc)&lt;/td>
&lt;td>process/VM&lt;/td>
&lt;td>OSS (Rust)&lt;/td>
&lt;td>raw accuracy; no carbon context&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Kepler&lt;/strong>&lt;/td>
&lt;td>eBPF + model&lt;/td>
&lt;td>container/pod/node (K8s)&lt;/td>
&lt;td>Apache 2.0 (CNCF)&lt;/td>
&lt;td>cloud-native; model-based estimation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>MLPerf Power&lt;/strong>&lt;/td>
&lt;td>standardised measurement&lt;/td>
&lt;td>µW to MW&lt;/td>
&lt;td>MLCommons&lt;/td>
&lt;td>cross-vendor comparability&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="accuracy-who-to-believe">Accuracy: who to believe&lt;/h2>
&lt;p>The difference between tools is not a nuance: Scaphandre offers the raw accuracy of the
hardware layer (RAPL), while the Python ones such as CodeCarbon give higher-level,
carbon-aware estimates, with more context but less direct exactness; among the Python tools,
CodeCarbon is the one that comes closest to the power meter, followed by CarbonTracker, with
variability across infrastructures (&lt;a href="https://medium.com/@prhmma/best-green-code-tools-july-2025-mainly-python-7ab415af0cd6">comparison&lt;/a>).
The rule: for sizing and design, a software estimate will do; to &lt;strong>defend a figure before
a committee or an auditor, calibrate against a power meter&lt;/strong> at least once, and use the
software tool as a continuous proxy. The measured figure beats the estimated one; the rest is
convenience.&lt;/p>
&lt;hr>
&lt;h2 id="energy-leaderboards-and-benchmarks">Energy leaderboards and benchmarks&lt;/h2>
&lt;p>To compare efficiency between models without building your own test bench:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Resource&lt;/th>
&lt;th>What it provides&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>MLPerf Power&lt;/strong>&lt;/td>
&lt;td>standardised efficiency measurement, from µW to MW&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>HF AI Energy Score&lt;/strong>&lt;/td>
&lt;td>comparable per-model energy efficiency ratings (&lt;a href="https://huggingface.github.io/AIEnergyScore/">HF&lt;/a>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ML.ENERGY Benchmark&lt;/strong>&lt;/td>
&lt;td>automated measurement and optimisation of inference energy&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>awesome-green-ai&lt;/strong>&lt;/td>
&lt;td>curated index of Green AI resources and tools (&lt;a href="https://github.com/samuelrince/awesome-green-ai">repo&lt;/a>)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>These resources give the order of magnitude of the energy per token of each model, useful for
choosing a model on efficiency at the design stage. But they do not replace measurement
on your hardware and your workload: a leaderboard measures on one specific bench, not on your
node.&lt;/p>
&lt;hr>
&lt;h2 id="from-watt-to-carbon-france-germany-spain">From watt to carbon: France, Germany, Spain&lt;/h2>
&lt;p>Here the energy axis turns into a sovereignty argument. Carbon per token comes from
multiplying the energy by the country&amp;rsquo;s grid intensity, which in Europe varies by almost
two orders of magnitude:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Country&lt;/th>
&lt;th>Wholesale (€/MWh, Mar 2026)&lt;/th>
&lt;th>Grid carbon (gCO₂/kWh)&lt;/th>
&lt;th>Profile&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>France&lt;/strong>&lt;/td>
&lt;td>~58&lt;/td>
&lt;td>&lt;strong>~20–60&lt;/strong>&lt;/td>
&lt;td>nuclear: cheap and very clean&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Spain&lt;/strong>&lt;/td>
&lt;td>~54&lt;/td>
&lt;td>&lt;strong>~150–170&lt;/strong>&lt;/td>
&lt;td>renewables + gas: cheap, medium carbon&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Germany&lt;/strong>&lt;/td>
&lt;td>~91&lt;/td>
&lt;td>&lt;strong>~363&lt;/strong> (2024 average)&lt;/td>
&lt;td>coal/gas + renewables: expensive and dirty&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Sources: wholesale prices (&lt;a href="https://tradingeconomics.com/france/electricity-price">TradingEconomics&lt;/a>),
Germany&amp;rsquo;s carbon ~363 gCO₂/kWh (2024 average, &lt;a href="https://en.wikipedia.org/wiki/Electricity_sector_in_Germany">Wikipedia&lt;/a>),
nuclear ~17–35 gCO₂e/kWh (&lt;a href="https://www.eea.europa.eu/en/analysis/indicators/greenhouse-gas-emission-intensity-of-1">EEA&lt;/a>),
Spain ~167 gCO₂/kWh (2020). Hourly intensity comes from ElectricityMaps.&lt;/p>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 230" role="img" aria-label="From watt to carbon by European country: the same energy per token multiplied by the grid intensity of France, Spain or Germany gives very different carbon per token" xmlns="http://www.w3.org/2000/svg">
&lt;style>.bx{fill:none;stroke:currentColor;stroke-width:1.3}.tl{font:600 12px sans-serif;fill:currentColor}.ts{font:11px sans-serif;fill:currentColor}.ar{fill:none;stroke:currentColor;stroke-width:1.3;marker-end:url(#em)}&lt;/style>
&lt;defs>&lt;marker id="em" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="currentColor"/>&lt;/marker>&lt;/defs>
&lt;rect class="bx" x="20" y="90" width="190" height="50" rx="6"/>
&lt;text x="32" y="111" class="tl">0.78 kWh / 1M tokens&lt;/text>
&lt;text x="32" y="128" class="ts">(energy with PUE)&lt;/text>
&lt;path class="ar" d="M210,100 L300,55"/>
&lt;path class="ar" d="M210,115 L300,115"/>
&lt;path class="ar" d="M210,130 L300,175"/>
&lt;rect class="bx" x="300" y="36" width="200" height="40" rx="6"/>
&lt;text x="312" y="56" class="tl">France (~40 gCO₂/kWh)&lt;/text>
&lt;text x="312" y="70" class="ts">→ ~31 gCO₂ / 1M tokens&lt;/text>
&lt;rect class="bx" x="300" y="95" width="200" height="40" rx="6"/>
&lt;text x="312" y="115" class="tl">Spain (~160 gCO₂/kWh)&lt;/text>
&lt;text x="312" y="129" class="ts">→ ~125 gCO₂ / 1M tokens&lt;/text>
&lt;rect class="bx" x="300" y="154" width="200" height="40" rx="6"/>
&lt;text x="312" y="174" class="tl">Germany (~363 gCO₂/kWh)&lt;/text>
&lt;text x="312" y="188" class="ts">→ ~283 gCO₂ / 1M tokens&lt;/text>
&lt;text x="540" y="110" class="ts">Same load, same iron:&lt;/text>
&lt;text x="540" y="128" class="ts">~9× more carbon in Germany&lt;/text>
&lt;text x="540" y="146" class="ts">than in France, just from the grid.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>The calculation, on the example node (0.78 kWh per million tokens, with PUE): in France
(~40 gCO₂/kWh) it is ~31 gCO₂ per million tokens; in Germany (~363 gCO₂/kWh), &lt;strong>~283
gCO₂, a factor of ~9×, without touching a line of the stack. Placing the cluster in
France or Spain is at once a cost lever, a carbon lever and a compliance lever&lt;/strong> (&lt;a href="https://blog.lo0.es/en/posts/eu-ai-act-technical-dossier-on-premise-llm-architecture/">EU AI Act&lt;/a>,
&lt;a href="https://blog.lo0.es/en/posts/technical-controls-ens-iso-42001-eu-ai-act-cross-mapping/">controls ENS × 42001 × EU AI Act&lt;/a>).&lt;/p>
&lt;hr>
&lt;h2 id="energy-efficiency-levers">Energy efficiency levers&lt;/h2>
&lt;p>Once it is measured, it can be brought down. The levers, ordered by the identity J/token = W ÷
throughput (lower the numerator or raise the denominator):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Lever&lt;/th>
&lt;th>Mechanism&lt;/th>
&lt;th>Effect&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Quantisation (FP8/INT4)&lt;/strong>&lt;/td>
&lt;td>more tokens per GPU-hour, less VRAM/KV&lt;/td>
&lt;td>raises throughput → lowers J/token&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Batching / continuous batching&lt;/strong>&lt;/td>
&lt;td>amortises the fixed power cost&lt;/td>
&lt;td>raises throughput → lowers J/token&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Power capping&lt;/strong> (Zeus)&lt;/td>
&lt;td>limits GPU power&lt;/td>
&lt;td>lowers W with little loss of throughput&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Efficiency-aware scheduling&lt;/strong>&lt;/td>
&lt;td>consolidate workloads, power down idle GPUs&lt;/td>
&lt;td>eliminates idle consumption&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Location (country)&lt;/strong>&lt;/td>
&lt;td>cleaner grid&lt;/td>
&lt;td>lowers carbon per token&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Avoiding over-reasoning&lt;/strong>&lt;/td>
&lt;td>fewer reasoning tokens that add nothing&lt;/td>
&lt;td>less compute → less energy&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Quantisation (see &lt;a href="https://blog.lo0.es/en/posts/quantization-llm-inference-fp8-int4-gguf/">quantisation for inference&lt;/a>)
is the highest-return lever because it moves all three axes at once: it raises throughput,
lowers cost and lowers energy per token. Zeus&amp;rsquo;s power capping is energy-specific: it
trims peak power with little performance loss, lowering the W in the numerator. And idle,
the GPU powered but not working, is pure wasted energy that scheduling recovers.&lt;/p>
&lt;hr>
&lt;h2 id="from-design-to-production-where-energy-is-measured">From design to production: where energy is measured&lt;/h2>
&lt;p>As with the other axes, energy is measured at three moments, with different tools and
increasing accuracy:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Moment&lt;/th>
&lt;th>Tool&lt;/th>
&lt;th>What it gives&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Design&lt;/strong>&lt;/td>
&lt;td>TDP × hours (datasheet)&lt;/td>
&lt;td>ceiling estimate for sizing&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Benchmark&lt;/strong>&lt;/td>
&lt;td>Zeus, MLPerf Power, power meter&lt;/td>
&lt;td>energy per token measured on a controlled bench&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Production&lt;/strong>&lt;/td>
&lt;td>Kepler (eBPF), DCGM&lt;/td>
&lt;td>continuous per-pod consumption in the cluster&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The design figure (TDP) serves to size the utility feed and the cooling, but it
overestimates (the GPU is rarely at TDP 100 % of the time). The benchmark figure is the
one used for the proposal&amp;rsquo;s cost and carbon per token, because it is measured and
reproducible. And the production figure (Kepler/DCGM) closes the loop: it checks that real
consumption matches the budget and feeds the footprint report. The three have to be traceable
to each other, which is what the harness in article S4 does.&lt;/p>
&lt;hr>
&lt;h2 id="energy-in-tco-and-european-regulation">Energy in TCO and European regulation&lt;/h2>
&lt;p>The closing of the axis: energy is not only sustainability, it is cost and compliance.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Cost&lt;/strong>: being 30–50 % of TCO, every J/token improvement translates directly into euros. In
the example, moving from Germany (~0.091 €/kWh) to France (~0.058 €/kWh) lowers the
electricity share by ~37 % on top of the carbon.&lt;/li>
&lt;li>&lt;strong>Regulation (CSRD)&lt;/strong>: European companies must report their carbon footprint (scope 2).
A low-carbon grid (France) directly improves that reported figure, and measuring energy per
token stops being optional and becomes a reporting requirement.&lt;/li>
&lt;li>&lt;strong>EU AI Act&lt;/strong>: efficiency and energy consumption form part of the documentation expected of
AI systems, which makes energy measurement part of the technical file.&lt;/li>
&lt;/ul>
&lt;p>One reporting nuance worth knowing: the electricity footprint is scope 2 (indirect
emissions from purchased energy), and it can be accounted for by location (the real
intensity of the country&amp;rsquo;s grid) or by market (according to the guarantees of origin
contracted). Location-based accounting is the one that genuinely rewards putting the cluster
on a clean grid such as the French one; market-based accounting allows green energy to be
&amp;ldquo;bought&amp;rdquo; through certificates. Knowing which one your CSRD report requires changes which lever
(physical location vs contract) lowers the figure, and both start from measuring energy
per token, which is what this axis provides.&lt;/p>
&lt;p>In other words: measuring energy covers at once a first-order cost line, the carbon and
sovereignty argument, and a regulatory obligation. For a sovereign European proposal, the
energy axis is not the &amp;ldquo;nice sustainability bit&amp;rdquo;: it is one of the three columns with a number
attached.&lt;/p>
&lt;hr>
&lt;h2 id="checklist-for-a-reproducible-energy-measurement">Checklist for a reproducible energy measurement&lt;/h2>
&lt;p>For an energy or carbon figure to be defensible before a committee or an auditor, it has to
come with its context. The minimum to fix and publish:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>What to fix&lt;/th>
&lt;th>Why&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Tool + version&lt;/td>
&lt;td>each layer (RAPL, NVML, eBPF) and tool measures differently&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Sampling rate&lt;/td>
&lt;td>coarse sampling misses peaks&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Board vs node boundary&lt;/td>
&lt;td>±10–20 % depending on whether CPU/PSUs are included&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>PUE used&lt;/td>
&lt;td>it multiplies all the compute energy&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Source and time of the grid intensity&lt;/td>
&lt;td>carbon varies ~9× by country and by hour&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Idle treatment&lt;/td>
&lt;td>attributed or discounted changes the J/token&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Model, precision and workload&lt;/td>
&lt;td>energy depends on what is served and how&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Calibration vs power meter&lt;/td>
&lt;td>at least once, to validate the estimate&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The rule: if you cannot hand over this table alongside the gCO₂/token figure, the figure is
not auditable. The reproducible harness of article S4 records all these parameters so that the
energy figure is as traceable as the cost and performance ones, and so that the reported
footprint (CSRD) holds up under audit.&lt;/p>
&lt;hr>
&lt;h2 id="state-of-the-art-2026">State of the art 2026&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>LLM-specific resolution is missing&lt;/strong>: general-purpose tools measure well at machine or
process level, but they lack LLM-specific resolution (energy per token, per prefill/decode
phase), and the simulators lack emissions modelling, an open gap in the field.&lt;/li>
&lt;li>&lt;strong>eBPF as a trend&lt;/strong> (Kepler) for attributing energy per pod without instrumenting the app,
in parallel to how OpenCost attributes cost.&lt;/li>
&lt;li>&lt;strong>Standardisation&lt;/strong> of comparison via MLPerf Power and HF AI Energy Score.&lt;/li>
&lt;li>&lt;strong>Optimisation, not only measurement&lt;/strong> (Zeus): the field is moving from &amp;ldquo;how much do I spend&amp;rdquo;
to &amp;ldquo;how do I spend less without losing performance&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="limits-and-traps-data-driven">Limits and traps (data-driven)&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>Estimation vs measurement.&lt;/strong> An &lt;code>nvidia-smi&lt;/code> figure is not a power meter. Calibrate
against hardware at least once before defending a number.&lt;/li>
&lt;li>&lt;strong>Partial coverage.&lt;/strong> CarbonTracker measures GPU only; Scaphandre, mostly CPU/RAPL. Add the
layers or you undercount the total energy.&lt;/li>
&lt;li>&lt;strong>Forgetting PUE.&lt;/strong> Board energy does not include cooling or losses; without PUE you
underestimate the real consumption and carbon.&lt;/li>
&lt;li>&lt;strong>Carbon without a country.&lt;/strong> A gCO₂/token without a stated grid (and hour) means nothing:
it varies ~9× between France and Germany.&lt;/li>
&lt;li>&lt;strong>Confusing energy with sustainability.&lt;/strong> Here it is cost and compliance, with a number;
treating it as a &amp;ldquo;green&amp;rdquo; extra is losing one of the three columns of the proposal.&lt;/li>
&lt;/ol>
&lt;p>That closes the run of introductions: cost, performance and energy, each with its frameworks
and its methodology. The rest of the series goes tool by tool through to the dashboard that
underpins the sovereign architecture decision, with European figures, measured and
reproducible.&lt;/p>
&lt;h2 id="closing">Closing&lt;/h2>
&lt;p>Energy is the axis easiest to dismiss as &amp;ldquo;the green one&amp;rdquo; and the one that hides the most: it
is almost half the cost, it defines the footprint Europe requires to be reported, and its
carbon per token changes ~9× depending on whether the cluster sits in France or in Germany.
Measuring it properly, with the right layer, the right sampling, PUE included and the
country&amp;rsquo;s grid, turns a soft sustainability argument into a hard column of the proposal, with
a number and a source. And the sovereign conclusion stands on its own with the data in this
article: &lt;strong>an inference platform in France or Spain is at once cheaper, cleaner and compliant
with European jurisdiction than the same platform on a US hyperscaler&lt;/strong>, and that is
demonstrated with measured J/token, gCO₂/kWh by country and euros, not with intentions. The
energy axis does not decorate the proposal: it closes it.&lt;/p>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-energy-leaderboards-wh-per-token/">LLM energy efficiency leaderboards&lt;/a> — the J/token rankings where the numbers these tools measure land: which leaderboard to use, how to read it and what biases it carries.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/watt-to-carbon-pue-grid-intensity-gco2-per-token/">From watt to carbon: PUE, grid intensity and the real cost of a token&lt;/a> — how to convert the J/token measured with Zeus or Kepler into gCO₂eq using the datacenter PUE and the country&amp;rsquo;s electricity grid intensity.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/levers-fewer-watts-per-token-llm-inference/">Energy efficiency levers in LLM inference&lt;/a> — which configuration changes reduce the J/token these tools report: quantization, batching, engine, KV cache precision.&lt;/li>
&lt;/ul>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>Zeus Project (ml.energy, UMich) — &lt;a href="https://ml.energy/zeus/">https://ml.energy/zeus/&lt;/a>&lt;/li>
&lt;li>Zeus · USENIX NSDI'23 — &lt;a href="https://www.usenix.org/system/files/nsdi23-you.pdf">https://www.usenix.org/system/files/nsdi23-you.pdf&lt;/a>&lt;/li>
&lt;li>Kepler (CNCF, eBPF) · GitHub — &lt;a href="https://github.com/sustainable-computing-io/kepler">https://github.com/sustainable-computing-io/kepler&lt;/a>&lt;/li>
&lt;li>Scaphandre · GitHub — &lt;a href="https://github.com/hubblo-org/scaphandre">https://github.com/hubblo-org/scaphandre&lt;/a>&lt;/li>
&lt;li>CarbonTracker · GitHub — &lt;a href="https://github.com/saintslab/carbontracker">https://github.com/saintslab/carbontracker&lt;/a>&lt;/li>
&lt;li>MLPerf Power (arXiv 2410.12032) — &lt;a href="https://arxiv.org/html/2410.12032v2">https://arxiv.org/html/2410.12032v2&lt;/a>&lt;/li>
&lt;li>HF AI Energy Score — &lt;a href="https://huggingface.github.io/AIEnergyScore/">https://huggingface.github.io/AIEnergyScore/&lt;/a>&lt;/li>
&lt;li>awesome-green-ai — &lt;a href="https://github.com/samuelrince/awesome-green-ai">https://github.com/samuelrince/awesome-green-ai&lt;/a>&lt;/li>
&lt;li>TradingEconomics · precio electricidad Francia/Alemania/España — &lt;a href="https://tradingeconomics.com/france/electricity-price">https://tradingeconomics.com/france/electricity-price&lt;/a>&lt;/li>
&lt;li>EEA · intensidad de emisiones de la electricidad en Europa — &lt;a href="https://www.eea.europa.eu/en/analysis/indicators/greenhouse-gas-emission-intensity-of-1">https://www.eea.europa.eu/en/analysis/indicators/greenhouse-gas-emission-intensity-of-1&lt;/a>&lt;/li>
&lt;li>Electricity sector in Germany (carbono ~363 gCO₂/kWh) — &lt;a href="https://en.wikipedia.org/wiki/Electricity_sector_in_Germany">https://en.wikipedia.org/wiki/Electricity_sector_in_Germany&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>