<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Energy on lo0 — Tech Blog</title><link>https://blog.lo0.es/en/tags/energy/</link><description>Recent content in Energy on lo0 — Tech Blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Sat, 29 Aug 2026 08:00:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/en/tags/energy/index.xml" rel="self" type="application/rss+xml"/><item><title>Measuring the power of a GPU: NVML, DCGM and the sampling errors that invalidate your watts</title><link>https://blog.lo0.es/en/posts/measuring-gpu-power-nvml-dcgm-sampling-errors/</link><pubDate>Sat, 29 Aug 2026 08:00:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/measuring-gpu-power-nvml-dcgm-sampling-errors/</guid><description>&lt;blockquote>
&lt;p>Notation: amounts in &lt;strong>euros (N €)&lt;/strong>, decimals with a point. The dollar symbol 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>A GPU power sensor does not return what almost everyone believes. The NVML documentation is explicit: on Ampere except GA100, and on later architectures including &lt;strong>H100&lt;/strong>, &lt;code>nvmlDeviceGetPowerUsage&lt;/code> returns power averaged over a one-second interval, not instantaneous power. The University of Oxford study presented at SC24, covering more than 70 GPUs across 25 models checked against an external 1 mΩ meter, adds the fact that breaks most published measurements: on the A100 and H100 the sensor only samples 25 % of the time (a 25 ms window within a 101 ms period), so during the remaining 75 % the GPU may be consuming something radically different. Integrating power naively over nine real benchmarks, the mean error was 39.27 %; applying good practice brought it down to 4.89 %. The operational consequence is short: if the hardware is Volta or later, use the &lt;strong>accumulated energy counter&lt;/strong> (&lt;code>nvmlDeviceGetTotalEnergyConsumption&lt;/code>, in millijoules) and subtract, rather than integrating samples. And the GPU counter is not the bill: on measured 8× H100 nodes, the node reaches 8.4 kW against 5.6 kW of summed GPU TDP, node idle is 1.8 kW, and with an average PUE of 1.54 the NVML watts are of the order of 43 % of the watts the utility bills.&lt;/p>
&lt;hr>
&lt;h2 id="what-the-hardware-exposes">What the hardware exposes&lt;/h2>
&lt;h3 id="nvml-power">NVML: power&lt;/h3>
&lt;p>&lt;code>nvmlDeviceGetPowerUsage(device, unsigned int* power)&lt;/code> returns &lt;strong>milliwatts&lt;/strong> for the GPU &lt;em>and its associated circuitry, for example the memory&lt;/em>. It has been supported since Fermi. The note in the official documentation is the part almost nobody quotes (&lt;a href="https://docs.nvidia.com/deploy/nvml-api/group__nvmlDeviceQueries.html">NVML Device Queries&lt;/a>):&lt;/p>
&lt;blockquote>
&lt;p>On Fermi and Kepler the reading is accurate to ±5 % of current consumption. &lt;strong>On Ampere (except GA100) or later, the API returns power averaged over a 1 s interval. On GA100 and earlier architectures instantaneous power is returned.&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>In other words, on an H100 or an L40S the usual call already delivers a one-second moving average. Anyone sampling it at 1 Hz and integrating is applying a second filter on top of an already filtered signal, without declaring it. To disambiguate, NVML exposes two separate fields accessible via &lt;code>nvmlDeviceGetFieldValues&lt;/code>: &lt;code>NVML_FI_DEV_POWER_AVERAGE&lt;/code> and &lt;code>NVML_FI_DEV_POWER_INSTANT&lt;/code>, with command-line equivalents (&lt;code>nvidia-smi --query-gpu=power.draw.average&lt;/code> and &lt;code>power.draw.instant&lt;/code>).&lt;/p>
&lt;h3 id="nvml-the-energy-counter">NVML: the energy counter&lt;/h3>
&lt;p>&lt;code>nvmlDeviceGetTotalEnergyConsumption&lt;/code> returns accumulated energy in millijoules since the last driver reload, supported on Volta or later. It is a 64-bit integer, so overflow is not a practical problem: an H100 at 700 W consumes of the order of 6.1·10¹⁰ J per year against a counter range of 1.8·10¹⁶ J. The only event that resets it is a driver reload or a system restart, and that does need watching: a &lt;code>modprobe -r nvidia&lt;/code> halfway through a campaign produces a negative delta.&lt;/p>
&lt;p>NVIDIA does not document the internal time resolution of the counter, its accumulation mechanism or its accuracy, and I have found no peer-reviewed work validating it against an external meter. The recommendation to use it, which the rest of this sheet rests on, is a structural argument (it removes quadrature error and aliasing error), not a published empirical validation.&lt;/p>
&lt;h3 id="nvml-power-limits">NVML: power limits&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Function&lt;/th>
&lt;th>Unit&lt;/th>
&lt;th>Semantics&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>nvmlDeviceGetPowerManagementLimit&lt;/code>&lt;/td>
&lt;td>mW&lt;/td>
&lt;td>Currently configured limit&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>nvmlDeviceGetPowerManagementLimitConstraints&lt;/code>&lt;/td>
&lt;td>mW&lt;/td>
&lt;td>Legal minimum and maximum range&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>nvmlDeviceGetPowerManagementDefaultLimit&lt;/code>&lt;/td>
&lt;td>mW&lt;/td>
&lt;td>Limit the card boots with&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>nvmlDeviceGetEnforcedPowerLimit&lt;/code>&lt;/td>
&lt;td>mW&lt;/td>
&lt;td>Effective limit after considering &lt;strong>all&lt;/strong> limiters, including the out-of-band interface&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>For an auditable measurement you have to record &lt;strong>&lt;code>EnforcedPowerLimit&lt;/code>&lt;/strong>, not &lt;code>PowerManagementLimit&lt;/code>: the BMC may be imposing an out-of-band ceiling that the latter does not reflect, and two apparently identical nodes may be operating at different ceilings.&lt;/p>
&lt;h3 id="dcgm-the-equivalent-fields">DCGM: the equivalent fields&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>ID&lt;/th>
&lt;th>Unit&lt;/th>
&lt;th>Type in the exporter&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_DEV_POWER_USAGE&lt;/code>&lt;/td>
&lt;td>155&lt;/td>
&lt;td>watts in floating point&lt;/td>
&lt;td>gauge&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_DEV_TOTAL_ENERGY_CONSUMPTION&lt;/code>&lt;/td>
&lt;td>156&lt;/td>
&lt;td>accumulated millijoules&lt;/td>
&lt;td>counter&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_DEV_POWER_MGMT_LIMIT&lt;/code>&lt;/td>
&lt;td>160&lt;/td>
&lt;td>mW&lt;/td>
&lt;td>gauge&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_DEV_ENFORCED_POWER_LIMIT&lt;/code>&lt;/td>
&lt;td>164&lt;/td>
&lt;td>mW&lt;/td>
&lt;td>gauge&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Both energy fields are active in the default counter file of &lt;code>dcgm-exporter&lt;/code>. The audit conclusion is direct: a standard Prometheus panel integrating &lt;code>DCGM_FI_DEV_POWER_USAGE&lt;/code> is integrating a gauge that is already a one-second average of the sensor, sampled at the exporter&amp;rsquo;s &lt;code>collect-interval&lt;/code>. For energy per token the correct metric is counter 156 with &lt;code>increase()&lt;/code>.&lt;/p>
&lt;h2 id="the-real-accuracy-of-the-sensor">The real accuracy of the sensor&lt;/h2>
&lt;p>The reference is the work of Yang, Adámek and Armour (University of Oxford), published at SC24 and available as &lt;a href="https://arxiv.org/html/2312.02741v3">arXiv:2312.02741&lt;/a>: more than 70 GPUs across 25 models, including 10 H100s and 10 A100s, checked against an external meter with a 1 mΩ shunt, a 12-bit ADC and internal sampling at 34 kHz.&lt;/p>
&lt;h3 id="update-period-and-averaging-window">Update period and averaging window&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>GPU or architecture&lt;/th>
&lt;th>Update period&lt;/th>
&lt;th>Averaging window&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Kepler and Maxwell&lt;/td>
&lt;td>10-50 Hz&lt;/td>
&lt;td>logarithmic growth, ~200 ms&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Volta (V100)&lt;/td>
&lt;td>20 ms&lt;/td>
&lt;td>10 ms&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Turing&lt;/td>
&lt;td>100 ms&lt;/td>
&lt;td>100 ms&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>A100 (GA100)&lt;/strong>&lt;/td>
&lt;td>&lt;strong>101 ms&lt;/strong>&lt;/td>
&lt;td>&lt;strong>25 ms&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Non-GA100 Ampere and Ada, driver earlier than March 2023&lt;/td>
&lt;td>100 ms&lt;/td>
&lt;td>1 s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Non-GA100 Ampere and Ada, driver 530&lt;/td>
&lt;td>100 ms&lt;/td>
&lt;td>100 ms&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>H100&lt;/strong>&lt;/td>
&lt;td>&lt;strong>100 ms&lt;/strong>&lt;/td>
&lt;td>&lt;strong>25 ms&lt;/strong> with &lt;code>.instant&lt;/code>; &lt;strong>1 s&lt;/strong> with &lt;code>.average&lt;/code> and with the default field&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GH200&lt;/td>
&lt;td>100 ms&lt;/td>
&lt;td>20 ms on the GPU, 10 ms on the Grace CPU&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Two readings of this table. The first: the driver is an experimental variable, not an infrastructure detail; the averaging window changed between drivers earlier than 530, driver 530, and the later ones. Any measurement meant to be compared over time has to record the driver version.&lt;/p>
&lt;p>The second is the central finding of the paper. On the A100 and H100 the 25 ms window sits inside a 101 ms period, which gives a sensor duty cycle close to 25 %. The sensor does not average the full interval: it averages a quarter of it and the system presents the result as if it described the whole interval. In the words of the work itself, during the other 75 % of the time the GPU may be consuming radically different power and &lt;code>nvidia-smi&lt;/code> never notices.&lt;/p>
&lt;h3 id="the-steady-state-error">The steady-state error&lt;/h3>
&lt;p>The paper also quantifies the claim in the &lt;code>nvidia-smi&lt;/code> documentation, which spoke of an accuracy of ±5 watts: the real error is proportional, ±5 %, not absolute. On a GPU capable of consuming 700 W that is &lt;strong>±35 W&lt;/strong> of over- or underestimation. The errors measured against the external meter, after correcting the time offset, were −4.70 % and −4.53 % on the RTX 3090 and −5.43 % on the A100, and the residue is attributed to the tolerance of the card&amp;rsquo;s own physical shunt, which no software can correct.&lt;/p>
&lt;h3 id="the-response-to-transients">The response to transients&lt;/h3>
&lt;p>Four distinct behaviours were observed in the 10 % to 90 % rise time: an almost instantaneous real rise with the reading following on the next tick and a delay of 0 to 100 ms; a real rise of several hundred milliseconds with the reading still updating on the next tick; linear growth over a second, which corresponds to &lt;code>power.draw.average&lt;/code>; and logarithmic growth over 200 ms, only on Kepler and Maxwell. Out of this comes the most uncomfortable warning in the work: when running a short program, the measured power probably corresponds to the activity before the program.&lt;/p>
&lt;h2 id="the-two-ways-of-obtaining-energy">The two ways of obtaining energy&lt;/h2>
&lt;p>The first is to integrate samples, which is what any &lt;em>poller&lt;/em> does:&lt;/p>
$$E \approx \sum_i P(t_i) \cdot \Delta t$$
&lt;p>It accumulates five sources of error: the ±5 % of the sensor, quadrature error from the finite step, aliasing if the load has spectral content above half the sampling frequency, the fact that each sample is already a moving average, and the jitter of 0 to 100 ms between the host clock and the sensor tick.&lt;/p>
&lt;p>The second is to subtract the counter:&lt;/p>
$$E = \text{counter}(t_1) - \text{counter}(t_0)$$
&lt;p>Two calls and a subtraction. It removes quadrature, aliasing and time misalignment; the ±5 % of the sensor remains.&lt;/p>
&lt;h3 id="why-1-hz-destroys-a-200-ms-inference">Why 1 Hz destroys a 200 ms inference&lt;/h3>
&lt;p>With sampling at 1 Hz, the sampling theorem only allows components below 0.5 Hz to be reconstructed, while a 200 ms pulse has content in the region of 5 Hz. The expected number of samples inside the event is 0.2, so with probability 0.8 none falls inside it: the result is not noisy, it is undefined.&lt;/p>
&lt;p>Even sampling at the maximum useful rate, which on the A100 and H100 is about 10 Hz given the 101 ms period, a 200 ms inference produces one or two distinct sensor updates, and each has observed only 25 ms of real activity: effective coverage is around 25 % of the event. And because of the fourth transient behaviour in the previous section, the reading obtained during those 200 ms may describe what was happening before the kernel was launched.&lt;/p>
&lt;h3 id="aliasing-with-periodic-loads">Aliasing with periodic loads&lt;/h3>
&lt;p>The paper observes the phenomenon directly on the A100: with a square wave of period slightly different from 100 ms, the reading fluctuates between high and low values with a clear beat. An inference server with periodic arrivals, health checks, fixed-size batches or a scheduler tick is exactly that pathological case.&lt;/p>
&lt;p>When only instantaneous power is available, the measured good practice from the Oxford work consists of running 32 consecutive iterations or a minimum of 5 s, inserting &lt;strong>8 evenly spaced controlled delays&lt;/strong> if the window is smaller than the period, repeating over 4 separate trials with a random delay between them, and shifting the series in post-processing to synchronise it with the real activity. Over nine real benchmarks that took the mean error from 39.27 % to 4.89 %.&lt;/p>
&lt;h2 id="what-the-gpu-counter-does-not-measure">What the GPU counter does not measure&lt;/h2>
&lt;p>The scope declared by NVML is the GPU and its associated circuitry: the SXM module or the PCIe card, with its HBM and its regulators. Left out are the CPU, host DRAM, NVSwitch, network cards, storage, fans and power supply losses.&lt;/p>
&lt;p>The measured node figures come from the empirical calibration work on 8× H100 SXM5 nodes (&lt;a href="https://arxiv.org/pdf/2506.14551">arXiv:2506.14551&lt;/a>):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Quantity&lt;/th>
&lt;th>Value&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Nominal node TDP declared by the manufacturer&lt;/td>
&lt;td>10.2 kW&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Node power at idle&lt;/td>
&lt;td>1.8 kW&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Maximum measured under saturating load&lt;/td>
&lt;td>8.4 kW&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Peak on real production loads&lt;/td>
&lt;td>never above 76 % of TDP&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Two conversion factors come out of that, both &lt;strong>my own estimates&lt;/strong> from those figures: 8 × 700 W is 5.6 kW of GPU against 8.4 kW of node, that is, the GPU is of the order of 67 % of node power and the GPU-to-node factor is around 1.50×. Chaining that with an industry average PUE of 1.54 (Uptime Institute, 2025), the total factor from the NVML counter to the utility feed is around 2.3×; with a PUE of 1.1 it drops to 1.65×. Put in the form that matters to whoever signs the bill: the watts NVML reports are roughly 43 % of the watts the utility bills in an average datacenter.&lt;/p>
&lt;p>As a complementary reference, an 80 PLUS Titanium supply at 230 V is 96 % efficient at 50 % load and 91 % at 100 %, so supply losses add between 4 % and 9 % that is already included if you measure at the socket.&lt;/p>
&lt;h2 id="the-tax-of-keeping-a-context-open">The tax of keeping a context open&lt;/h2>
&lt;p>A GPU serving a loaded model with no traffic does not consume its nominal idle. Measurements over 335,267 production samples from 14 H100s across 18 days, plus controlled experiments, give this table:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>GPU&lt;/th>
&lt;th>Idle without a CUDA context&lt;/th>
&lt;th>Idle with a CUDA context&lt;/th>
&lt;th>Extra cost&lt;/th>
&lt;th>Percentage of TDP&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>H100&lt;/td>
&lt;td>71.8 W&lt;/td>
&lt;td>121.7 W&lt;/td>
&lt;td>+49.9 W&lt;/td>
&lt;td>7.1 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A100&lt;/td>
&lt;td>53.7 W&lt;/td>
&lt;td>80.0 W&lt;/td>
&lt;td>+26.3 W&lt;/td>
&lt;td>8.8 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>L40S&lt;/td>
&lt;td>35.6 W&lt;/td>
&lt;td>102.1 W&lt;/td>
&lt;td>+66.4 W&lt;/td>
&lt;td>19.0 %&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The result that changes the mental model: more than 98 % of that extra cost is produced by the open CUDA context, independently of the memory occupied. Varying allocated VRAM between 0 and 72 GB moves power by less than 1 W. The size of the loaded model does not cost watts; keeping the context open does.&lt;/p>
&lt;p>That cost is not marginal on a real platform. Over 11,791 long-running jobs, the measured split was 24 % of the time and 7 % of the energy in deep idle, 15 % of the time and 10 % of the energy idle with an active context, and 61 % of the time with 83 % of the energy in execution. On &lt;em>serving&lt;/em> loads, GPUs can spend 48 % of their energy in low-activity periods.&lt;/p>
&lt;h2 id="cpu-and-dram-rapl">CPU and DRAM: RAPL&lt;/h2>
&lt;p>To close the node you have to measure what is not GPU, and there the interface is RAPL through the kernel &lt;code>powercap&lt;/code> framework, at &lt;code>/sys/devices/virtual/powercap/intel-rapl/&lt;/code>. The hierarchy exposes &lt;code>intel-rapl:N&lt;/code> as the socket and &lt;code>intel-rapl:N:M&lt;/code> as subzones (core, uncore, dram), plus the &lt;code>psys&lt;/code> domain for the full SoC since Skylake.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>File&lt;/th>
&lt;th>Content&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>energy_uj&lt;/code>&lt;/td>
&lt;td>Energy counter in microjoules; writing &amp;ldquo;0&amp;rdquo; resets it if the counter supports it&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>max_energy_range_uj&lt;/code>&lt;/td>
&lt;td>Counter range, that is, the overflow point&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>power_uw&lt;/code>&lt;/td>
&lt;td>Current power in microwatts&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>name&lt;/code>&lt;/td>
&lt;td>Zone name&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The figures that condition its use come from the characterisation published in ACM TOMPECS: an update roughly every 1 ms, with jitter; an energy quantum of 61 µJ on Haswell and Skylake, 15.3 µJ on Sandy Bridge; and counter overflow in &lt;strong>52 minutes&lt;/strong> on a Haswell at 84 W, which forces polling at a far shorter period and detecting the wrap with &lt;code>max_energy_range_uj&lt;/code>. There is also a &lt;strong>thermal drift&lt;/strong> that is rarely declared: package power for the same load grows between 10 % and 12 % between 37 °C and 74 °C on Haswell. Warming up beforehand is not optional.&lt;/p>
&lt;p>Access, on the other hand, is no longer free. The &lt;strong>PLATYPUS&lt;/strong> attack (IEEE S&amp;amp;P 2021) demonstrated a purely software power side channel through RAPL, with CVE-2020-8694 and CVE-2020-8695 attached. The Linux mitigation arrived in commit &lt;code>949dd0104c49&lt;/code>, included in 5.10.0-rc4, which changed the default permissions so that only root can read &lt;code>energy_uj&lt;/code>. The microcode mitigation associated with SGX goes further and introduces random noise into the reported energy and changes the reporting frequency: on machines with that mitigation active, RAPL readings are deliberately degraded. Measuring CPU and DRAM from a container therefore requires root, a &lt;code>udev&lt;/code> rule relaxing the permissions, or a privileged daemon.&lt;/p>
&lt;h2 id="the-software-stack">The software stack&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tool&lt;/th>
&lt;th>Source of the GPU figure&lt;/th>
&lt;th>Counter or power&lt;/th>
&lt;th>Default interval&lt;/th>
&lt;th>Overhead&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Zeus&lt;/td>
&lt;td>NVML&lt;/td>
&lt;td>Counter if the architecture is Volta or later; polling otherwise&lt;/td>
&lt;td>Delimited by windows&lt;/td>
&lt;td>Less than 10 ms per call&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>dcgm-exporter&lt;/td>
&lt;td>NVML via DCGM&lt;/td>
&lt;td>Both fields available&lt;/td>
&lt;td>&lt;code>collect-interval&lt;/code> = 30,000 ms&lt;/td>
&lt;td>5-10 W extra on the server&amp;rsquo;s IPMI reading&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CodeCarbon&lt;/td>
&lt;td>NVML&lt;/td>
&lt;td>Counter&lt;/td>
&lt;td>&lt;code>measure_power_secs&lt;/code> = 15 s&lt;/td>
&lt;td>5.38 % to 46.75 % of time at 1 kHz&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Scaphandre&lt;/td>
&lt;td>No GPU support; RAPL&lt;/td>
&lt;td>&lt;code>energy_uj&lt;/code> counter&lt;/td>
&lt;td>Not documented&lt;/td>
&lt;td>3.81 % to 28.38 % at 1 kHz&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Kepler&lt;/td>
&lt;td>RAPL and IPMI; GPU only as an experimental option&lt;/td>
&lt;td>Hardware counters&lt;/td>
&lt;td>—&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Four details that change the choice:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Zeus&lt;/strong> decides in code with &lt;code>nvmlDeviceGetArchitecture&lt;/code> and uses the accumulated counter on Volta or later, with a nestable window API (&lt;code>begin_window&lt;/code> / &lt;code>end_window&lt;/code>). It is the reference implementation of what this sheet recommends. Its NSDI'23 paper also documents energy reductions of 23.8 % to 75.7 % from choosing batch size and power limit well, and of 3.0 % to 31.5 % from touching only the limit, with five seconds of profiling per point enough for stable results.&lt;/li>
&lt;li>&lt;strong>Kepler&lt;/strong> has removed eBPF. The CNCF announcement of June 2026 describes the redesign towards reading &lt;code>/proc&lt;/code> and &lt;code>/sys&lt;/code>, motivated by the &lt;code>CAP_BPF&lt;/code> and &lt;code>CAP_SYSADMIN&lt;/code> permissions that blocked deployments, and by the loss of short-lived processes that underestimated the footprint. The new node metric closely follows the IPMI pattern and removes the spurious multi-kilowatt spikes of the previous version. For GPUs it remains &lt;strong>an experimental option&lt;/strong>: today it is not the tool for measuring Wh/token on an accelerator.&lt;/li>
&lt;li>&lt;strong>CodeCarbon&lt;/strong> uses the NVML counter, which is correct, but its RAM estimate is a heuristic of 5 W per module derived from the total gigabytes, and the code itself acknowledges it.&lt;/li>
&lt;li>&lt;strong>DCGM&lt;/strong> delivers profiling metrics at 1 Hz by default, and warns that collecting at higher frequencies returns zeros because it groups metrics internally.&lt;/li>
&lt;/ul>
&lt;p>On the cost of measuring, the empirical overhead study of RAPL-based tools, all forced to 1 kHz, leaves a clear ordering:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tool&lt;/th>
&lt;th>Time overhead&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>CodeCarbon&lt;/td>
&lt;td>5.38 % to 46.75 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Scaphandre&lt;/td>
&lt;td>3.81 % to 28.38 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Turbostat&lt;/td>
&lt;td>2.73 % to 14.37 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>PowerJoular&lt;/td>
&lt;td>1.67 % to 8.88 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>perf&lt;/td>
&lt;td>−1.00 % to 4.26 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RAPL read in user space&lt;/td>
&lt;td>−0.70 % to 2.93 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RAPL read in kernel space&lt;/td>
&lt;td>−0.17 % to 0.99 %&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The underlying difference is that a system call costs of the order of 1.36·10⁻³ ms and an &lt;code>rdmsr&lt;/code> instruction between 2.3·10⁻⁴ and 5.6·10⁻⁴ ms, an order of magnitude less. The authors recommend matching the granularity to the phenomenon being measured instead of raising the default frequency, and limiting polling to the necessary domains.&lt;/p>
&lt;h2 id="procedure-for-making-a-whtoken-auditable">Procedure for making a Wh/token auditable&lt;/h2>
&lt;ol>
&lt;li>Fix and record the electrical state. Note &lt;code>EnforcedPowerLimit&lt;/code>, the default limit and the driver version; lock clocks or the power ceiling if the experiment requires it.&lt;/li>
&lt;li>&lt;strong>Warm up to a stable temperature.&lt;/strong> RAPL thermal drift is 10 % to 12 % between 37 °C and 74 °C, and the &lt;code>power.draw.average&lt;/code> transient takes up to a second to settle.&lt;/li>
&lt;li>Measure the idle baseline twice: without a CUDA context and with the model loaded. They are two different values and both are needed.&lt;/li>
&lt;li>Use windows of at least 5 s or 32 consecutive iterations.&lt;/li>
&lt;li>Repeat over 4 separate trials with a random delay, and add 8 evenly spaced delays if you are integrating instantaneous power with a window smaller than the period.&lt;/li>
&lt;li>&lt;strong>Prefer the accumulated counter&lt;/strong> whenever the architecture is Volta or later, watching for driver reloads.&lt;/li>
&lt;li>&lt;strong>Report dispersion.&lt;/strong> The Oxford paper itself publishes the mean and standard deviation of the error; without an interval, a Wh/token figure is not auditable.&lt;/li>
&lt;li>Declare the measurement boundary: GPU, node or utility feed. Without that label, two figures from the same facility differ by a factor of 2.3 with nobody knowing why.&lt;/li>
&lt;/ol>
&lt;h3 id="subtracting-idle-or-not">Subtracting idle, or not&lt;/h3>
&lt;p>There is no consensus, and the honest approach is to treat it as a declared decision. In production the GPU is parked with the model loaded, and that consumption shows up on the bill: subtracting it erases a real cost. To compare the marginal efficiency of two models or two kernels, by contrast, subtracting it isolates the variable. The workable way out is to report &lt;strong>both figures with labels&lt;/strong>: &lt;code>gross Wh/token&lt;/code>, which includes idle and corresponds to the bill, and &lt;code>marginal Wh/token&lt;/code>, comparable between models. What does not work is mixing them in the same table without distinguishing them.&lt;/p>
&lt;p>One estimation trap remains alive in many spreadsheets: multiplying &lt;strong>TDP by time&lt;/strong> overestimates real energy &lt;strong>by up to 4.1 times&lt;/strong>, according to the ML.ENERGY Benchmark.&lt;/p>
&lt;h2 id="power-capping-what-it-costs-and-what-it-saves">Power capping: what it costs and what it saves&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Configuration&lt;/th>
&lt;th>Energy saving&lt;/th>
&lt;th>Performance loss&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>V100 at 200 W against 300 W (67 % of TDP), BERT training&lt;/td>
&lt;td>~15 %&lt;/td>
&lt;td>barely any degradation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>V100 at 200 W, set of workloads&lt;/td>
&lt;td>10-20 %&lt;/td>
&lt;td>less than 5 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>V100 at 100 W (33 % of TDP)&lt;/td>
&lt;td>40-60 %&lt;/td>
&lt;td>30-40 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>A100 at 175 W against 400 W (44 % of TDP), LLaMA 65B inference&lt;/strong>&lt;/td>
&lt;td>&lt;strong>22-24 %&lt;/strong>&lt;/td>
&lt;td>&lt;strong>5-8 %&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The asymmetry between phases explains the result. The Microsoft measurement at ASPLOS'24 documents that the &lt;em>prompt&lt;/em> phase is short and reaches or exceeds TDP, while the token generation phase is longer and consumes less: the power ceiling penalises TTFT far more than TPOT. In their production cluster, inference uses 79 % of peak power against 97 % for training, and their measurements show that up to 20 % of power can be recovered with less than a 7 % performance loss.&lt;/p>
&lt;p>The published sweep from 200 W to 700 W on the H100 and H200 adds the nuance of where the knee is: between 500 W and 700 W each 100 W step only contributes around 10 % of performance on compute-bound loads, while the H100 holds peak memory bandwidth even at 200 W. The most stable operating zones identified are 400 W on the H100 and 500 W on the H200. That the memory subsystem is protected against the trim is the physical reason why the decode phase of an LLM, which is memory-bound, loses so little performance under a power ceiling.&lt;/p>
&lt;p>Two warnings about those figures: the H100/H200 sweep was measured with &lt;code>nvidia-smi&lt;/code> polling every 10 s, exactly the problem described above, although on long steady loads the bias averages out; and there is no publication isolating the effect of memory clock locking on Wh/token in LLM inference, so any concrete figure on that point has to be your own measurement.&lt;/p>
&lt;h2 id="reference-figures">Reference figures&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>GPU&lt;/th>
&lt;th>TDP&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>H100 SXM&lt;/td>
&lt;td>up to 700 W, configurable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>H100 NVL&lt;/td>
&lt;td>350-400 W, configurable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A100 80GB SXM&lt;/td>
&lt;td>400 W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A100 80GB PCIe&lt;/td>
&lt;td>300 W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RTX 5090&lt;/td>
&lt;td>575 W, with a recommended 1000 W supply&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>HGX node of 8× H100 SXM&lt;/td>
&lt;td>10.2 kW nominal&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Average power measured in inference: on an HPC cluster with vLLM on A100, the aggregate power of the GPU set ranged between 999 W and 2,983 W depending on model and parallelism, with Nemotron 70B on 8× A100 at 2,983 W, about 373 W per GPU, around 93 % of TDP.&lt;/p>
&lt;p>Energy per token, with the warning that published figures measure different boundaries and cannot be mixed without normalising by GPU count and output tokens:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Source&lt;/th>
&lt;th>Figure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>TokenPowerBench, H100 94 GB&lt;/td>
&lt;td>40 J per token on a standard load, more than 60 J per token in high-throughput configurations&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TokenPowerBench, batch effect&lt;/td>
&lt;td>−25 % of energy per token between batch 32 and 256 on a 70B model&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TokenPowerBench, context effect&lt;/td>
&lt;td>from 2K to 10K tokens of context on Llama 3 70B: energy ×3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TokenPowerBench, quantisation effect&lt;/td>
&lt;td>Llama 3 405B in FP8 against FP16: −30 % of energy per token&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TokenPowerBench, engine effect&lt;/td>
&lt;td>TensorRT-LLM and vLLM against the Transformers engine: −25 % to −40 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Per-prompt measurement in batch&lt;/td>
&lt;td>0.0074-0.0289 Wh on 7B to 14B models; 0.0835-0.6912 Wh on 70B to 405B; single unbatched requests, between 10 and 100 times more expensive&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="cross-links-from-the-energy-track">Cross-links from the energy track&lt;/h2>
&lt;ul>
&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 electricity market&lt;/a>: what to do with the joule once it is measured properly, 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 — Measuring energy in production: Kepler, DCGM and the practical stack&lt;/a>: the continuous deployment of the stack whose metrology this sheet documents.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/ai-energy-benchmarking-frameworks-metrics-state-of-the-art/">C3 — Energy benchmarking: frameworks, metrics and the state of the art&lt;/a>: the full catalogue of tools and their metrics.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/mlperf-power-energy-efficiency-benchmark/">C4 — MLPerf Power&lt;/a>: the certified alternative, measuring at the wall with an external analyser instead of the card&amp;rsquo;s sensor.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/watt-to-carbon-pue-grid-intensity-gco2-per-token/">C6 — From watt to carbon: PUE, grid and grams of CO₂&lt;/a>: the chain that turns the measured watt into emissions and into euros.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/levers-fewer-watts-per-token-llm-inference/">C7 — Energy efficiency levers&lt;/a>: the quantified catalogue where the power ceiling of this sheet is just one more lever.&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/gpu-observability-llm-inference-twelve-dcgm-vllm-metrics/">GPU observability for LLM inference: DCGM and vLLM metrics&lt;/a> — the same agent seen from operations, with the metrics that watch health as well as consumption.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/reproducible-harness-cost-performance-energy-experiment/">The reproducible harness: cost, performance and energy in a single auditable experiment&lt;/a> — where this procedure fits inside the bench that measures all three axes at once.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/ai-datacenter-cooling-thermal-challenge/">Cooling the AI datacenter (1/4): the thermal challenge&lt;/a> — what happens to those watts after they turn entirely into heat.&lt;/li>
&lt;/ul>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>NVIDIA, &lt;em>NVML API Reference, Device Queries&lt;/em> — &lt;a href="https://docs.nvidia.com/deploy/nvml-api/group__nvmlDeviceQueries.html">https://docs.nvidia.com/deploy/nvml-api/group__nvmlDeviceQueries.html&lt;/a>&lt;/li>
&lt;li>NVIDIA, &lt;em>DCGM Library API, Field Identifiers&lt;/em> — &lt;a href="https://docs.nvidia.com/datacenter/dcgm/3.1/dcgm-api/dcgm-api-field-ids.html">https://docs.nvidia.com/datacenter/dcgm/3.1/dcgm-api/dcgm-api-field-ids.html&lt;/a>&lt;/li>
&lt;li>NVIDIA, &lt;em>DCGM Feature Overview&lt;/em> — &lt;a href="https://docs.nvidia.com/datacenter/dcgm/latest/user-guide/feature-overview.html">https://docs.nvidia.com/datacenter/dcgm/latest/user-guide/feature-overview.html&lt;/a>&lt;/li>
&lt;li>NVIDIA, &lt;em>dcgm-exporter&lt;/em> — &lt;a href="https://github.com/NVIDIA/dcgm-exporter">https://github.com/NVIDIA/dcgm-exporter&lt;/a>&lt;/li>
&lt;li>NVIDIA, &lt;em>H100 Tensor Core GPU, especificaciones&lt;/em> — &lt;a href="https://www.nvidia.com/en-us/data-center/h100/">https://www.nvidia.com/en-us/data-center/h100/&lt;/a>&lt;/li>
&lt;li>NVIDIA, &lt;em>A100 Tensor Core GPU, especificaciones&lt;/em> — &lt;a href="https://www.nvidia.com/en-us/data-center/a100/">https://www.nvidia.com/en-us/data-center/a100/&lt;/a>&lt;/li>
&lt;li>NVIDIA, &lt;em>GeForce RTX 5090, especificaciones&lt;/em> — &lt;a href="https://www.nvidia.com/en-us/geforce/graphics-cards/50-series/rtx-5090/">https://www.nvidia.com/en-us/geforce/graphics-cards/50-series/rtx-5090/&lt;/a>&lt;/li>
&lt;li>Yang, Adámek y Armour (Oxford), &lt;em>Part-time Power Measurements: nvidia-smi&amp;rsquo;s Lack of Attention&lt;/em> / SC24 — &lt;a href="https://arxiv.org/html/2312.02741v3">https://arxiv.org/html/2312.02741v3&lt;/a>&lt;/li>
&lt;li>Yang, &lt;em>GPU_Power_Benchmark&lt;/em>, microbenchmark del trabajo anterior — &lt;a href="https://github.com/JimZeyuYang/GPU_Power_Benchmark">https://github.com/JimZeyuYang/GPU_Power_Benchmark&lt;/a>&lt;/li>
&lt;li>ML.ENERGY, &lt;em>Measuring GPU Energy: Best Practices&lt;/em> — &lt;a href="https://ml.energy/blog/energy/measurement/measuring-gpu-energy-best-practices/">https://ml.energy/blog/energy/measurement/measuring-gpu-energy-best-practices/&lt;/a>&lt;/li>
&lt;li>You et al., &lt;em>Zeus: Understanding and Optimizing GPU Energy Consumption of DNN Training&lt;/em>, 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>Zeus, &lt;em>Measuring Energy&lt;/em> — &lt;a href="https://ml.energy/zeus/measure/">https://ml.energy/zeus/measure/&lt;/a>&lt;/li>
&lt;li>ML.ENERGY, &lt;em>The ML.ENERGY Benchmark&lt;/em> — &lt;a href="https://arxiv.org/html/2505.06371v1">https://arxiv.org/html/2505.06371v1&lt;/a>&lt;/li>
&lt;li>CNCF, &lt;em>Kepler, re-architected: improved power accuracy&lt;/em> (junio 2026) — &lt;a href="https://www.cncf.io/blog/2026/06/30/kepler-re-architected-improved-power-accuracy-and-a-community-call-to-action/">https://www.cncf.io/blog/2026/06/30/kepler-re-architected-improved-power-accuracy-and-a-community-call-to-action/&lt;/a>&lt;/li>
&lt;li>CodeCarbon, &lt;em>How Power Estimation Works&lt;/em> — &lt;a href="https://docs.codecarbon.io/latest/explanation/power-estimation/">https://docs.codecarbon.io/latest/explanation/power-estimation/&lt;/a>&lt;/li>
&lt;li>Hubblo, &lt;em>Scaphandre: cálculo del consumo por proceso&lt;/em> — &lt;a href="https://github.com/hubblo-org/scaphandre/blob/main/docs_src/explanations/how-scaph-computes-per-process-power-consumption.md">https://github.com/hubblo-org/scaphandre/blob/main/docs_src/explanations/how-scaph-computes-per-process-power-consumption.md&lt;/a>&lt;/li>
&lt;li>Linux Kernel, &lt;em>Power Capping Framework (powercap sysfs)&lt;/em> — &lt;a href="https://docs.kernel.org/power/powercap/powercap.html">https://docs.kernel.org/power/powercap/powercap.html&lt;/a>&lt;/li>
&lt;li>Intel, &lt;em>Running Average Power Limit Energy Reporting, INTEL-SA-00389&lt;/em> — &lt;a href="https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/advisory-guidance/running-average-power-limit-energy-reporting.html">https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/advisory-guidance/running-average-power-limit-energy-reporting.html&lt;/a>&lt;/li>
&lt;li>Lipp et al., &lt;em>PLATYPUS: With Great Power comes Great Leakage&lt;/em>, IEEE S&amp;amp;P 2021 — &lt;a href="https://platypusattack.com/">https://platypusattack.com/&lt;/a>&lt;/li>
&lt;li>Khan et al., &lt;em>RAPL in Action: Experiences in Using RAPL for Power Measurements&lt;/em>, ACM TOMPECS — &lt;a href="https://www.devsustainability.com/p/paper-notes-rapl-in-action">https://www.devsustainability.com/p/paper-notes-rapl-in-action&lt;/a>&lt;/li>
&lt;li>&lt;em>What Is the Cost of Energy Monitoring? An Empirical Study on the Overhead of RAPL-Based Tools&lt;/em> — &lt;a href="https://arxiv.org/html/2604.26815v1">https://arxiv.org/html/2604.26815v1&lt;/a>&lt;/li>
&lt;li>Patel et al. (Microsoft), &lt;em>Characterizing Power Management Opportunities for LLMs in the Cloud&lt;/em>, ASPLOS'24 — &lt;a href="https://www.microsoft.com/en-us/research/wp-content/uploads/2024/03/GPU_Power_ASPLOS_24.pdf">https://www.microsoft.com/en-us/research/wp-content/uploads/2024/03/GPU_Power_ASPLOS_24.pdf&lt;/a>&lt;/li>
&lt;li>MIT Lincoln Laboratory, &lt;em>Sustainable Supercomputing for AI: GPU Power Capping at HPC Scale&lt;/em> — &lt;a href="https://arxiv.org/html/2402.18593">https://arxiv.org/html/2402.18593&lt;/a>&lt;/li>
&lt;li>&lt;em>Architectural Trade-offs in the Energy-Efficient Era: power-capping NVIDIA H100 and H200&lt;/em> — &lt;a href="https://arxiv.org/html/2604.11391v1">https://arxiv.org/html/2604.11391v1&lt;/a>&lt;/li>
&lt;li>&lt;em>Empirically-Calibrated H100 Node Power Models for Datacenter Energy Analysis&lt;/em> — &lt;a href="https://arxiv.org/pdf/2506.14551">https://arxiv.org/pdf/2506.14551&lt;/a>&lt;/li>
&lt;li>&lt;em>The Model Parking Tax: Quantifying the Hidden Energy Cost of Always-On GPU Model Deployment&lt;/em> — &lt;a href="https://arxiv.org/html/2605.23918">https://arxiv.org/html/2605.23918&lt;/a>&lt;/li>
&lt;li>&lt;em>The Energy Cost of Execution-Idle in GPU Clusters&lt;/em> — &lt;a href="https://arxiv.org/html/2604.04745">https://arxiv.org/html/2604.04745&lt;/a>&lt;/li>
&lt;li>&lt;em>TokenPowerBench: Benchmarking the Power Consumption of LLM Inference&lt;/em> — &lt;a href="https://arxiv.org/pdf/2512.03024">https://arxiv.org/pdf/2512.03024&lt;/a>&lt;/li>
&lt;li>&lt;em>From Prompts to Power: Measuring the Energy Footprint of LLM Inference&lt;/em> — &lt;a href="https://arxiv.org/html/2511.05597">https://arxiv.org/html/2511.05597&lt;/a>&lt;/li>
&lt;li>&lt;em>Serving LLMs in HPC Clusters&lt;/em> — &lt;a href="https://arxiv.org/abs/2507.00418">https://arxiv.org/abs/2507.00418&lt;/a>&lt;/li>
&lt;li>Uptime Institute, &lt;em>Global Data Center Survey 2025&lt;/em> — &lt;a href="https://datacenter.uptimeinstitute.com/rs/711-RIA-145/images/2025.Annual.Survey.Report.pdf">https://datacenter.uptimeinstitute.com/rs/711-RIA-145/images/2025.Annual.Survey.Report.pdf&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Datacenter physical infrastructure (1/4): the power chain</title><link>https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-power-chain/</link><pubDate>Mon, 22 Jun 2026 20:00:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-power-chain/</guid><description>&lt;p>This blog has devoted more than a hundred articles to the software layer of inference: serving engines, KV-cache, observability, FinOps. But all of that rests on something far more prosaic and far less forgiving when it fails: the current coming in through the wall. With this series we open a new vertical, the &lt;strong>physical infrastructure of the datacenter&lt;/strong>, the cross-cutting topics an AI architect tends to take for granted until the day a power cut takes down an entire cluster. We start at the very beginning: the power chain.&lt;/p>
&lt;p>The approach is deliberately mixed. The concepts (electrical chain, redundancy, Tier levels, power factor) are universal and apply to any datacenter. But in each section we will point out why the AI era, with its racks of 120 kW and more, stresses that infrastructure to extremes the classical design never anticipated.&lt;/p>
&lt;h2 id="why-power-is-the-foundation-of-everything">Why power is the foundation of everything&lt;/h2>
&lt;p>In a datacenter, power is not an ancillary service: it is the primary constraint. You can survive a slow disk or a congested network, but not the loss of supply to critical equipment. And unlike software, electrical infrastructure is not hot-patched or scaled with a &lt;code>kubectl scale&lt;/code>: it is designed, built, and lived with for fifteen or twenty years. Getting the sizing or the redundancy wrong is not a bug, it is a construction project.&lt;/p>
&lt;p>In 2025-2026 this has gone from being a facilities concern to being the bottleneck of the entire sector. Power availability has become the factor that limits where and when an AI datacenter can be built: grid constraints stretch connection lead times to between 24 and 72 months, made worse by the global shortage of transformers, switchgear and even gas turbines. The challenge used to be finding GPUs; now, increasingly, it is finding megawatts.&lt;/p>
&lt;h2 id="the-chain-link-by-link">The chain, link by link&lt;/h2>
&lt;p>Power travels a long road from the utility feed to the chips. Each link transforms, protects or distributes, and each one is a point where reliability is won or lost. The canonical sequence is this:&lt;/p>
&lt;p>Grid (medium voltage) → MV switchgear → MV/LV transformer → low-voltage boards → UPS → floor power distribution units (PDU) → rack PDU or busway → server power supplies.&lt;/p>
&lt;p>The &lt;strong>utility feed&lt;/strong> arrives at medium voltage (MV) for facilities whose IT load exceeds a megawatt, which is already most of the relevant ones. Typical input voltages range from 11 to 33 kV. The &lt;strong>MV switchgear&lt;/strong> is the entry and protection point; vacuum circuit breakers are today the indoor standard. From there, the &lt;strong>transformers&lt;/strong> (usually 2.5 or 3 MVA) step the MV down to low voltage (LV), typically 400-480 V, which is what the hall handles.&lt;/p>
&lt;p>Downstream of the transformer, the &lt;strong>low-voltage boards&lt;/strong> distribute power towards the heart of the protection system: the &lt;strong>UPS&lt;/strong> (uninterruptible power supply). The UPS performs two functions worth keeping separate: it conditions the power (filtering disturbances, voltage sags, harmonics) and, above all, it bridges the seconds the generator takes to start and pick up load when the grid fails. The dominant topology in serious installations is double-conversion online, which isolates the load completely from the incoming supply. We will return to the UPS in the fourth article of the series, because its relationship with the generator is the heart of resilience.&lt;/p>
&lt;p>After the UPS, the &lt;strong>floor PDUs&lt;/strong> (Power Distribution Units) feed the rows, and the &lt;strong>rack PDUs&lt;/strong> (or an overhead busway) deliver power to each cabinet. Modern PDUs are not dumb power strips: metered units measure consumption per outlet and intelligent ones integrate with DCIM, add environmental sensors and allow outlets to be switched remotely. Finally, the server &lt;strong>power supplies&lt;/strong> convert that LV into the DC voltages the components consume.&lt;/p>
&lt;h3 id="the-ab-dual-path">The A/B dual path&lt;/h3>
&lt;p>There is a design principle that runs through the whole chain in high-availability installations: the &lt;strong>dual A and B path&lt;/strong>. Instead of a single route from the transformer to the rack, two electrically independent paths are built, with separate circuits, boards, UPS, PDUs and breakers, and no common points of failure. Every critical server carries two power supplies (dual-corded) and connects simultaneously to path A and path B. If one path goes down entirely, whether through a fault or planned maintenance, the server keeps running on the other without flinching. This architecture is the physical basis of 2N redundancy, and it is what allows half the installation to be maintained while the other half keeps serving.&lt;/p>
&lt;h2 id="redundancy-the-language-of-the-ns">Redundancy: the language of the &amp;ldquo;N&amp;quot;s&lt;/h2>
&lt;p>The whole conversation about electrical reliability is encoded in a compact notation worth mastering, because it defines the cost and the availability of the facility:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>N&lt;/strong> is the strict minimum capacity to support the load, with no reserve at all. A failure of any component brings the system down.&lt;/li>
&lt;li>&lt;strong>N+1&lt;/strong> adds one backup component to the set. It is the most efficient option in cost and energy, and the most common in cooling and, often, in generation.&lt;/li>
&lt;li>&lt;strong>N+2&lt;/strong> adds two backups, to tolerate a second failure or a failure during the maintenance of another component.&lt;/li>
&lt;li>&lt;strong>2N&lt;/strong> duplicates the entire system: two complete, independent sets (the A and B paths). It tolerates the total failure of either path with no impact, and allows one half to be maintained while the other operates. It is the basis of fault tolerance.&lt;/li>
&lt;li>&lt;strong>2N+1&lt;/strong> is the 2N duplication plus an extra component, to survive a failure and a maintenance activity at the same time.&lt;/li>
&lt;li>&lt;strong>Distributed redundancy&lt;/strong> (block redundant, sometimes &amp;ldquo;3N/2&amp;rdquo;): instead of backups dedicated to each block, it shares the reserve among several blocks, seeking a middle ground between the cost of N+1 and the robustness of 2N.&lt;/li>
&lt;/ul>
&lt;p>Two operational concepts sum up the intent of all this. A system is &lt;strong>concurrently maintainable&lt;/strong> when any component can be taken out of service in a planned way without affecting the IT load; and it is &lt;strong>fault tolerant&lt;/strong> when it also survives any single, unforeseen failure. The difference between the two is, essentially, the difference between being able to do maintenance without an outage and being able to absorb an unexpected event during that maintenance as well.&lt;/p>
&lt;p>The economic trade-off is the axis of the whole decision. Going from N to N+1 adds a single component and is relatively cheap; going to 2N literally duplicates half the installation (two UPS, two paths, often two electrical rooms) and drives up capex, floor space and the no-load consumption of the redundancy alike. Distributed or block redundancy exists precisely to capture much of the robustness of 2N at a cost closer to N+1, sharing the reserve among several blocks instead of dedicating it. There is no universal answer: the right architecture is the one that matches the cost of unavailability for your business against the cost of avoiding it. For a critical workload under SLA, the usual order of magnitude is a concurrently maintainable distribution with a dual A/B path; for workloads that tolerate maintenance windows, N+1 can be perfectly reasonable and much cheaper.&lt;/p>
&lt;h2 id="the-uptime-institute-tier-levels">The Uptime Institute Tier levels&lt;/h2>
&lt;p>The most widespread way of classifying this robustness is the Uptime Institute Tier system, with four levels in Roman numerals:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Tier I (basic capacity):&lt;/strong> single components, a single distribution path, no redundancy. Any maintenance or failure means an outage.&lt;/li>
&lt;li>&lt;strong>Tier II (redundant capacity):&lt;/strong> redundant components (N+1 in capacity) but a single, non-redundant distribution path.&lt;/li>
&lt;li>&lt;strong>Tier III (concurrently maintainable):&lt;/strong> multiple independent distribution paths; any component can be taken out for maintenance with no impact. It usually combines 2N in power with N+1 in cooling.&lt;/li>
&lt;li>&lt;strong>Tier IV (fault tolerant):&lt;/strong> 2N in every system; it survives any single infrastructure failure, as well as being concurrently maintainable.&lt;/li>
&lt;/ul>
&lt;p>Here an important warning is needed that many guides leave out. It is very common to see tables associating each Tier with an availability percentage (99.671 % for Tier I, 99.741 % for Tier II, 99.982 % for Tier III and 99.995 % for Tier IV) translated into minutes of downtime per year. &lt;strong>Those percentages are not guarantees or official Uptime Institute definitions.&lt;/strong> In fact, Uptime removed the references to &amp;ldquo;expected annual downtime&amp;rdquo; from its standard in 2009, and maintains that its definitions are based on topology and behaviour (redundant components, concurrent maintainability, fault tolerance), not on a magic number of nines. A badly operated Tier IV can go down, and a well-operated Tier III can have a spotless service record. Quote those percentages, if at all, as popular reference figures, never as a promise.&lt;/p>
&lt;p>Two more nuances for an architect. First, &lt;strong>design is not the same as built&lt;/strong>: Uptime distinguishes the Tier Certification of Design Documents, which validates only the drawings and expires after two years, from the Constructed Facility certification, which verifies the real building with live demonstrations. A &amp;ldquo;designed for Tier III&amp;rdquo; without a constructed-facility certification is an intention, not a fact. Second, the &lt;strong>European alternative&lt;/strong>: the EN 50600 standard, now folded into ISO/IEC 22237, classifies with Availability Classes 1 to 4 analogous to the Tiers, but with a more holistic approach covering power, cooling, telecommunications, security and efficiency, and it can be certified by independent bodies. In Europe it pays to speak both in Tiers and in EN 50600 classes.&lt;/p>
&lt;h2 id="the-metrics-you-really-have-to-understand">The metrics you really have to understand&lt;/h2>
&lt;p>Beyond the nomenclature, there are three pairs of concepts an architect must handle in order not to get the sizing wrong.&lt;/p>
&lt;h3 id="kw-versus-kva-and-the-power-factor">kW versus kVA and the power factor&lt;/h3>
&lt;p>This is the most common sizing error. &lt;strong>kW&lt;/strong> (active or real power) is the power that does useful work: what the servers actually consume. &lt;strong>kVA&lt;/strong> (apparent power) is the power the electrical infrastructure (the UPS, the cables, the generator) has to be capable of delivering. The relationship between the two is the &lt;strong>power factor&lt;/strong> (PF):&lt;/p>
$$\text{PF} = \frac{P_{\text{kW}}}{S_{\text{kVA}}}$$
&lt;p>From which you get what really matters when sizing: the apparent power the equipment must supply,&lt;/p>
$$S_{\text{kVA}} = \frac{P_{\text{kW}}}{\text{PF}}$$
&lt;p>If you size a UPS or a generator by the kW of the load alone, ignoring the power factor, &lt;strong>you underestimate the capacity needed&lt;/strong>. Modern servers with active power factor correction work close to unity (PF from 0.9 to 0.99), but generators are usually specified at a PF of 0.8: a 1000 kW set is catalogued as 1200 kVA. And a 100 kVA UPS at PF 0.9 delivers only 90 real kW. A load of 150 kW at PF 0.8 demands 187.5 kVA of equipment, not 150. Confusing these two quantities has left more than one hall with no headroom the day it filled up.&lt;/p>
&lt;h3 id="pue-the-efficiency-of-the-whole-facility">PUE: the efficiency of the whole facility&lt;/h3>
&lt;p>&lt;strong>PUE&lt;/strong> (Power Usage Effectiveness) measures how much total energy the facility consumes for every unit that actually reaches the IT equipment:&lt;/p>
$$\text{PUE} = \frac{E_{\text{total}}}{E_{\text{IT}}}$$
&lt;p>A PUE of 1.0 would be the theoretical ideal (all the energy goes to IT, nothing is lost in cooling, conversion or lighting). The sector&amp;rsquo;s declared average is around 1.5-1.56, the big hyperscalers come down to 1.09-1.20 (Google reports around 1.09) and regulation is tightening: the German energy efficiency act requires a PUE of 1.2 or lower for new datacenters from 2026. PUE is, at bottom, a measure of how much energy &amp;ldquo;tax&amp;rdquo; the facility pays above what it computes.&lt;/p>
&lt;h3 id="availability-and-the-nines">Availability and the nines&lt;/h3>
&lt;p>Finally, availability is expressed in &amp;ldquo;nines&amp;rdquo;, and it pays to have internalised its translation into annual downtime: 99.9 % is almost 9 hours a year; 99.99 %, about 53 minutes; 99.999 % (the famous five nines), about 5 minutes. The economic key is that &lt;strong>the cost of each additional nine is not linear&lt;/strong>: going from four to five nines does not cost a little more, it costs a multiple of the investment in redundancy, automation and, often, multiple sites. Chasing nines the business does not need is one of the most expensive forms of over-engineering.&lt;/p>
&lt;h3 id="a-sizing-example">A sizing example&lt;/h3>
&lt;p>Let us see how these quantities fit together in a concrete case, because the devil is in the detail. Suppose a row of eight GB200-class inference racks at 130 kW each: 1040 kW of real IT load. To size the &lt;strong>UPS&lt;/strong>, which works on apparent power, we apply the load&amp;rsquo;s power factor (say 0.95):&lt;/p>
$$S_{\text{kVA}} = \frac{1040}{0{.}95} \approx 1095 \text{ kVA}$$
&lt;p>that is, we need a UPS of around 1100 kVA for this row alone, and that without counting growth headroom or redundancy. To size the &lt;strong>generator&lt;/strong>, on the other hand, the IT load is not enough: you have to add everything hanging off the emergency side, above all the cooling, which at these densities is liquid and consumes its share. If we apply a PUE of 1.3, the total facility load for this row comes to around 1350 kW, and since sets are rated at PF 0.8, the generator must deliver on the order of 1690 kVA. You would choose a 2 MVA set, and an N+1 architecture would need two of them. The jump is revealing: a row that &amp;ldquo;consumes 1 MW&amp;rdquo; demands, via power factor and cooling, more than 4 MVA of installed generation if you want redundancy. Anyone sizing in their head, multiplying racks by chip watts, falls short at every link.&lt;/p>
&lt;h2 id="the-ai-earthquake-rack-density">The AI earthquake: rack density&lt;/h2>
&lt;p>This is where the AI era breaks the assumptions. For decades, rack density sat between 5 and 15 kW, and the sector average has barely risen: the Uptime Institute&amp;rsquo;s 2025 survey puts it at 7.5 kW per rack, with the bulk still between 5 and 9 kW. The whole classical electrical chain, and air cooling with it, was designed around those figures.&lt;/p>
&lt;p>A current AI rack pulverises them. The &lt;strong>NVIDIA GB200 NVL72&lt;/strong> is specified at 120 kW per rack, and real deployments have measured 130-132 kW at full load: eight to ten times the density of a traditional rack, concentrated in the same cabinet. At that density air stops being viable (rear-door units of 30-40 kW fall short) and direct-to-chip liquid cooling goes from option to requirement. And the electrical chain has to carry those 130 kW to a single rack: dedicated three-phase circuits, PDUs of 200 A or more, a lot more copper.&lt;/p>
&lt;p>And this has only just begun. NVIDIA&amp;rsquo;s roadmap points to some 190-230 kW per rack with the Vera Rubin generation, and to a staggering &lt;strong>600 kW per rack&lt;/strong> with Rubin Ultra &amp;ldquo;Kyber&amp;rdquo; in 2027, which NVIDIA proposes to feed directly at 800 V DC to reduce conversion stages and copper. The sector is already talking openly about 1 MW-class racks. These figures should be taken for what they are, vendor roadmap and industry debate rather than deployed installations, but the direction is unmistakable: density is rising faster than traditional electrical infrastructure knows how to absorb.&lt;/p>
&lt;p>The aggregate impact is macroeconomic. Datacenters consumed around 415 TWh in 2024 (about 1.5 % of the world&amp;rsquo;s electricity), and the International Energy Agency projects that the global figure could approach 945 TWh in 2030, pushed by AI. In 2025 datacenter electricity demand grew by 17 %, and that of AI-specific datacenters by 50 %. That is why grid connection, and not silicon, has become the real limiting factor for many projects.&lt;/p>
&lt;h3 id="high-density-distribution-and-the-jump-to-800-v-dc">High-density distribution and the jump to 800 V DC&lt;/h3>
&lt;p>Taking 130 kW, and tomorrow 600 kW, to a single rack forces a rethink of distribution. By Joule&amp;rsquo;s law, carrying more power at the same voltage means more current, and more current means more copper, more losses and more heat in the distribution itself. The industry is responding along two lines. One is raising the internal distribution voltage: NVIDIA has proposed for its next-generation racks a direct supply at &lt;strong>800 V DC&lt;/strong>, which reduces AC-DC conversion stages, cuts the copper needed and improves efficiency against the classical scheme of 480 V AC converted to DC in several steps inside the rack. It is an emerging transition and still under debate, but it marks the direction. The other line is the high-current overhead busway instead of traditional PDUs, which makes it easier to reconfigure and scale power per row without rewiring. For an architect, the lesson is that distribution topology (voltage, busway, number of phases) stops being an installation detail and becomes a design decision with a direct impact on cost and on the maximum density achievable.&lt;/p>
&lt;h2 id="the-grid-as-the-limit-siting-and-on-site-generation">The grid as the limit: siting and on-site generation&lt;/h2>
&lt;p>There is a link upstream of the whole chain we have described, and in 2025-2026 it has become the most critical of all: the connection to the utility grid. Getting the grid to deliver tens or hundreds of megawatts at a specific point has become the sector&amp;rsquo;s real bottleneck. Connection lead times have stretched to between two and six years in many geographies, weighed down by substation saturation and by the global shortage of transformers and medium-voltage switchgear, whose delivery times are now counted in years, not months.&lt;/p>
&lt;p>This has pushed a trend worth knowing about even though it falls outside the classical chain: &lt;strong>on-site generation&lt;/strong> (behind-the-meter). More and more AI projects, unable to wait for the grid, install their own generation (gas turbines, gas engines, and in some cases fuel cells) to start up before having a firm connection, or so as not to depend on one. It is an inversion of the traditional paradigm, in which the generator was only an emergency backup: now, sometimes, it is the primary source while the grid is awaited. This dynamic has cost, emissions and regulatory implications that an AI architect would do well to keep on the radar, because they determine where you can build and how fast. The siting of an AI datacenter is, increasingly, a decision about power availability before anything else.&lt;/p>
&lt;h2 id="the-facility-is-only-as-reliable-as-its-operation">The facility is only as reliable as its operation&lt;/h2>
&lt;p>It is worth closing with a warning the Tier system already hinted at: topology is a necessary but not a sufficient condition. A facility with impeccable 2N redundancy can go down all the same through a botched switching operation, maintenance without a procedure, a mislabelled breaker or a transfer test that was never rehearsed. A substantial share of real outages is born not of an equipment failure but of human operation on that equipment. That is why the Uptime Institute insists that a badly operated Tier IV guarantees nothing, and why constructed-facility certification includes live demonstrations: seeing the system transfer load for real, not reading it off a drawing.&lt;/p>
&lt;p>The practical consequence is that electrical reliability is managed with the same disciplines as any critical system: &lt;strong>observability and rehearsal&lt;/strong>. Observability is provided by DCIM (Data Center Infrastructure Management), which instruments the whole chain (consumption per outlet at the PDUs, temperature, status of the UPS and the generators, fuel levels, switch positions) and allows the system to be seen in real time and problems to be anticipated. Rehearsal is provided by periodic testing: starting the generators under real load (with load banks if necessary), running full transfers to the emergency source, and verifying that the UPS holds the bridge. A continuity plan that has not been rehearsed at realistic scale is a hypothesis, not a guarantee; and the day of the power cut is not the moment to discover that the generator will not pick up load or that the UPS cannot hold the necessary seconds. The physical layer, like the logical one, rewards whoever measures and rehearses, and punishes whoever trusts the paperwork.&lt;/p>
&lt;h2 id="for-an-inference-factory">For an inference factory&lt;/h2>
&lt;p>What does someone building or running an inference factory take away from all this? Three ideas. First, that the electrical design must start from the &lt;strong>real density of AI racks&lt;/strong>, not from historical averages: planning an inference hall at 10 kW per rack is planning for a facility that does not exist. Second, that &lt;strong>liquid cooling and high-density distribution&lt;/strong> stop being exotic and become the base case, with everything that implies for sizing copper, PDUs and boards. And third, that &lt;strong>redundancy has a cost that has to be matched to the business&lt;/strong>: an inference factory under SLA probably justifies a concurrently maintainable architecture (Tier III order, dual A/B path), but chasing full fault tolerance at every link can be a luxury the use case does not pay for. The availability of compute, as we saw in the storage series, depends as much on the physical layer as on the logical one.&lt;/p>
&lt;p>This article has drawn the complete map of the chain. The next three go into the links where resilience against a power cut is decided: the &lt;strong>generators&lt;/strong> that sustain the facility when the utility goes away, the &lt;strong>switching&lt;/strong> (ATS and STS) that transfers the load between sources, and the &lt;strong>UPS&lt;/strong> that bridges those critical seconds. Because a perfectly sized chain is worth nothing if, the day the grid blinks, there is nobody to take over in time.&lt;/p>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-generators/">Datacenter physical infrastructure (2/4): the generators&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/storage-ai-era-availability/">Storage in the AI era (4/4): availability&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>Giga Energy, &lt;em>Data center electrical distribution system: Key elements&lt;/em> — &lt;a href="https://www.gigaenergy.com/blog/data-center-electrical-distribution-system">https://www.gigaenergy.com/blog/data-center-electrical-distribution-system&lt;/a>&lt;/li>
&lt;li>GBC Engineers, &lt;em>The Basics of Electrical Data Center Design in 2025&lt;/em> — &lt;a href="https://gbc-engineers.com/news/electrical-data-center-design">https://gbc-engineers.com/news/electrical-data-center-design&lt;/a>&lt;/li>
&lt;li>CoreSite, &lt;em>What is Data Center Redundancy? N, N+1, 2N, 2N+1&lt;/em> — &lt;a href="https://www.coresite.com/blog/data-center-redundancy-n-1-vs-2n-1">https://www.coresite.com/blog/data-center-redundancy-n-1-vs-2n-1&lt;/a>&lt;/li>
&lt;li>Dgtl Infra, &lt;em>Data Center Redundancy: N, N+1, 2N, and 2N+1 Explained&lt;/em> — &lt;a href="https://dgtlinfra.com/data-center-redundancy/">https://dgtlinfra.com/data-center-redundancy/&lt;/a>&lt;/li>
&lt;li>Uptime Institute, &lt;em>Tier Classification System&lt;/em> — &lt;a href="https://uptimeinstitute.com/tiers">https://uptimeinstitute.com/tiers&lt;/a>&lt;/li>
&lt;li>Uptime Institute, &lt;em>Tier Classification Myths and Misconceptions&lt;/em> — &lt;a href="https://uptimeinstitute.com/myths">https://uptimeinstitute.com/myths&lt;/a>&lt;/li>
&lt;li>Uptime Institute Journal, &lt;em>Myths and Misconceptions Regarding the Tier Certification System&lt;/em> — &lt;a href="https://journal.uptimeinstitute.com/myths-and-misconceptions-regarding-the-uptime-institutes-tier-certification-system/">https://journal.uptimeinstitute.com/myths-and-misconceptions-regarding-the-uptime-institutes-tier-certification-system/&lt;/a>&lt;/li>
&lt;li>Techerati, &lt;em>Explaining the new family of ISO Data Centre Standards (EN 50600 / ISO 22237)&lt;/em> — &lt;a href="https://www.techerati.com/features-hub/explaining-the-new-family-of-iso-data-centre-standards/">https://www.techerati.com/features-hub/explaining-the-new-family-of-iso-data-centre-standards/&lt;/a>&lt;/li>
&lt;li>Fuji Electric, &lt;em>The Importance of Power Factor in Data Center UPS Selection&lt;/em> — &lt;a href="https://americas.fujielectric.com/the-importance-of-power-factor-in-data-center-ups-selection/">https://americas.fujielectric.com/the-importance-of-power-factor-in-data-center-ups-selection/&lt;/a>&lt;/li>
&lt;li>Server Room Environments, &lt;em>How To Size UPS Systems In kVA and kW&lt;/em> — &lt;a href="https://www.serverroomenvironments.co.uk/blog/how-to-size-ups-systems-in-kva-and-kw">https://www.serverroomenvironments.co.uk/blog/how-to-size-ups-systems-in-kva-and-kw&lt;/a>&lt;/li>
&lt;li>Statista, &lt;em>Data center average annual PUE worldwide 2025&lt;/em> — &lt;a href="https://www.statista.com/statistics/1229367/data-center-average-annual-pue-worldwide/">https://www.statista.com/statistics/1229367/data-center-average-annual-pue-worldwide/&lt;/a>&lt;/li>
&lt;li>Google Data Centers, &lt;em>Power usage effectiveness&lt;/em> — &lt;a href="https://datacenters.google/efficiency/">https://datacenters.google/efficiency/&lt;/a>&lt;/li>
&lt;li>Uptime Institute, &lt;em>Global Data Center Survey 2025&lt;/em> — &lt;a href="https://intelligence.uptimeinstitute.com/resource/uptime-institute-global-data-center-survey-2025">https://intelligence.uptimeinstitute.com/resource/uptime-institute-global-data-center-survey-2025&lt;/a>&lt;/li>
&lt;li>NVIDIA, &lt;em>GB200 NVL72&lt;/em> — &lt;a href="https://www.nvidia.com/en-us/data-center/gb200-nvl72/">https://www.nvidia.com/en-us/data-center/gb200-nvl72/&lt;/a>&lt;/li>
&lt;li>ToneCooling, &lt;em>GB200 NVL72 Cooling Requirements&lt;/em> — &lt;a href="https://tonecooling.com/nvidia-gb200-nvl72-cooling-requirements/">https://tonecooling.com/nvidia-gb200-nvl72-cooling-requirements/&lt;/a>&lt;/li>
&lt;li>Tom&amp;rsquo;s Hardware, &lt;em>Nvidia shows off Rubin Ultra with 600,000-Watt Kyber racks (2027)&lt;/em> — &lt;a href="https://www.tomshardware.com/pc-components/gpus/nvidia-shows-off-rubin-ultra-with-600-000-watt-kyber-racks-and-infrastructure-coming-in-2027">https://www.tomshardware.com/pc-components/gpus/nvidia-shows-off-rubin-ultra-with-600-000-watt-kyber-racks-and-infrastructure-coming-in-2027&lt;/a>&lt;/li>
&lt;li>SemiAnalysis, &lt;em>Inside the 800VDC Revolution – Part 1&lt;/em> — &lt;a href="https://newsletter.semianalysis.com/p/inside-the-800vdc-revolution-part">https://newsletter.semianalysis.com/p/inside-the-800vdc-revolution-part&lt;/a>&lt;/li>
&lt;li>IEA, &lt;em>Energy demand from AI&lt;/em> — &lt;a href="https://www.iea.org/reports/energy-and-ai/energy-demand-from-ai">https://www.iea.org/reports/energy-and-ai/energy-demand-from-ai&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Datacenter physical infrastructure (2/4): the generators</title><link>https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-generators/</link><pubDate>Mon, 22 Jun 2026 19:00:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-generators/</guid><description>&lt;p>In the &lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-power-chain/">first article&lt;/a> we mapped the complete power chain, from the utility feed to the rack, and left pending the links that decide resilience against a power cut. We start with the one that carries the weight of the hours: the generator set. The UPS, which we will see at the end of the series, is a sprinter that covers seconds; the generator is a long-distance runner, capable of sustaining the entire facility for hours or days while the utility fails to come back. And in the AI era it has stopped being a mere insurance policy to become, at times, the main source of power.&lt;/p>
&lt;h2 id="the-generators-role-long-duration-backup">The generator&amp;rsquo;s role: long-duration backup&lt;/h2>
&lt;p>A datacenter&amp;rsquo;s line of defence against a grid failure is clear: the UPS takes over instantly, with no perceptible interruption, and sustains the load during the few seconds the generator needs to start, stabilise and accept load. From there on, the generator takes over the work and the UPS returns to its role as conditioner and reserve. The UPS saves the gap; the generator saves the outage. For a datacenter, units of 1 to 3 MW are typically used, sized to support 100 % of the load for the whole duration of the event, not to give a brief push.&lt;/p>
&lt;p>What has changed in 2025-2026 is the purpose. The AI boom, combined with the impossibility of getting a grid connection within reasonable timescales, has pushed many projects to use on-site generation as the &lt;strong>primary source&lt;/strong> (behind-the-meter), not as an emergency supply. Some 92 % of announced behind-the-meter projects (around 82 GW) date from the start of 2025 onwards. The extreme case is the off-grid Oracle and OpenAI datacenter in Texas: a 700 MW natural gas microgrid with almost two hundred Jenbacher engines dedicated to prime power and a dozen more for backup, to feed up to 1.4 GW of compute. The generator, which for decades was the actor waiting in the shadows, has walked onto the main stage. This change of role has cascading consequences, in the rating that has to be specified, in the applicable emissions regime, in fuel logistics and in maintenance, which run through this entire article. It is worth keeping in mind: many of the design decisions depend on whether the generator is an insurance policy that starts once a year or a power station that runs for thousands of hours.&lt;/p>
&lt;h2 id="starting-in-10-seconds">Starting in 10 seconds&lt;/h2>
&lt;p>The requirement that defines the design of a mission-critical generator is the starting time. NFPA 110, which governs emergency power systems, classifies installations by level and by type. Datacenters usually use &lt;strong>Level 1, Type 10&lt;/strong>: the system must deliver acceptable power to the loads within &lt;strong>10 seconds&lt;/strong> of the grid failure, and at Level 1 all loads are transferred within that time, regardless of the size of the facility. Ten seconds is, precisely, the gap the UPS has to cover with its batteries.&lt;/p>
&lt;p>But starting on time is only half the challenge. The other half is &lt;strong>accepting the load without destabilising&lt;/strong>. When a newly started generator receives a large block of load all at once, the rectifier bank of a UPS for example, the alternator voltage and the engine frequency dip momentarily (voltage dip, frequency dip) before recovering. If those dips are excessive, the server power supplies can trip and reboot in a loop even though the generator is running: the power cut has been dodged, but the system goes down anyway through a badly managed transient. This is the difference between a generator that &amp;ldquo;starts&amp;rdquo; and one that &amp;ldquo;sustains&amp;rdquo;.&lt;/p>
&lt;p>Here is one of the technical reasons why &lt;strong>diesel still dominates&lt;/strong> over gas. Diesel injects the fuel directly into the cylinder and can accept load blocks close to 100 % with tolerable dips. The gas engine, by contrast, opens an intake valve and the air-fuel mixture must travel through the manifold before burning, which introduces a delay: a turbocharged gas engine can accept steps as low as 10-15 %, against 60-80 % for diesel. For a sensitive load that appears all at once, that difference is decisive.&lt;/p>
&lt;p>The framework that quantifies all this is the ISO 8528-5 standard, which defines performance classes G1 to G4 with increasingly strict limits on voltage and frequency deviation. For sensitive electronic loads (UPS, drives) the reference class is &lt;strong>G3&lt;/strong>, which requires voltage regulation around ±1 % and frequency regulation of ±0.25 % in steady state, with fast recovery from transients. Class G4, stricter still, is agreed between manufacturer and customer. It is worth remembering that UPS units are especially sensitive to the rate of change of frequency: variations above half a hertz per second can make them reject the source.&lt;/p>
&lt;h2 id="the-ratings-why-standby-is-not-enough">The ratings: why &amp;ldquo;standby&amp;rdquo; is not enough&lt;/h2>
&lt;p>Not all generators of the same nominal power are equivalent; what distinguishes them is their &lt;strong>rating&lt;/strong>, which defines how many hours and at what load factor they can work. ISO 8528-1 defines four:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>ESP (Emergency Standby Power):&lt;/strong> variable load, up to about 200 hours a year, with an average load factor not exceeding 70 % over 24 hours. It is the classic &amp;ldquo;emergency backup&amp;rdquo;.&lt;/li>
&lt;li>&lt;strong>PRP (Prime Power):&lt;/strong> variable load, unlimited hours, average load factor around 70 %.&lt;/li>
&lt;li>&lt;strong>LTP (Limited-Time Power):&lt;/strong> up to about 500 hours a year.&lt;/li>
&lt;li>&lt;strong>COP (Continuous Operating Power):&lt;/strong> unlimited hours at constant load, normally at 100 % indefinitely.&lt;/li>
&lt;/ul>
&lt;p>To those four the industry has added a commercial rating specific to our world: &lt;strong>DCC (Data Center Continuous)&lt;/strong>. It is not part of ISO 8528-1, being manufacturer nomenclature (Cummins, Caterpillar/MTU), but it has been reviewed by the Uptime Institute and is considered suitable for Tier III and IV. Its distinguishing feature is that it allows unlimited hours &lt;strong>with no average load factor restriction&lt;/strong>, neither variable nor constant. Why does this matter? Because a datacenter operating behind-the-meter, doing peak shaving, or simply wanting Uptime certification without the hour and load limitations of the Standby rating cannot settle for an ESP. The choice of rating is not a catalogue detail: it determines whether the generator is legally and technically fit for the use it is going to be put to.&lt;/p>
&lt;h2 id="sizing-it-right-the-devil-in-the-transients">Sizing it right: the devil in the transients&lt;/h2>
&lt;p>As we saw in the first article, generators are sized in apparent power (kVA), applying the power factor, with 0.8 the industry standard for mixed loads:&lt;/p>
$$S_{\text{kVA}} = \frac{P_{\text{kW}}}{\text{PF}}$$
&lt;p>But the real sizing of a generator is rarely set by the steady-state load; it is set by the &lt;strong>transients&lt;/strong> and the &lt;strong>problem loads&lt;/strong>. Three factors force oversizing:&lt;/p>
&lt;p>First, &lt;strong>motor starting&lt;/strong>. Induction motors demand five to seven times their rated current on direct starting, with a very low power factor (0.2-0.35), which can translate into a peak of 2.5 to 3.5 times the motor&amp;rsquo;s rated kVA. Cooling pumps and compressors starting at the same time can sink the frequency of a badly sized generator. Soft starters and drives reduce that blow.&lt;/p>
&lt;p>Second, &lt;strong>non-linear loads and harmonics&lt;/strong>. UPS units and drives inject harmonic distortion (THD) that heats the alternator and degrades the waveform. The rule of thumb is to reduce the available capacity by around 0.8 % for each point of THD above 5 %, which in practice can require oversizing by between 15 and 25 %, or specifying an alternator with 2/3 pitch winding and permanent magnet excitation (PMG), which is more tolerant of distortion.&lt;/p>
&lt;p>Third, &lt;strong>derating&lt;/strong> for ambient conditions: above 40 °C of temperature or 1000 m of altitude, the generator loses capacity and this must be corrected. Adding it all up, the manufacturers and NFPA 110 itself recommend a safety margin of the order of 20-25 %. Sizing a generator &amp;ldquo;exactly&amp;rdquo; for the nominal load is the recipe for the cooling not starting on the day of the outage.&lt;/p>
&lt;p>It is worth seeing the combined effect in a case. Returning to the example from the first article, a row that added up to the order of 1350 kW of total load with its cooling, in steady state that called for some 1690 kVA of generation. But if the cooling of that row includes several pumps and compressors starting at the same time after the outage, the transient starting peak can momentarily demand considerably more than those 1690 kVA, and the alternator must hold the frequency during that instant without the electronic loads dropping out. It is common that, after adding the margin for motor starting, the harmonic tolerance of the UPS and the ambient derating, the set selected for a row &amp;ldquo;of 1 MW of IT&amp;rdquo; ends up at 2 to 2.5 MVA, and that two are installed in N+1. A generator is not sized by what the load consumes, but by the worst instant it has to survive.&lt;/p>
&lt;h2 id="diesel-gas-hydrogen-and-batteries">Diesel, gas, hydrogen and batteries&lt;/h2>
&lt;p>The choice of generation technology is one of the great debates of 2025-2026, and it pays to understand why, despite all the alternatives, diesel keeps winning.&lt;/p>
&lt;p>The figure for the &lt;strong>&amp;ldquo;diesel boom&amp;rdquo;&lt;/strong> is eloquent: installed diesel generation capacity in United States datacenters went from some 20 GW in 2018 to 55 GW in 2024, nearly tripling; in Virginia alone more than 10,500 units, 27 GW, had been permitted by the end of 2025. The reason is not nostalgia but fit. An AI datacenter is commissioned in 18-24 months, while a new gas plant depends on turbines with delivery times of 2 to 4 years and on grid connection queues that reach 7 years. Diesel is the only option that matches the speed, the risk tolerance and the regulatory framework of AI deployment, and it also accepts large load blocks and does not depend on a pipeline. Cummins has delivered more than 39 GW of equipment to datacenters and doubled its production capacity in 2025.&lt;/p>
&lt;p>The &lt;strong>alternatives&lt;/strong> are advancing, but slowly. Natural gas, with its greater autonomy, is the basis of the large behind-the-meter prime power projects, at the cost of a slower transient response. &lt;strong>Bi-fuel&lt;/strong> systems combine diesel and gas to extend autonomy, reverting to diesel if the gas fails. &lt;strong>Fuel cells&lt;/strong> are gaining traction: Bloom Energy (solid oxide) has signed agreements with hyperscalers and is moving from backup to prime power, and Microsoft tested with Caterpillar a 3 MW hydrogen fuel cell capable of feeding a facility for 48 hours, with the goal of eliminating diesel by 2030. &lt;strong>Batteries&lt;/strong> (BESS), for their part, are being integrated into medium-voltage architectures to cover short events and reduce generator running hours, with the generator only starting on extended disturbances. But diesel remains the reference standard, and the alternatives coexist with it more than they replace it.&lt;/p>
&lt;p>The table sums up the trade-offs each technology settles:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Technology&lt;/th>
&lt;th>Transient response&lt;/th>
&lt;th>Autonomy&lt;/th>
&lt;th>Emissions in use&lt;/th>
&lt;th>Maturity 2026&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Diesel&lt;/td>
&lt;td>Excellent (blocks ~100 %)&lt;/td>
&lt;td>Limited by tank (24-72 h)&lt;/td>
&lt;td>High; requires Tier 4 / SCR+DPF&lt;/td>
&lt;td>Dominant&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Natural gas&lt;/td>
&lt;td>Slow (low steps)&lt;/td>
&lt;td>High (depends on pipeline)&lt;/td>
&lt;td>Lower than diesel&lt;/td>
&lt;td>Growing (prime / behind-the-meter)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Bi-fuel&lt;/td>
&lt;td>Good (reverts to diesel)&lt;/td>
&lt;td>High&lt;/td>
&lt;td>Intermediate&lt;/td>
&lt;td>Niche&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fuel cell (H₂/SOFC)&lt;/td>
&lt;td>Variable&lt;/td>
&lt;td>Depends on H₂/gas supply&lt;/td>
&lt;td>Very low or none&lt;/td>
&lt;td>Emerging&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>BESS (batteries)&lt;/td>
&lt;td>Instantaneous&lt;/td>
&lt;td>Short (minutes to a few hours)&lt;/td>
&lt;td>None in use&lt;/td>
&lt;td>Complementary&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The reading for an architect is that there is no &amp;ldquo;best&amp;rdquo; technology, but rather a combination appropriate to each case: diesel provides the response and the supply independence that critical starting demands, gas and fuel cells provide autonomy and low emissions for prolonged operation, and batteries cut engine hours. The most advanced architectures of 2025-2026 are hybrid for precisely that reason.&lt;/p>
&lt;h2 id="emissions-the-tension-with-regulation">Emissions: the tension with regulation&lt;/h2>
&lt;p>Burning diesel at gigawatt scale has an environmental cost that regulation watches closely, and here there is a tension every AI architect must know about. The United States EPA &lt;strong>Tier 4 Final&lt;/strong> standard for diesel engines requires drastic reductions in nitrogen oxides and particulates, of the order of 93-94 % against the first generations, which forces full aftertreatment with a particulate filter (DPF) and selective catalytic reduction (SCR) with urea (DEF). Meeting Tier 4 Final is expensive and bulky.&lt;/p>
&lt;p>The critical nuance is that &lt;strong>strictly emergency engines are exempt&lt;/strong> from the most severe requirements: they can run up to about 100 hours a year for testing and maintenance (of which a maximum of 50 for non-strictly-emergency uses), with no time limit during a real emergency. That framework fits perfectly with the traditional role of the generator as backup. But it collides head-on with behind-the-meter use as a primary source, which means thousands of hours a year and requires far more demanding environmental permits.&lt;/p>
&lt;p>This tension is one of the knots of AI deployment. A generator classified as &amp;ldquo;emergency&amp;rdquo; is cheap to permit and to maintain, but it cannot be the main source without breaking the framework that grants it that exemption; a prime power generator is legally fit to run for thousands of hours, but it carries the cost and the bulk of full Tier 4 aftertreatment and environmental permits that are much slower to obtain. Where the rush to deploy compute collides with local air quality, projects fall back on &amp;ldquo;minor source&amp;rdquo; permits and on spreading the load across many small units, an exercise in regulatory as much as electrical engineering. And social pressure is rising: communities near large datacenters look ever more closely at the megawatts of diesel installed beside them. The industry navigates that tension with &amp;ldquo;minor source&amp;rdquo; permits and with architectures that spread the load, but it is regulatory ground in full evolution. In Europe, the equivalent standard is Stage V, which also requires aftertreatment for large engines. And a decarbonisation route with no retrofit is emerging: &lt;strong>HVO&lt;/strong> (renewable diesel of vegetable origin), a drop-in substitute that reduces CO₂ by up to 90 %, is stored for up to ten years with low microbial risk, and which the main manufacturers already certify for their sets.&lt;/p>
&lt;h2 id="the-fuel-autonomy-and-degradation">The fuel: autonomy and degradation&lt;/h2>
&lt;p>A generator is worth no more than its fuel supply. The prevailing design in large datacenters combines a &lt;strong>belly tank&lt;/strong> integrated under each set with refuelling by tanker truck. The recommended autonomy goes from 12-24 hours per generator in normal facilities to 48 or 72 hours in mission-critical ones, and more still in seismic or remote areas.&lt;/p>
&lt;p>The autonomy calculation is direct: the time the generator holds out is the fuel volume divided by the consumption,&lt;/p>
$$t_{\text{autonomy}} = \frac{V_{\text{tank}}}{\dot{m}_{\text{consumption}}}$$
&lt;p>and consumption follows a useful rule of thumb: about 90 gallons per hour per MW at full load, equivalent to approximately 0.1 gallons of diesel per kWh generated. A 2 MW set can consume of the order of 140 gallons per hour at full load, so 72 hours at 75 % load requires of the order of 7,500 gallons in store. Multiply by an N+1 fleet of several sets and you understand why fuel logistics is a project in itself.&lt;/p>
&lt;p>And there is a trap that gets forgotten: diesel &lt;strong>degrades&lt;/strong>. It starts to oxidise at 6-12 months, accumulates water through condensation and encourages microbial growth that generates sludge and acids capable of clogging filters and injectors. The solution is polishing, filtering the stored fuel without emptying the tank, every 3-6 months, and not storing diesel for more than a year without treatment. A generator that will not start on the day of the outage because its fuel has spoiled is as absolute a failure as not having one at all.&lt;/p>
&lt;p>The fuel architecture usually has two levels: a main tank (bulk, or the belly tank under the set) with the total autonomy, and a smaller day tank next to the engine that refills automatically and guarantees immediate, stable supply. Redundancy of supply, with refuelling contracts for tankers and priority in the face of a regional disaster affecting many customers at once, is part of the resilience design, not a logistical patch. And here the transition to &lt;strong>HVO&lt;/strong> changes the equation for the better: besides cutting CO₂ by up to 90 % with no engine modification, it is far more stable in storage, holding up for as much as ten years with low microbial risk, which relieves precisely the degradation problem of fossil diesel. It is no coincidence that the major manufacturers already certify their sets for HVO and that several European operators have adopted it.&lt;/p>
&lt;h2 id="paralleling-several-sets-as-one">Paralleling: several sets as one&lt;/h2>
&lt;p>A serious facility rarely depends on a single generator. N+1 redundancy requires several sets working in parallel, and coordinating them is the job of the &lt;strong>paralleling switchgear&lt;/strong>. Putting two generators in parallel is not trivial: before closing the breaker that joins them, three parameters must match, namely voltage, frequency and, above all, &lt;strong>phase angle&lt;/strong>, because closing out of synchronism can cause severe mechanical damage. Digital controls (Cummins PowerCommand, Caterpillar EMCP, Woodward) decide the safe instant to close.&lt;/p>
&lt;p>Once in parallel, the system shares the load proportionally among the sets (load sharing), both active and reactive power. In island operation, the case of a power cut, isochronous control keeps the frequency constant; when paralleling with the grid, droop control is used. And then the magic of redundancy: when a running set fails, the controls start, synchronise and bring in the standby one, rebalancing the load in seconds. The cost of all this capability is not small: a turnkey diesel system at large scale moves in market ranges of the order of 650,000 to more than 1,000,000 USD per MW, and the paralleling switchgear for a hyperscaler can add up to several million.&lt;/p>
&lt;p>The choice between N+1 and more robust configurations reappears here with a nuance specific to generation. An N+1 generator plant, four sets for a load that needs three, for example, tolerates the failure of one set without losing the facility, and it is the usual configuration for its cost-reliability balance. But it pays to look at where the single point of failure is: if all the sets feed a single bus through one paralleling switchgear lineup, that board becomes a critical link that must be designed with its own redundancy or segmentation. Replicating generators without replicating the bus that joins them is solving half the problem. In fault-tolerant facilities, the logic of the two A/B paths we saw in the first article extends to generation as well: two independent plants, each feeding its own path, with no common point where a single failure brings everything down.&lt;/p>
&lt;h2 id="maintenance-and-testing-the-enemy-is-low-load">Maintenance and testing: the enemy is low load&lt;/h2>
&lt;p>It ends where the first article ended: reliability is earned by rehearsing. And with diesel generators there is a specific and counter-intuitive enemy: &lt;strong>low load&lt;/strong>. Running a diesel for a long time below its optimal load causes wet stacking, the accumulation of unburnt fuel in the exhaust, which reduces efficiency and can damage the engine. That is why testing does not consist merely of starting the set, but of loading it for real.&lt;/p>
&lt;p>The instrument is the &lt;strong>load bank&lt;/strong>, which applies real load to the generator to burn off those residues and, along the way, reveal latent faults in cooling, injectors or voltage regulation that a no-load start would never show. NFPA 110 sets the rhythm: a monthly test of the diesel at a minimum of 30 % of its rated power, and an annual load bank protocol applying 50 % for half an hour followed by 75 % for an hour. Skipping these tests is building paper resilience: the generator appears to be there, but nobody has checked that it will sustain the load when it really matters.&lt;/p>
&lt;p>There is a paradox in all this worth bearing in mind. The generator is probably the most tested and least used machine in a well-run datacenter: it spends 99.9 % of its life switched off, waiting for an event that one hopes never arrives, and yet it is rehearsed religiously every month. That discipline is not bureaucracy: it is the only way to be certain that, in the seconds when the grid blinks and the UPS drains its batteries, the handover happens. A generator that is never tested under load is not a backup, it is an expensive assumption. The reliability of the electrical layer, like that of any critical system, is built with redundancy and confirmed by rehearsal.&lt;/p>
&lt;h2 id="key-takeaways">Key takeaways&lt;/h2>
&lt;p>The generator is the long-distance runner of the power chain: it starts in ten seconds, accepts load blocks without destabilising, and sustains the facility for hours or days with a rating, ideally Continuous or DCC, matched to its real use. Sizing it right means thinking about transients and harmonics, not just the nominal load; feeding it right requires fuel logistics with autonomy and polishing; and relying on it requires redundant paralleling and load bank testing. In the AI era, moreover, it has crossed a boundary: from emergency insurance to, increasingly, primary source of power, with all that implies for emissions and regulation.&lt;/p>
&lt;p>But the generator does not act alone. Between the grid, the generator and the load there is a referee that decides at every instant where the power comes from: the switching. The third article of the series, which we will publish next, will go into ATS and STS units, and into how the load is transferred between sources without the compute noticing.&lt;/p>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-power-chain/">Datacenter physical infrastructure (1/4): the power chain&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/storage-ai-era-availability/">Storage in the AI era (4/4): availability&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>Powerlink, &lt;em>Understanding Data Center Backup Power&lt;/em> — &lt;a href="https://powerlinkenergy.us/blogs/understanding-data-center-backup-power/">https://powerlinkenergy.us/blogs/understanding-data-center-backup-power/&lt;/a>&lt;/li>
&lt;li>Cleanview, &lt;em>Bypassing the Grid: Behind-the-Meter Data Centers&lt;/em> — &lt;a href="https://cleanview.co/reports/behind-the-meter-data-centers">https://cleanview.co/reports/behind-the-meter-data-centers&lt;/a>&lt;/li>
&lt;li>Construction Owners, &lt;em>Oracle and OpenAI to Power New Texas Data Center Off the Grid&lt;/em> — &lt;a href="https://www.constructionowners.com/news/oracle-and-openai-to-power-new-texas-data-center-off-the-grid">https://www.constructionowners.com/news/oracle-and-openai-to-power-new-texas-data-center-off-the-grid&lt;/a>&lt;/li>
&lt;li>Cummins, &lt;em>Understanding ISO 8528-1 Generator Set Ratings&lt;/em> — &lt;a href="https://www.cummins.com/sites/default/files/2018-08/201707%20PowerHour_Understanding%20ISO%208528%20GeneratorSetRatings.pdf">https://www.cummins.com/sites/default/files/2018-08/201707%20PowerHour_Understanding%20ISO%208528%20GeneratorSetRatings.pdf&lt;/a>&lt;/li>
&lt;li>Cummins, &lt;em>Data Center Continuous (DCC) Ratings&lt;/em> — &lt;a href="https://mart.cummins.com/imagelibrary/data/assetfiles/0059642.pdf">https://mart.cummins.com/imagelibrary/data/assetfiles/0059642.pdf&lt;/a>&lt;/li>
&lt;li>Cummins, &lt;em>NFPA 110 Type 10 Requirements&lt;/em> — &lt;a href="https://www.cummins.com/sites/default/files/2019-03/PowerHour_NFPA110.pdf">https://www.cummins.com/sites/default/files/2019-03/PowerHour_NFPA110.pdf&lt;/a>&lt;/li>
&lt;li>Caterpillar, &lt;em>Transient Performance Specifications for Diesel Generator Sets&lt;/em> — &lt;a href="https://www.cat.com/en_US/by-industry/electric-power/Articles/White-papers/transient-performance-specifications-for-diesel-generator-sets.html">https://www.cat.com/en_US/by-industry/electric-power/Articles/White-papers/transient-performance-specifications-for-diesel-generator-sets.html&lt;/a>&lt;/li>
&lt;li>Kohler, &lt;em>ISO 8528-5 and Generator Transient Performance&lt;/em> — &lt;a href="https://techcomm.kohler.com/techcomm/pdf/ISO%208528-5%20and%20Generator%20Transient%20Performance_WP.pdf">https://techcomm.kohler.com/techcomm/pdf/ISO%208528-5%20and%20Generator%20Transient%20Performance_WP.pdf&lt;/a>&lt;/li>
&lt;li>Latitude Media, &lt;em>The data center boom is a diesel generator boom&lt;/em> — &lt;a href="https://www.latitudemedia.com/news/the-data-center-boom-is-a-diesel-generator-boom/">https://www.latitudemedia.com/news/the-data-center-boom-is-a-diesel-generator-boom/&lt;/a>&lt;/li>
&lt;li>Bloom Energy, &lt;em>AI Data Centers&lt;/em> — &lt;a href="https://www.bloomenergy.com/blog/ai-data-centers/">https://www.bloomenergy.com/blog/ai-data-centers/&lt;/a>&lt;/li>
&lt;li>Microsoft Source, &lt;em>Hydrogen fuel cells for datacenters&lt;/em> — &lt;a href="https://news.microsoft.com/source/features/sustainability/hydrogen-datacenters/">https://news.microsoft.com/source/features/sustainability/hydrogen-datacenters/&lt;/a>&lt;/li>
&lt;li>PowerGen Enterprises, &lt;em>Tier 4 Generator Requirements 2026&lt;/em> — &lt;a href="https://powergenenterprises.com/tier-4-generator-requirements-compliance-guide-2026/">https://powergenenterprises.com/tier-4-generator-requirements-compliance-guide-2026/&lt;/a>&lt;/li>
&lt;li>EPA, &lt;em>Specifics about Provisions Related to Stationary Engines&lt;/em> — &lt;a href="https://www.epa.gov/stationary-engines/fact-sheet-specifics-about-provisions-related">https://www.epa.gov/stationary-engines/fact-sheet-specifics-about-provisions-related&lt;/a>&lt;/li>
&lt;li>Earthsafe, &lt;em>The New Logistics of Data Center Fuel Supply&lt;/em> — &lt;a href="https://www.earthsafe.com/the-new-logistics-of-data-center-fuel-supply">https://www.earthsafe.com/the-new-logistics-of-data-center-fuel-supply&lt;/a>&lt;/li>
&lt;li>Generator Source, &lt;em>Fuel Consumption Charts&lt;/em> — &lt;a href="https://generatorsource.com/tools-info/fuel-consumption-charts/">https://generatorsource.com/tools-info/fuel-consumption-charts/&lt;/a>&lt;/li>
&lt;li>Caterpillar, &lt;em>Renewable Liquid Fuels (HVO)&lt;/em> — &lt;a href="https://www.cat.com/en_US/by-industry/electric-power/electric-power-industries/renewable-liquid-fuels.html">https://www.cat.com/en_US/by-industry/electric-power/electric-power-industries/renewable-liquid-fuels.html&lt;/a>&lt;/li>
&lt;li>Generator Source, &lt;em>Paralleling Switchgear Explained&lt;/em> — &lt;a href="https://generatorsource.com/industries-served/data-centers/paralleling-switchgear-explained-how-we-power-hyperscale-data-center-growth/">https://generatorsource.com/industries-served/data-centers/paralleling-switchgear-explained-how-we-power-hyperscale-data-center-growth/&lt;/a>&lt;/li>
&lt;li>MGI EPSS, &lt;em>Understanding NFPA 110 Testing Requirements&lt;/em> — &lt;a href="https://www.mgiepss.com/blog/understanding-nfpa-110-generator-testing-requirements">https://www.mgiepss.com/blog/understanding-nfpa-110-generator-testing-requirements&lt;/a>&lt;/li>
&lt;li>SecondWatt, &lt;em>Data Center Generators 2026: Capacity, Cost, Speed-to-Power&lt;/em> — &lt;a href="https://secondwatt.com/resources/data-center-generators-2026-capacity-cost-speed-to-power">https://secondwatt.com/resources/data-center-generators-2026-capacity-cost-speed-to-power&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Datacenter physical infrastructure (3/4): the switching</title><link>https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-switching/</link><pubDate>Mon, 22 Jun 2026 18:00:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-switching/</guid><description>&lt;p>We already have the power chain &lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-power-chain/">mapped out&lt;/a> and the &lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-generators/">generators&lt;/a> that sustain it when the grid goes away. What is missing is the referee: the component that, at every instant, decides which source (the grid, the generator, path A or path B) feeds each load, and that executes the change from one to the other without the compute noticing. That is the switching, and it is where the battle of the milliseconds is fought.&lt;/p>
&lt;p>Because the problem of transferring load between sources is not deciding &lt;em>whether&lt;/em> to do it, which is easy, but doing it fast enough that the server power supplies never notice the gap. And there the choice of technology is everything.&lt;/p>
&lt;h2 id="the-referee-of-the-chain">The referee of the chain&lt;/h2>
&lt;p>When a source fails or degrades, someone has to move the load to the alternative source without human intervention. That someone is a transfer switch, and there are two very different families of them that live in different places in the hierarchy.&lt;/p>
&lt;p>At the &lt;strong>building level&lt;/strong>, where the choice is between grid and generator, the electromechanical switch reigns: the &lt;strong>ATS&lt;/strong> (Automatic Transfer Switch), or, in large installations, the transfer logic built into the generator paralleling switchgear itself. It is a transfer between sources that are hundreds of metres apart and that may take seconds to become available (the generator has to start), so here switching speed is measured in tens or hundreds of milliseconds.&lt;/p>
&lt;p>&lt;strong>Close to the critical load&lt;/strong>, by contrast, downstream of the UPS, between paths A and B, the solid-state switch governs: the &lt;strong>STS&lt;/strong> (Static Transfer Switch). Here both sources are alive and available, and the aim is to transfer so fast that the load does not flinch. The boundary between &amp;ldquo;utility capacity&amp;rdquo; and &amp;ldquo;IT capacity&amp;rdquo; sits, precisely, around the PDUs and the rack distribution panels, and that is where the STS does its work.&lt;/p>
&lt;h2 id="the-window-that-decides-everything">The window that decides everything&lt;/h2>
&lt;p>To understand why there are two technologies, you have to know the figure that rules: how long a server power supply can go without power before shutting down. The answer, according to the ITIC/CBEMA curves and the IEC 62040-3 standard, is that most enterprise power supplies tolerate a total loss of between 10 and 20 milliseconds before dropping out. That is the window. The whole design of the switching consists of transferring within it, or of having something to cover the gap when you cannot.&lt;/p>
&lt;p>That tolerance is not a manufacturer&amp;rsquo;s whim: the ITIC and CBEMA curves, which define the &amp;ldquo;envelope&amp;rdquo; of voltage disturbances an IT device must withstand without failing, capture the hold-up time provided by the capacitors inside the power supply. For a few milliseconds, those capacitors keep delivering energy even though the input has disappeared; past that margin, the internal voltage collapses and the server reboots. All the engineering of switching revolves around not exhausting that small cushion.&lt;/p>
&lt;p>A grid cycle at 50 Hz lasts 20 ms; at 60 Hz, about 16.7 ms. A switch that takes a whole cycle is already at the limit. That is why the time of an STS is measured in fractions of a cycle: a quarter of a cycle is&lt;/p>
$$t = \frac{1}{4f}$$
&lt;p>that is, about 4.17 ms at 60 Hz. Inside the window, with margin. An electromechanical ATS, by contrast, takes much longer, and there lies the fundamental difference between the two.&lt;/p>
&lt;h2 id="the-ats-robust-and-slow">The ATS: robust and slow&lt;/h2>
&lt;p>The ATS transfers by physically moving the connection. It uses electromechanical contactors or a motorised mechanism that opens one set of contacts while closing the other, like an electrically driven double-throw switch. That mechanism has a consequence: it is slow. A standard open-transition ATS switches in 60 to 200 milliseconds; a fast one, with a stored-energy mechanism, comes down to 50-100 ms. Eaton documents times of the order of 150 ms, some nine cycles. Any of those figures far exceeds the server&amp;rsquo;s tolerance window, and that is why &lt;strong>an ATS, on its own, cannot feed critical IT load without a UPS behind it&lt;/strong> to cover the jump.&lt;/p>
&lt;p>In exchange, the ATS is robust and cheap: it costs of the order of 60-70 % less than an equivalent STS, and its contactors with arc chutes withstand higher fault currents than the semiconductors of an STS of the same size. That is why it is the king of grid↔generator transfer at building level and of non-critical loads (lighting, HVAC, office IT), where a few hundred milliseconds of gap harm nobody. The reference standard for its construction and testing is UL 1008, which defines, among other things, the short-circuit withstand and closing ratings (WCR) according to the upstream protective device.&lt;/p>
&lt;p>The ATS also supports several operating modes designed for different cases: standard open transition, delayed transition (with a programmed delay of half a second to three seconds, intended for motor loads, where reconnecting too fast and out of phase would damage the equipment) and closed transition, which we will see shortly. For an IT load, however, delayed transition is ruled out: that delay is an eternity for a server.&lt;/p>
&lt;p>An important variant is the &lt;strong>bypass-isolation ATS&lt;/strong> (maintenance bypass), which allows the switch to be isolated and maintained or tested while the load keeps being fed by an alternative route. In concurrently maintainable facilities, Tier III and IV, this capability is not optional: without it, maintaining the ATS would force an outage.&lt;/p>
&lt;h2 id="the-sts-fast-and-electronic">The STS: fast and electronic&lt;/h2>
&lt;p>The STS moves nothing. It uses thyristors (SCR), power semiconductors, as switching elements, and transfers the current from one source to another in a quarter of a cycle, 2 to 4 milliseconds, with no moving parts. Its conduction voltage drop is barely 1 or 2 volts and its efficiency is around 99.5-99.9 %. If the two sources are synchronised, it switches in make-before-break mode; if they are not, it does break-before-make in a brief interruption that, depending on the phase angle difference, stays around 4-10 ms, still inside the server&amp;rsquo;s window.&lt;/p>
&lt;p>Its logic is that of a prudent referee: it continuously monitors the magnitude, frequency and phase angle of both sources, and transfers when the active one goes outside the configured thresholds (typically ±10 % of voltage or ±3 Hz), but &lt;strong>only if the alternative is healthy&lt;/strong>. If both sources are out of tolerance, it stays where it is: transferring to a bad source is worse than holding on a degraded one. And after transferring, it waits a configurable delay (from 30 seconds to several minutes) before going back, so as not to enter a back-and-forth cycle.&lt;/p>
&lt;p>The STS is listed under UL 1008S, which distinguishes it from the UL 1008 of the ATS, and it exists at several voltage levels: single-phase at 208 V for rack level, three-phase at 208 V for PDU level and three-phase at 480 V for the bus, as well as medium-voltage versions. Its flagship application is giving &lt;strong>source redundancy to single-corded equipment&lt;/strong>: a server or a network device with only one power inlet can, thanks to an STS, receive power from both paths A and B without needing a second power supply. It is the way to put single-corded equipment into a 2N world.&lt;/p>
&lt;p>Beyond transfer time, there are specifications an architect must look at when choosing an STS: the configurable &lt;strong>retransfer delay&lt;/strong> (from 30 seconds to several minutes) to avoid cycling between sources; the &lt;strong>fault capacity&lt;/strong>, which withstands between 10 and 50 kA for half a cycle or a cycle; and the &lt;strong>integration&lt;/strong> with the management system via Modbus TCP, SNMP and dry contacts, so that switching is observable, something that, as we have repeated throughout this series, is not a luxury but part of reliability. The downside of the STS against the ATS is precisely its lower fault capacity: semiconductors tolerate less short-circuit current than contactors with arc chutes, which in sites with high fault current conditions the choice.&lt;/p>
&lt;p>The high-end STS units of 2025-2026 have also refined details that matter in real installations: switching synchronised to the voltage zero crossing to achieve sub-cycle transfers (under 4 ms), true neutral switching in four-pole units, needed to transfer unbalanced loads safely, which are common in a datacenter, and redundant SCR controllers and drivers so that the STS itself does not introduce a single point of failure. The reliability of a static switch lies not only in the speed of its thyristors, but in the redundancy of the intelligence that decides when to fire them.&lt;/p>
&lt;p>The table sums up the two worlds:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>ATS (electromechanical)&lt;/th>
&lt;th>STS (solid state)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Mechanism&lt;/td>
&lt;td>Contactors / motorised&lt;/td>
&lt;td>Thyristors (SCR)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Transfer time&lt;/td>
&lt;td>60-200 ms&lt;/td>
&lt;td>2-4 ms (¼ cycle)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Inside the server window?&lt;/td>
&lt;td>No (requires UPS)&lt;/td>
&lt;td>Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Typical location&lt;/td>
&lt;td>Grid↔generator, building level&lt;/td>
&lt;td>A/B paths, PDU/rack level&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fault capacity&lt;/td>
&lt;td>High&lt;/td>
&lt;td>Lower (limited by SCR)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Relative cost&lt;/td>
&lt;td>Baseline&lt;/td>
&lt;td>~60-70 % more expensive&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Standard&lt;/td>
&lt;td>UL 1008&lt;/td>
&lt;td>UL 1008S&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="open-or-closed-transition">Open or closed transition&lt;/h2>
&lt;p>There is a second dimension, orthogonal to the previous one, that defines how the change is made: whether the old connection is broken before or after the new one is made.&lt;/p>
&lt;p>&lt;strong>Open transition&lt;/strong> (break-before-make) disconnects from source one, pauses, and connects to source two. It is the natural and safe way when the two sources are not synchronised, because they must not touch each other, but it introduces the 60-200 ms gap of the ATS we already know. Hence it requires UPS backup for critical load.&lt;/p>
&lt;p>&lt;strong>Closed transition&lt;/strong> (make-before-break) does the opposite: it connects the second source before releasing the first, so that the load is never without power. The price is that, for an instant, the two sources are in parallel, and that is only admissible if they are synchronised and if the utility authorises it. The standards bound it: the United States electrical code (NEC 700.5(B)) limits that overlap to less than 100 milliseconds, and requires strict synchronisation conditions to close, with a voltage difference below 5 %, a frequency difference below 0.2 Hz and a phase angle difference of a few degrees. Closed transition is what allows you to &lt;strong>test or return the load when the grid comes back without a single blink&lt;/strong>, a very valuable capability in mission-critical work. And its relative, soft loading or extended parallel transition, holds the parallel for a few seconds to ramp the load from one source to the other smoothly, ideal for the transfer tests that, as we insisted in the previous articles, have to be done without an outage.&lt;/p>
&lt;h2 id="the-sequence-of-a-power-cut-step-by-step">The sequence of a power cut, step by step&lt;/h2>
&lt;p>It is worth stringing the pieces together in the order in which they act when, on an ordinary day, the grid goes away. At instant zero, the utility disappears. The IT load does not notice, because the UPS, which we will see in the last article, was already feeding it through its inverter (in double conversion) or transfers to its batteries in a few milliseconds: that is the ride-through, the bridge. Meanwhile, the control logic detects the grid failure and orders the generators to start. These take up to ten seconds to start and stabilise (NFPA 110, Type 10). When they are ready and synchronised, the paralleling switchgear, or the building ATS, transfers the load from the dead grid to the live generator; since that transfer happens upstream of the UPS, its gap of tens or hundreds of milliseconds is absorbed by the UPS itself without the load noticing. From there on, the generator sustains the facility.&lt;/p>
&lt;p>When the grid comes back, the sequence reverses, and here closed transition shines: if the generator can synchronise with the grid, the system returns the load to the utility without a single blink, ramping it smoothly (soft loading) before shutting down the sets. Throughout this whole dance, the STS units of paths A and B have been doing their work in parallel, at load level, guaranteeing that every single-corded device always had a healthy source. Four components (UPS, generator, transfer switchgear and STS) choreographed so that the compute never knows that, out there, the lights went out.&lt;/p>
&lt;h2 id="the-regulatory-framework">The regulatory framework&lt;/h2>
&lt;p>Switching is heavily regulated because lives depend on it, not just bytes. The United States electrical code classifies systems by criticality: article 700 covers emergency systems (where an outage puts life at risk), 701 the legally required standby systems (which must come online in 60 seconds or less), 702 the optional ones, and 708 critical operations power systems. Each category imposes different requirements on the switch and on its listing. On that basis, UL 1008 governs transfer switches and UL 1008S the static ones, and closed transition is conditional on the interconnection agreement with the utility, because it means, even if for less than 100 ms, connecting your own generation in parallel with the grid. An architect who designs the switching without bearing this regulatory layer in mind is exposed to expensive surprises at the permitting stage.&lt;/p>
&lt;h2 id="synchronising-in-order-to-close">Synchronising in order to close&lt;/h2>
&lt;p>Both closed transition and the generator paralleling we saw in the previous article depend on the same thing: synchronising before closing the breaker. The peaks and troughs of the waveforms of both sources must line up precisely, matching in voltage, frequency and, above all, phase angle, before they are joined, because closing out of synchronism causes currents and mechanical stresses capable of destroying the equipment. The guardian of that operation is the &lt;strong>synchro-check relay&lt;/strong> (ANSI 25), a permissive device that only authorises the breaker to close when the three parameters are within limits. In large facilities, all this intelligence (synchronisation, load sharing, start sequence) lives in the paralleling switchgear governed by a master PLC, which is at once the brain of generation and that of large-scale switching.&lt;/p>
&lt;p>The trend in these controls points to digitalisation and to grid-interactive functions: digital synchronisers with remote monitoring, predictive maintenance and grid-interactive capabilities (frequency regulation, reactive power control, black-start) that turn the datacenter&amp;rsquo;s generation and switching plant into an actor capable of talking to the electrical grid, not just of disconnecting from it. It is the same logic we saw emerging in the generators article with behind-the-meter generation: the boundary between the datacenter and the grid is blurring, and the switching plane is the point where that boundary is managed.&lt;/p>
&lt;h2 id="ab-architecture-and-the-single-point-of-failure">A/B architecture and the single point of failure&lt;/h2>
&lt;p>Let us put the pieces together in the dual-path architecture that runs through this whole series. In a 2N facility there are two complete, independent systems, A and B, each capable of supporting 100 % of the load. A dual-corded server connects to both and manages the transfer itself: here &lt;strong>no STS is needed&lt;/strong>, because the redundancy is in the equipment itself. That is the ideal situation. The STS appears where that redundancy does not exist in the equipment: to give two sources to a single-corded load, or to transfer between two UPS outputs a set of loads that cannot have dual supply.&lt;/p>
&lt;p>The mapping onto the Tier levels is illustrative. Tier II uses an ATS at the generator point and little else. Tier III has two independent paths but only one active at a time, and employs STS units at PDU or rack level to transfer between paths during maintenance. Tier IV keeps both paths active at once; dual cording eliminates the rack STS, but the STS remains present at transfer points between redundant UPS modules and for single-corded loads.&lt;/p>
&lt;p>And here a design warning that connects with the philosophy of the previous articles: &lt;strong>the switch itself can be a single point of failure&lt;/strong>. An STS that serves critical load and fails leaves that load with no alternative; a single UPS upstream of the STS is another weak point. That is why serious designs feed the STS from two independent UPS units, give the STS redundant controllers and drivers plus thermal monitoring, and, as a golden rule, specify a wrap-around maintenance bypass, with mechanical interlocking, for any STS or ATS that serves critical load. Replicating the sources and leaving the switch without redundancy is, once again, solving half the problem.&lt;/p>
&lt;p>The maintenance bypass deserves emphasis because it is what makes possible the concurrent maintainability that defines Tier III and IV. Without it, testing or repairing a switch would mean leaving the load it serves unprotected; with it, the power is routed through an interlocked alternative path while the switch is isolated, tested and returned to service, all without a blink. There is a practical nuance in specifying it: if the two sources of the STS come from the same utility (a dual bus off the same feed), they are naturally synchronised and the STS can do make-before-break; if they are independent, you have to specify explicitly an STS with break-before-make capability, because it will have to transfer between sources that do not share phase. These details, invisible on a block diagram, are what separate a design that works from one that fails at the first real switching operation.&lt;/p>
&lt;h2 id="towards-solid-state">Towards solid state&lt;/h2>
&lt;p>Switching is living through its own revolution, pushed by AI. The corporate move says it all: Schneider Electric bought Vertiv&amp;rsquo;s transfer switch business (ASCO, a reference ATS manufacturer) for 1.25 billion USD, a sign of how strategic this link has become. The market for datacenter ATS and switchgear is projected to go from some 4 billion USD in 2025 to more than 10 billion in 2035.&lt;/p>
&lt;p>The underlying technical novelty is the &lt;strong>solid-state circuit breaker&lt;/strong> (SSCB), enabled by wide-bandgap semiconductors (silicon carbide and gallium nitride). It responds to faults in microseconds, isolating them so fast that the main bus voltage barely sags and the rest of the datacenter keeps computing without noticing. It is protection at the speed AI demands. The segment is attracting capital and innovation strongly: there are dedicated funding rounds to scale next-generation SSCBs for buildings and AI datacenters, and the major power semiconductor manufacturers flag it as one of the key pieces of the transition to 800 V distribution. It is a generational change: moving from protecting with mechanics, contacts that open, to protecting with electronics, which switch without arcing and without wear, finally aligning the speed of protection with that of the load.&lt;/p>
&lt;p>Because that is the challenge that changes everything: &lt;strong>AI loads swing brutally&lt;/strong>. An individual GPU oscillates 50-75 % of its power in milliseconds; at rack level, from 120 to 150 kW; and aggregated at gigawatt scale, system ramps exceed 1000 MW per second, stressing both switching capacity and grid stability. Added to the transition towards 800 V DC distribution, which NVIDIA proposes for its next architectures and which shifts the protection paradigm towards the DC world and SSCBs, the switching of an AI datacenter in 2026 looks less and less like that of five years ago. The referee has to be ever faster.&lt;/p>
&lt;p>Another trend reshaping switching is &lt;strong>integration with batteries and microgrids&lt;/strong>. As storage systems (BESS) enter the chain, to shave peaks, provide grid services or reduce generator hours, the switching plane stops being a simple &amp;ldquo;grid or generator&amp;rdquo; and starts orchestrating several simultaneous sources: grid, on-site generation, batteries and, where they exist, fuel cells. Grid-forming architectures with bidirectional flow can sustain the load without starting the generator for short events, leaving it only for extended outages or low battery state of charge. That multi-source orchestration, in milliseconds and with the intelligence to always pick the healthiest source, is the immediate future of the power chain&amp;rsquo;s referee. One reliability detail that is not minor: all this intelligence has to be protected from itself, giving the controllers redundancy so that the brain of the switching does not become, in its turn, a single point of failure.&lt;/p>
&lt;h2 id="key-takeaways">Key takeaways&lt;/h2>
&lt;p>Switching is the referee that decides, instant by instant, where the power comes from. The master rule is the 10-20 ms window that server power supplies tolerate: the electromechanical ATS (60-200 ms) exceeds it and needs UPS backup, while the solid-state STS (2-4 ms) fits inside it and allows transfers without the load noticing. Closed transition avoids the gap at the price of synchronising and agreeing with the utility; the maintenance bypass guarantees that the switch itself is not a single point of failure; and the AI era, with its load swings and its jump to 800 V DC, is pushing this whole link towards solid state.&lt;/p>
&lt;p>If you had to keep one idea only, it would be this: switching is not about choosing a source, but about doing it within a window of a few milliseconds, with the right technology at each point of the hierarchy, a robust ATS above and a fast STS below, without letting the referee itself become the link that fails. The rest are details, but details that are paid for dearly on the day of the first real switching operation.&lt;/p>
&lt;p>One last component remains, the one that covers the gap the ATS cannot bridge and the one that first absorbs the stress of AI&amp;rsquo;s pulsing loads: the UPS. The &lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-ups-and-ride-through/">fourth and final article&lt;/a> closes the series with the sprinter of the power chain.&lt;/p>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-power-chain/">Datacenter physical infrastructure (1/4): the power chain&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-generators/">Datacenter physical infrastructure (2/4): the generators&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-ups-and-ride-through/">Datacenter physical infrastructure (4/4): the UPS and the ride-through&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>NFM Consulting, &lt;em>Static Transfer Switch vs ATS for Data Centers&lt;/em> — &lt;a href="https://nfmconsulting.com/knowledge/data-center-sts-vs-ats/">https://nfmconsulting.com/knowledge/data-center-sts-vs-ats/&lt;/a>&lt;/li>
&lt;li>Eaton, &lt;em>Automatic Transfer Switch Fundamentals&lt;/em> — &lt;a href="https://www.eaton.com/us/en-us/products/low-voltage-power-distribution-control-systems/automatic-transfer-switches/automatic-transfer-switch-fundamentals.html">https://www.eaton.com/us/en-us/products/low-voltage-power-distribution-control-systems/automatic-transfer-switches/automatic-transfer-switch-fundamentals.html&lt;/a>&lt;/li>
&lt;li>Eaton, &lt;em>Bypass-Isolation Contactor-Type Automatic Transfer Switches&lt;/em> — &lt;a href="https://www.eaton.com/us/en-us/catalog/low-voltage-power-distribution-controls-systems/bypass-isolation-contactor-type-automatic-transfer-switches.html">https://www.eaton.com/us/en-us/catalog/low-voltage-power-distribution-controls-systems/bypass-isolation-contactor-type-automatic-transfer-switches.html&lt;/a>&lt;/li>
&lt;li>LayerZero, &lt;em>Static Transfer Switches&lt;/em> — &lt;a href="https://www.layerzero.com/products/static-transfer-switches/">https://www.layerzero.com/products/static-transfer-switches/&lt;/a>&lt;/li>
&lt;li>ABB, &lt;em>Automatic Transfer Switching for Power Systems in Data Centers (UL 1008)&lt;/em> — &lt;a href="https://search.abb.com/library/Download.aspx?DocumentID=9AKK108468A1350&amp;LanguageCode=en">https://search.abb.com/library/Download.aspx?DocumentID=9AKK108468A1350&amp;LanguageCode=en&lt;/a>&lt;/li>
&lt;li>Consulting-Specifying Engineer, &lt;em>Understanding transfer switch operation&lt;/em> — &lt;a href="https://www.csemag.com/understanding-transfer-switch-operation/">https://www.csemag.com/understanding-transfer-switch-operation/&lt;/a>&lt;/li>
&lt;li>Power-Eng, &lt;em>Keep an Open Mind About Closed Transition&lt;/em> — &lt;a href="https://www.power-eng.com/om/keep-an-open-mind-about-closed-transition/">https://www.power-eng.com/om/keep-an-open-mind-about-closed-transition/&lt;/a>&lt;/li>
&lt;li>ASCO / Schneider, &lt;em>NEC Requirements for Emergency Power Transfer Switching&lt;/em> — &lt;a href="https://cdn2.hubspot.net/hubfs/4333126/Files/Technical%20Information/ASCO/White%20Papers/ATS/ASCO%20national_electrical_code_requirements_for_emergency_power_transfer_switching_147492_0.pdf">https://cdn2.hubspot.net/hubfs/4333126/Files/Technical%20Information/ASCO/White%20Papers/ATS/ASCO%20national_electrical_code_requirements_for_emergency_power_transfer_switching_147492_0.pdf&lt;/a>&lt;/li>
&lt;li>Generator Source, &lt;em>Paralleling Switchgear Explained&lt;/em> — &lt;a href="https://generatorsource.com/industries-served/data-centers/paralleling-switchgear-explained-how-we-power-hyperscale-data-center-growth/">https://generatorsource.com/industries-served/data-centers/paralleling-switchgear-explained-how-we-power-hyperscale-data-center-growth/&lt;/a>&lt;/li>
&lt;li>Socomec, &lt;em>Data Center Redundancy: Definition, Reliability, Best Practices&lt;/em> — &lt;a href="https://www.socomec.us/en-us/solutions/business/data-centers/data-center-redundancy-definition-reliability-best-practices">https://www.socomec.us/en-us/solutions/business/data-centers/data-center-redundancy-definition-reliability-best-practices&lt;/a>&lt;/li>
&lt;li>Data Center Knowledge, &lt;em>Schneider Buys Vertiv&amp;rsquo;s Transfer Switch Business (ASCO) for 1.25B USD&lt;/em> — &lt;a href="https://www.datacenterknowledge.com/business/schneider-buys-vertiv-s-transfer-switch-business-for-1-25b">https://www.datacenterknowledge.com/business/schneider-buys-vertiv-s-transfer-switch-business-for-1-25b&lt;/a>&lt;/li>
&lt;li>NVIDIA Technical Blog, &lt;em>800 V HVDC Architecture for AI Factories&lt;/em> — &lt;a href="https://developer.nvidia.com/blog/nvidia-800-v-hvdc-architecture-will-power-the-next-generation-of-ai-factories/">https://developer.nvidia.com/blog/nvidia-800-v-hvdc-architecture-will-power-the-next-generation-of-ai-factories/&lt;/a>&lt;/li>
&lt;li>arXiv, &lt;em>Operational Risks in Grid Integration of Large Data Center Loads&lt;/em> — &lt;a href="https://arxiv.org/pdf/2510.05437">https://arxiv.org/pdf/2510.05437&lt;/a>&lt;/li>
&lt;li>Uptime Institute, &lt;em>AI to trigger radical overhaul of data center electrification&lt;/em> — &lt;a href="https://intelligence.uptimeinstitute.com/resource/ai-trigger-radical-overhaul-data-center-electrification">https://intelligence.uptimeinstitute.com/resource/ai-trigger-radical-overhaul-data-center-electrification&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Datacenter physical infrastructure (4/4): the UPS and the ride-through</title><link>https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-ups-and-ride-through/</link><pubDate>Mon, 22 Jun 2026 17:00:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-ups-and-ride-through/</guid><description>&lt;p>We close the series with the component we have been promising in every article: the UPS, the uninterruptible power supply. It is the sprinter of the power chain. While the &lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-generators/">generator&lt;/a> is the long-distance runner that sustains the facility for hours and the &lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-switching/">switching&lt;/a> is the referee that decides the source, the UPS covers the most critical instant of all: the seconds that pass between the grid flickering and the generator taking over. Without it, none of the earlier pieces is any use, because the outage would already have brought the load down before the generator managed to start.&lt;/p>
&lt;h2 id="the-ten-second-bridge">The ten-second bridge&lt;/h2>
&lt;p>Let us recall the sequence we saw in the first article. When the grid goes away, the generator has to start, reach its rated speed and voltage and accept the load; NFPA 110, for Level 1 and Type 10 systems, gives it up to 10 seconds for all of that, starting cold, with no preheating. During those 10 seconds, and the few more that the switching takes to transfer, the load cannot be left without power. What sustains it is the UPS.&lt;/p>
&lt;p>That is its primary function: the &lt;em>ride-through&lt;/em>, the bridge. But it is not the only one. An &lt;em>online&lt;/em> UPS also acts as a permanent filter: it isolates the load from grid anomalies (voltage dips, overvoltages, transients, harmonics, frequency variations) and delivers a clean, regenerated waveform at all times. It conditions as much as it backs up. That is why the UPS is the sprinter &lt;em>and&lt;/em> the guardian of the quality of the power that reaches the servers.&lt;/p>
&lt;p>It is worth underlining that the vast majority of UPS &amp;ldquo;interventions&amp;rdquo; are not total grid outages but micro-incidents: voltage dips of a few cycles caused by a switching operation on the grid, the start-up of a large neighbouring load or a distant fault that the utility clears in milliseconds. Those disturbances, too brief for the generator to start, are precisely the ones the UPS absorbs without anyone noticing, and they are hundreds of times more frequent than a real blackout. The UPS therefore works every day even though the grid has never &amp;ldquo;gone away&amp;rdquo;: its value lies not only in the dramatic outage, but in the constant trickle of imperfections it filters out.&lt;/p>
&lt;p>The consequence of this narrow role is counter-intuitive: the UPS has &lt;strong>very little autonomy on purpose&lt;/strong>. Since it only has to cover the start-up of the generator, its batteries are sized for 5 to 15 minutes, not for hours. More would be expensive and useless: the long-distance runner is the generator, and asking the sprinter to run a marathon wastes money and space on batteries that will never be needed.&lt;/p>
&lt;h2 id="the-topologies-vfi-vi-and-vfd">The topologies: VFI, VI and VFD&lt;/h2>
&lt;p>IEC 62040-3 classifies static UPS units by how much they isolate the output from anomalies at the input, and the three classes are worth knowing:&lt;/p>
&lt;p>&lt;strong>VFI&lt;/strong> (&lt;em>Voltage and Frequency Independent&lt;/em>), known as &lt;strong>double-conversion online&lt;/strong>, is the mission-critical standard. Power always passes through two conversions, a rectifier from AC to DC and an inverter from DC to AC, so that the output is entirely independent of whatever happens at the input: the load lives on a waveform built anew. It is the Tier III and IV topology.&lt;/p>
&lt;p>&lt;strong>VI&lt;/strong> (&lt;em>Voltage Independent&lt;/em>), or &lt;strong>line-interactive&lt;/strong>, regulates voltage variations with a transformer or an AVR, but lets the input frequency through. It is more efficient and cheaper, suitable for less demanding loads or edge environments.&lt;/p>
&lt;p>&lt;strong>VFD&lt;/strong> (&lt;em>Voltage and Frequency Dependent&lt;/em>), or &lt;strong>standby/offline&lt;/strong>, regulates nothing in normal operation: the load goes straight to the grid and the UPS only steps in when there is a failure. It is the one in a home computer, not in a datacenter.&lt;/p>
&lt;p>There is also &lt;strong>delta conversion&lt;/strong>, an online topology that routes a good part of the power directly from input to output and processes only the difference, gaining efficiency in steady state while keeping the behaviour of an online unit when a fault occurs.&lt;/p>
&lt;p>The table summarises when to use each one:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Topology&lt;/th>
&lt;th>IEC 62040-3 class&lt;/th>
&lt;th>Isolation&lt;/th>
&lt;th>Typical efficiency&lt;/th>
&lt;th>Use&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Double-conversion online&lt;/td>
&lt;td>VFI&lt;/td>
&lt;td>Total (voltage and frequency)&lt;/td>
&lt;td>97-98.1 %&lt;/td>
&lt;td>Mission critical, Tier III/IV&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Delta conversion&lt;/td>
&lt;td>VFI&lt;/td>
&lt;td>Total under fault&lt;/td>
&lt;td>~98 %&lt;/td>
&lt;td>Mission critical with an efficiency focus&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Line-interactive&lt;/td>
&lt;td>VI&lt;/td>
&lt;td>Voltage only&lt;/td>
&lt;td>High&lt;/td>
&lt;td>Medium loads, edge&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Standby / offline&lt;/td>
&lt;td>VFD&lt;/td>
&lt;td>None in normal operation&lt;/td>
&lt;td>Very high&lt;/td>
&lt;td>Not suitable for a datacenter&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The great historic reproach against double conversion was its efficiency: processing all the energy twice costs losses. But that argument has aged. Equipment from 2025 reaches figures that were once unthinkable: the Riello Multi Power2, with silicon carbide semiconductors, declares up to 98.1 % in double conversion; the Vertiv Liebert APM2, up to 97.5 %; and Schneider&amp;rsquo;s modular range, around 99 % with its high-efficiency modes. The double-conversion penalty, put at around 92 % in older documentation, is history today.&lt;/p>
&lt;h2 id="eco-mode-the-last-point-of-efficiency">Eco-mode: the last point of efficiency&lt;/h2>
&lt;p>Even so, there is one more step. In &lt;strong>eco-mode&lt;/strong> (or high-efficiency mode), the UPS feeds the load directly through the &lt;em>bypass&lt;/em>, without going through the rectifier or the inverter in normal operation, and reserves double conversion for when the grid fails. Efficiency then rises to 98-99 %. In a 2N installation, where there is twice the equipment, that couple of efficiency points translates into a very real saving in energy, and in PUE.&lt;/p>
&lt;p>The classic problem with eco-mode is the instant of the fault: on detecting the anomaly, the UPS has to transfer from &lt;em>bypass&lt;/em> to double conversion, and that change takes between 1 and 16 milliseconds, during which the load is momentarily exposed to the faulty grid. It is the same server tolerance window we saw in the article on switching, and that is why the risk is real though bounded: a typical server rides out those milliseconds, but an unlucky transient, an overcurrent when voltage is restored after a dip, can trip protections. That is why mission-critical operators were historically reluctant. The manufacturers&amp;rsquo; answer has been &lt;strong>advanced eco-mode&lt;/strong>, multi-mode, predictive, with commercial names such as Schneider&amp;rsquo;s eConversion or Vertiv&amp;rsquo;s Dynamic Online, which keeps the Class 1 performance classification (the same as double conversion) while removing a good part of the transfer risk. Operating-cost pressure is pushing its adoption, previously unthinkable on critical loads.&lt;/p>
&lt;h2 id="the-flywheel-backup-without-batteries">The flywheel: backup without batteries&lt;/h2>
&lt;p>Not all ride-through is done with batteries. The &lt;strong>flywheel UPS&lt;/strong> stores energy kinetically: a rotor spins at high speed, from 3,000 to 10,000 revolutions per minute, and its inertia delivers power during the interruption. Its autonomy is 10 to 30 seconds, which seems little until we remember that those are, exactly, the seconds the generator takes to start. To act as a bridge to the generator, it is more than enough.&lt;/p>
&lt;p>Its advantages speak for themselves: with no batteries, there is no battery maintenance, no periodic replacements, no thermal management of a chemical bank and none of the associated risk; it takes up far less space and tolerates a wide temperature range, with an efficiency that reaches 98 %. Its limit is the short autonomy, so it is often combined with batteries in hybrid systems: the flywheel absorbs the short, frequent events (the most numerous ones) and the battery provides the autonomy for the few outages that drag on. This combination, as we shall see, fits the pulsing profile of AI loads particularly well.&lt;/p>
&lt;p>That suitability for AI is no accident. Most grid quality events are extremely brief, voltage dips of a few cycles, and require no autonomy, only an instant response; a flywheel (or, along the same lines, a supercapacitor) handles them without spending a single battery cycle. Since batteries suffer under frequent cycling, discharging the flywheel for the short events and reserving the battery for the long outages extends the life of the chemical bank and reduces its maintenance. The Uptime Institute itself points out that manufacturers are researching flywheels, supercapacitors and advanced chemistries precisely in order to better tolerate the frequent, short, high-power discharges and recharges that AI loads impose. In the AI era, the chain&amp;rsquo;s sprinter also has to be a sprinter that recovers fast.&lt;/p>
&lt;h2 id="batteries-lead-gives-way-to-lithium">Batteries: lead gives way to lithium&lt;/h2>
&lt;p>Where there are batteries, the great transition of 2025-2026 is the one from lead to lithium. VRLA lead-acid batteries, the standard for decades, are giving ground to lithium iron phosphate (LFP) at a notable speed: lithium already takes around 40 % of datacenter backup installations, and up to 55 % among the hyperscalers.&lt;/p>
&lt;p>The reasons are compelling. LFP lithium tolerates a wider thermal range, withstands many more cycles, of the order of 3,000 against the 200-500 of lead, and that extends its service life to 12-15 years against the 3-6 of VRLA. It takes up less space, recharges faster and, despite its higher initial cost, offers a ten-year total cost of ownership around 39 % lower. LFP chemistry is preferred precisely for its thermal stability and its resistance to &lt;em>thermal runaway&lt;/em>, and it always comes accompanied by a battery management system (BMS) watching over it. As an intermediate option, thin plate pure lead (TPPL) persists, which recharges faster than classic VRLA and reaches long lifetimes, attractive in certain cost profiles and at low temperatures.&lt;/p>
&lt;p>There is one figure that connects batteries directly with our world: in Schneider&amp;rsquo;s tests with real hyperscaler profiles, above 110 % load lead batteries have difficulty with high-frequency changes, while lithium handles them without trouble. Put another way, AI&amp;rsquo;s oscillating profile does not merely favour lithium: it almost demands it.&lt;/p>
&lt;p>The move to lithium is not free of considerations. The energy density that makes it attractive is also what obliges it to be treated with respect: although LFP chemistry is much more stable than the NMC of electric vehicles and resists &lt;em>thermal runaway&lt;/em> better, a lithium battery bank of several MWh concentrates a great deal of energy in a small space, which has led to specific fire detection and suppression regulations and to careful design of the room. The BMS is not an accessory: it watches every cell, balances the charge and disconnects on an anomaly, and its reliability is part of the reliability of the UPS. Against this, the appeal of thin plate pure lead (TPPL) as an intermediate step is that it keeps the operational and safety familiarity of lead while cutting back its worst defects. The choice between lithium and lead is, ultimately, not only about cost per kWh: it is about total cost, about space, about safety and about how it fits with the load profile.&lt;/p>
&lt;h2 id="sizing-little-time-unity-power-factor">Sizing: little time, unity power factor&lt;/h2>
&lt;p>Sizing a UPS has two peculiarities. The first, already mentioned, is the &lt;strong>short autonomy&lt;/strong>: since only the start-up of the generator (some 30 seconds) plus its stabilisation (a couple of minutes) has to be covered, a minimum of about 5 minutes is enough, and 10-15 are recommended for margin. Battery autonomy is calculated, in essence, as the stored energy divided by the power demanded:&lt;/p>
$$t_{\text{runtime}} = \frac{E_{\text{battery}}}{P_{\text{load}}}$$
&lt;p>The second peculiarity is the &lt;strong>power factor&lt;/strong>. As we saw in the first article, apparent and active power are related by the power factor, and older UPS units, specified at 0.8, &amp;ldquo;stranded&amp;rdquo; up to a fifth of their rated capacity. Modern datacenter UPS units operate at &lt;strong>unity power factor&lt;/strong>: they deliver all their kVA as useful kW. It is a quiet but important improvement when it comes to calculating how much real load a unit supports. And UPS sizing does not end with itself: the generator, upstream, has to be capable of feeding the UPS load &lt;em>plus&lt;/em> the recharging of its batteries, another piece of coordination that the first article already anticipated.&lt;/p>
&lt;p>An example lands the calculation. To sustain a load of 500 kW for 12 minutes, of the order of 100 kWh of useful energy has to be stored in the batteries (500 kW times 0.2 hours), plus the margins for ageing, depth of discharge and inverter efficiency, which in practice push that figure up considerably. It seems a lot for &amp;ldquo;only&amp;rdquo; 12 minutes, but remember that the short autonomy is deliberate: if the generator has not started in that time, the problem is no longer the UPS but the generator, and that is why both are tested together. The temptation to &amp;ldquo;buy more batteries just in case&amp;rdquo; is usually a bad deal: it costs more, takes up space and does not solve the scenario that really matters, which is getting the long-distance runner started.&lt;/p>
&lt;h2 id="the-modular-architecture">The modular architecture&lt;/h2>
&lt;p>The way a UPS is built has changed as much as its chemistry. The &lt;strong>modular UPS&lt;/strong>, with hot-swap power blocks, has displaced the monolithic one because it allows capacity and redundancy to be added incrementally, paying as you grow, and a module to be serviced or replaced without shutting the system down (Schneider calls it &lt;em>Live Swap&lt;/em>). Internally it offers N+1 redundancy: if one module fails, the others take on its load without the system going down.&lt;/p>
&lt;p>At whole-system level, the configurations reproduce the redundancy nomenclature we saw in the first article, applied to the UPS: from &lt;em>capacity&lt;/em> (no redundancy) up to 2N (two independent systems, each capable of 100 %, equivalent to Tier IV availability), by way of parallel redundant (N+1), isolated redundant or &lt;em>catcher&lt;/em> (a standby UPS that picks up the load if another fails) and distributed redundant. In the dual-path architecture, each path A and B has its own UPS, and the STS units we saw in the previous article transfer between their outputs for the loads that need it. All the pieces of the series fit together here.&lt;/p>
&lt;p>It is worth understanding the nuance of each configuration, because it defines cost and behaviour under a fault. &lt;em>Parallel redundant&lt;/em> (N+1) shares the load among several UPS units on a common bus; if one goes down, the others absorb its share, but they all serve the same load, so that a fault on the common bus affects them all. &lt;em>Isolated redundant&lt;/em> or &lt;em>catcher&lt;/em> keeps a standby UPS waiting that &amp;ldquo;catches&amp;rdquo; the load of any main system that fails, an efficient solution when there are several systems to protect with a single backup. &lt;em>2N&lt;/em> is the most robust and the most expensive: two systems that share absolutely nothing, each sized at 100 %, so that not even a bus fault can affect both. The choice, like all redundancy, is a balance between the cost of duplicating and the cost of unavailability, the same calculation that runs through this entire series.&lt;/p>
&lt;p>The market follows this evolution. The recent launches, the new-generation Eaton 93PM with lithium, Schneider&amp;rsquo;s Galaxy VL and VXL ranges, the Riello Multi Power2 with silicon carbide, share three traits: modularity, lithium and efficiencies above 97 % in double conversion. The datacenter UPS market moves, according to analysts, between USD 4 billion and USD 9 billion in 2025 with high-single-digit annual growth, pushed precisely by AI demand.&lt;/p>
&lt;h2 id="the-ai-challenge-loads-that-pulse">The AI challenge: loads that pulse&lt;/h2>
&lt;p>And so we reach the challenge that is rewriting UPS design, and that sums up why this series matters for an inference factory. AI loads are not constant: they &lt;strong>pulse&lt;/strong>. In a training cluster, thousands of GPUs draw power almost in unison, following the steps of the computation, and the power oscillates every one or two seconds. The Uptime Institute&amp;rsquo;s analysis from late 2025 puts numbers on it: in the worst case, the difference between the minimum and the maximum consumption can exceed 100 % at system level, the load doubles in milliseconds, and with the most recent hardware the swings reach 150 %, with overshoots of more than 10 % above specification. In GB200 NVL72 racks, sudden rises from 60-70 kW to more than 150 kW have been observed, above even the 132 kW maximum specification.&lt;/p>
&lt;p>The UPS is the first piece of equipment to take that stress, and if it is not designed for it a load drop can occur. Schneider tested its Galaxy range with real hyperscaler profiles at 40 °C and made it withstand 1 to 100 % with no drops, up to 10 minutes of overload at 125 % and one minute at 150 %. Uptime, for its part, recommends specific mitigations: mixing AI loads with more stable loads and sharing generators to damp the fluctuations; choosing UPS configurations with more capacitance and greater redundancy, even N+2, to absorb the peaks; and leaning on the accelerator&amp;rsquo;s own power-smoothing tools, such as the &lt;em>power smoothing&lt;/em> NVIDIA builds into Blackwell. And manufacturers are researching supercapacitors, advanced chemistries and flywheels precisely because they tolerate the frequent, short, high-power discharges and recharges that characterise AI better than a conventional battery does.&lt;/p>
&lt;p>It is worth pausing on why the UPS is the first one affected. When thousands of GPUs go from their minimum draw to their maximum in a millisecond, someone has to cover that sudden demand instantly, and that someone is the UPS, because neither the grid nor the generator reacts that fast. If the UPS is not designed with enough capacitance and margin, its output voltage sags under the step and can drag the load down with it. That is why the Uptime Institute recommends, for AI loads, configurations with more redundancy, even N+2 instead of N+1, not so much for fault tolerance as for the capacity to absorb the peaks without repeatedly overloading the modules. It is a change of mindset: UPS redundancy stops being sized only against failure and starts being sized against the dynamics of the load as well. And upstream, the generator, which reacts more slowly still, is the link most stressed by these oscillations, which leads to recommendations such as mixing AI loads with stable loads and sharing generation to damp them.&lt;/p>
&lt;p>Density adds another turn of the screw: with racks scaling from 100 kW towards 600 kW and the megawatt under discussion, traditional low-voltage UPS units are reaching their ceiling, and &lt;strong>medium-voltage UPS&lt;/strong> architectures and centralised UPS systems with grid-scale batteries (BESS) are emerging. That convergence between the UPS and grid storage also opens up a new role: the UPS as a resource that provides services to the electricity grid, peak shaving, frequency regulation, reserve, blurring the boundary between datacenter backup and the grid itself. A battery bank that spends 99.9 % of its time waiting for an outage that almost never comes is an expensive, immobile asset; turning it into a resource that shaves consumption peaks or sells reserve to the grid while it is not needed for backup changes its economic equation. Manufacturers such as Vertiv already offer utility-grade storage systems integrated with the datacenter for this dual use. The challenge is that the UPS must never compromise its primary mission, being available for the outage, in order to provide services to the grid; the design has to guarantee that the energy needed for the &lt;em>ride-through&lt;/em> is always held in reserve. It is worth not losing sight, however, of the systemic risks this introduces: during a minor grid fault in Virginia in 2025, several datacenters disconnected at the same time and caused a 1.5 GW drop, a reminder that, at this scale, datacenter physical infrastructure is already critical grid infrastructure.&lt;/p>
&lt;h2 id="takeaways-and-the-close-of-the-series">Takeaways, and the close of the series&lt;/h2>
&lt;p>The UPS is the sprinter that covers the ten-second bridge until the generator starts, and at the same time the guardian that delivers clean power at all times. It is sized with little autonomy on purpose, it is built increasingly modular and with lithium, and it faces a new and formidable challenge: AI&amp;rsquo;s pulsing loads, which turn it into the first line of defence against oscillations that double the load in milliseconds.&lt;/p>
&lt;p>And as in each of the previous articles, the conclusion returns to operations: a UPS is chosen well on its topology and its chemistry, but it earns its keep when, the outage having arrived, it transfers without a flicker. That demands testing the batteries, discharging them for real, measuring their actual autonomy, not trusting the nominal age; rehearsing the transfer coordinated with the generator; and watching every cell with the BMS. A battery bank that nobody has discharged under load is, like the generator that nobody has tested, an unverified promise. The whole power chain, from the utility feed to the chip, is only as strong as its least-tested link.&lt;/p>
&lt;p>With this we close the physical infrastructure series. We began with the complete &lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-power-chain/">power chain&lt;/a>, from the utility feed to the rack; we went on to the &lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-generators/">generators&lt;/a> that sustain the facility when the grid goes away; we looked at the &lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-switching/">switching&lt;/a> that arbitrates between sources; and we finish with the UPS that covers the critical instant. Four links of one and the same chain whose conclusion is always the same: in an inference factory, the GPUs are the expensive, visible asset, but it is the electrical infrastructure, silent, without glamour, measured in megawatts and milliseconds, that decides whether that asset works or shuts down. Designing it well, sizing it with slack for AI&amp;rsquo;s transients and, above all, testing it relentlessly, is what separates a factory that meets its SLA from one that learns the hard way on the day of the first outage.&lt;/p>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-power-chain/">Datacenter physical infrastructure (1/4): the power chain&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-generators/">Datacenter physical infrastructure (2/4): the generators&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/datacenter-physical-infrastructure-switching/">Datacenter physical infrastructure (3/4): the switching&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>EarthSafe / Cummins, &lt;em>The 10-second start — NFPA 110 Type 10&lt;/em> — &lt;a href="https://www.earthsafe.com/sites/default/files/pdf/esrf-cummins-life-safety-gen-10-second-start.pdf">https://www.earthsafe.com/sites/default/files/pdf/esrf-cummins-life-safety-gen-10-second-start.pdf&lt;/a>&lt;/li>
&lt;li>Fuji Electric, &lt;em>Classification of UPS (IEC 62040-3)&lt;/em> — &lt;a href="https://www.india.fujielectric.com/resources/technical-guide/classification-of-ups">https://www.india.fujielectric.com/resources/technical-guide/classification-of-ups&lt;/a>&lt;/li>
&lt;li>DCD, &lt;em>Exploring Static UPS systems&lt;/em> — &lt;a href="https://www.datacenterdynamics.com/en/analysis/exploring-static-ups-systems/">https://www.datacenterdynamics.com/en/analysis/exploring-static-ups-systems/&lt;/a>&lt;/li>
&lt;li>DCD, &lt;em>Riello UPS Modular Multi Power2 raises efficiency&lt;/em> — &lt;a href="https://www.datacenterdynamics.com/en/product-news/riello-upss-modular-multi-power2-raises-efficiency-to-unparalleled-heights/">https://www.datacenterdynamics.com/en/product-news/riello-upss-modular-multi-power2-raises-efficiency-to-unparalleled-heights/&lt;/a>&lt;/li>
&lt;li>Vertiv, &lt;em>Dynamic Online UPS&lt;/em> — &lt;a href="https://www.vertiv.com/en-anz/solutions/dynamic-power/dynamic-online-ups/">https://www.vertiv.com/en-anz/solutions/dynamic-power/dynamic-online-ups/&lt;/a>&lt;/li>
&lt;li>Schneider Electric, &lt;em>eConversion high-efficiency UPS mode&lt;/em> — &lt;a href="https://www.se.com/ww/en/work/products/product-launch/econversion-high-efficiency-ups-mode/">https://www.se.com/ww/en/work/products/product-launch/econversion-high-efficiency-ups-mode/&lt;/a>&lt;/li>
&lt;li>Consulting-Specifying Engineer, &lt;em>Evaluating UPS system efficiency&lt;/em> — &lt;a href="https://www.csemag.com/evaluating-ups-system-efficiency/">https://www.csemag.com/evaluating-ups-system-efficiency/&lt;/a>&lt;/li>
&lt;li>Industrial Monitor Direct, &lt;em>Flywheel UPS vs Battery&lt;/em> — &lt;a href="https://industrialmonitordirect.com/blogs/knowledgebase/resolving-industrial-power-outages-with-flywheel-ups">https://industrialmonitordirect.com/blogs/knowledgebase/resolving-industrial-power-outages-with-flywheel-ups&lt;/a>&lt;/li>
&lt;li>Introl, &lt;em>UPS &amp;amp; Battery Systems for AI Data Centers (2025)&lt;/em> — &lt;a href="https://introl.com/blog/ups-battery-systems-lithium-ion-ai-data-center-2025">https://introl.com/blog/ups-battery-systems-lithium-ion-ai-data-center-2025&lt;/a>&lt;/li>
&lt;li>Vertiv, &lt;em>EnergyCore Lithium-Ion Battery Cabinet&lt;/em> — &lt;a href="https://www.vertiv.com/en-us/products-catalog/critical-power/uninterruptible-power-supplies-ups/vertiv-energycore-lithium-ion-battery-cabinet/">https://www.vertiv.com/en-us/products-catalog/critical-power/uninterruptible-power-supplies-ups/vertiv-energycore-lithium-ion-battery-cabinet/&lt;/a>&lt;/li>
&lt;li>EnerSys, &lt;em>Why Modern Data Centers Need a New Approach to UPS Batteries (TPPL)&lt;/em> — &lt;a href="https://www.enersys.com/en/blog-articles/why-modern-data-centers-need-a-new-approach-to-ups-batteries/">https://www.enersys.com/en/blog-articles/why-modern-data-centers-need-a-new-approach-to-ups-batteries/&lt;/a>&lt;/li>
&lt;li>Schneider Electric, &lt;em>AI-tolerant UPSs: first line of defense&lt;/em> — &lt;a href="https://blog.se.com/datacenter/2025/05/20/ai-tolerant-ups-first-line-defense-data-center-resilience/">https://blog.se.com/datacenter/2025/05/20/ai-tolerant-ups-first-line-defense-data-center-resilience/&lt;/a>&lt;/li>
&lt;li>Schneider Electric, &lt;em>Comparing UPS System Design Configurations (WP)&lt;/em> — &lt;a href="https://download.schneider-electric.com/files?p_Doc_Ref=SPD_SADE-5TPL8X_EN">https://download.schneider-electric.com/files?p_Doc_Ref=SPD_SADE-5TPL8X_EN&lt;/a>&lt;/li>
&lt;li>Uptime Institute, &lt;em>Electrical considerations with large AI compute (2025)&lt;/em> — &lt;a href="https://journal.uptimeinstitute.com/electrical-considerations-with-large-ai-compute/">https://journal.uptimeinstitute.com/electrical-considerations-with-large-ai-compute/&lt;/a>&lt;/li>
&lt;li>Vertiv, &lt;em>EnergyCore Grid utility-grade BESS&lt;/em> — &lt;a href="https://www.vertiv.com/en-us/about/news-and-events/corporate-news/vertiv-launches-utility-grade-energy-storage-system-to-accelerate-data-center-interconnection-and-grid-resilience-in-north-america/">https://www.vertiv.com/en-us/about/news-and-events/corporate-news/vertiv-launches-utility-grade-energy-storage-system-to-accelerate-data-center-interconnection-and-grid-resilience-in-north-america/&lt;/a>&lt;/li>
&lt;li>MarketsandMarkets, &lt;em>Data Center UPS Market&lt;/em> — &lt;a href="https://www.marketsandmarkets.com/PressReleases/data-center-ups.asp">https://www.marketsandmarkets.com/PressReleases/data-center-ups.asp&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Energy in TCO and in regulation: cost, PUE, CSRD and the new European reporting obligation for datacenters</title><link>https://blog.lo0.es/en/posts/energy-in-tco-and-regulation-cost-pue-csrd-eu-datacenter-reporting/</link><pubDate>Tue, 16 Jun 2026 10:00:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/energy-in-tco-and-regulation-cost-pue-csrd-eu-datacenter-reporting/</guid><description>&lt;blockquote>
&lt;p>Notation: amounts in &lt;strong>N €&lt;/strong> or &lt;strong>N USD&lt;/strong>; decimals with a point; thousands separated by a comma. The dollar symbol is not used (it is a formula delimiter). Generic example hardware (4×H100 SXM node, 3.6 kW IT). No real infrastructure.&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>A 4×H100 SXM node at Spanish industrial prices (0.116 €/kWh, PUE 1.54) spends
~5,475 € on energy per year: &lt;strong>6–8 % of total opex&lt;/strong> when staff and maintenance
dominate, but up to &lt;strong>18–22 % of opex&lt;/strong> in clusters with a solar PPA and cheap colocation.
Energy is not the main TCO lever; it is &lt;strong>the only TCO variable that European
regulation requires you to measure, publish and certify&lt;/strong>.&lt;/p>
&lt;p>Since September 2024, every datacenter with IT demand ≥ 500 kW in the EU is obliged
to report PUE, WUE, ERF and REF to the &lt;strong>ReportENER&lt;/strong> database (Delegated Regulation
EU 2024/1364). From August 2027 an &lt;strong>automatic sustainability label&lt;/strong> will be generated
from that data. Companies subject to &lt;strong>CSRD&lt;/strong> have to publish Scope 1, 2 and 3 in their
sustainability report, along with emissions intensity, which turns the
gCO₂/token ratio into a corporate accounting figure, not just an engineering one.&lt;/p>
&lt;hr>
&lt;h2 id="track-context">Track context&lt;/h2>
&lt;p>This article is &lt;strong>C8&lt;/strong> of the energy pillar. The previous ones:&lt;/p>
&lt;ul>
&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 electricity market&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/watt-to-carbon-pue-grid-intensity-gco2-per-token/">C6 — From the watt to carbon: PUE, grid intensity and gCO₂/token&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/levers-fewer-watts-per-token-llm-inference/">C7 — Energy efficiency levers in inference&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>The full TCO model that this article extends is in:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/full-tco-on-premise-gpu-cluster-capex-gpu-hour-break-even/">A8 — Full TCO of an on-premise GPU cluster&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/sovereign-on-premise-vs-hyperscalers-data/">A9 — Sovereign on-premise vs hyperscalers: the data&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>For the context of technical security compliance:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/technical-controls-ens-iso-42001-eu-ai-act-cross-mapping/">Technical controls: ENS, ISO 42001 and the EU AI Act&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="energy-as-a-tco-component">Energy as a TCO component&lt;/h2>
&lt;h3 id="the-reference-model">The reference model&lt;/h3>
&lt;p>The full TCO model of the on-premise cluster is developed in
&lt;a href="https://blog.lo0.es/en/posts/full-tco-on-premise-gpu-cluster-capex-gpu-hour-break-even/">A8&lt;/a>. The reference node:
4×H100 SXM5 80 GB, IT draw ~3.6 kW, 8-node cluster, 3-year amortisation.&lt;/p>
&lt;p>Annual opex per node in the base scenario (8-node cluster, Spain):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Opex item&lt;/th>
&lt;th>€/year per node&lt;/th>
&lt;th>% of total opex&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Staff (0.5 FTE pro rata)&lt;/td>
&lt;td>7,500&lt;/td>
&lt;td>26.8 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Maintenance / support / failures&lt;/td>
&lt;td>9,000&lt;/td>
&lt;td>32.1 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Rack colocation (Spain, high density)&lt;/td>
&lt;td>6,000&lt;/td>
&lt;td>21.4 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Energy (PUE 1.54; 0.116 €/kWh)&lt;/strong>&lt;/td>
&lt;td>&lt;strong>5,475&lt;/strong>&lt;/td>
&lt;td>&lt;strong>19.6 %&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Total opex&lt;/strong>&lt;/td>
&lt;td>&lt;strong>~28,000&lt;/strong>&lt;/td>
&lt;td>100 %&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="the-annual-energy-cost-formula">The annual energy cost formula&lt;/h3>
$$\text{annual energy cost} = P_{\text{IT}} \times \text{PUE} \times 8{,}760\,\text{h} \times p_{\text{kWh}}$$
&lt;p>where \(P_{\text{IT}}\) is the power of the IT equipment (kW), PUE the infrastructure multiplier, and \(p_{\text{kWh}}\) the price of electricity (€/kWh).&lt;/p>
&lt;p>For the reference node:&lt;/p>
$$\text{energy/year} = 3.6\,\text{kW} \times 1.54 \times 8{,}760\,\text{h} \times 0.116\,\frac{\text{EUR}}{\text{kWh}} \approx 5{,}475\,\text{EUR}$$
&lt;h3 id="sensitivity-to-energy-price-and-to-pue">Sensitivity to energy price and to PUE&lt;/h3>
&lt;p>Variation in the price of energy has a &lt;strong>moderate&lt;/strong> impact on total TCO when hardware capex dominates:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Energy price (€/kWh)&lt;/th>
&lt;th>Energy/year (€)&lt;/th>
&lt;th>% opex&lt;/th>
&lt;th>€/GPU-hour (70 % util., base)&lt;/th>
&lt;th>Var. vs base&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>0.034 (Spanish solar PPA Q3 2025)&lt;/td>
&lt;td>1,604&lt;/td>
&lt;td>6.8 %&lt;/td>
&lt;td>3.00&lt;/td>
&lt;td>−12 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>0.116 (Spanish industrial, base)&lt;/td>
&lt;td>5,475&lt;/td>
&lt;td>19.6 %&lt;/td>
&lt;td>3.39&lt;/td>
&lt;td>reference&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>0.160 (European industrial average)&lt;/td>
&lt;td>7,550&lt;/td>
&lt;td>25.4 %&lt;/td>
&lt;td>3.54&lt;/td>
&lt;td>+4 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>0.200 (high tariff, no PPA)&lt;/td>
&lt;td>9,437&lt;/td>
&lt;td>30.2 %&lt;/td>
&lt;td>3.67&lt;/td>
&lt;td>+8 %&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Variation in PUE is also moderate in total TCO but relevant in the absolute cost of energy and in regulatory reporting:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>PUE&lt;/th>
&lt;th>Energy/year (€, 0.116 €/kWh)&lt;/th>
&lt;th>% opex&lt;/th>
&lt;th>€/GPU-hour (70 % util.)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1.15 (liquid cooling)&lt;/td>
&lt;td>2,166&lt;/td>
&lt;td>8.4 %&lt;/td>
&lt;td>3.21&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1.20 (modern datacenter)&lt;/td>
&lt;td>2,259&lt;/td>
&lt;td>8.7 %&lt;/td>
&lt;td>3.23&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1.48 (datacenters &amp;lt;5 years, Uptime 2025)&lt;/td>
&lt;td>3,490&lt;/td>
&lt;td>13.1 %&lt;/td>
&lt;td>3.33&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>1.54 (global average, Uptime 2025)&lt;/strong>&lt;/td>
&lt;td>&lt;strong>5,475&lt;/strong>&lt;/td>
&lt;td>&lt;strong>19.6 %&lt;/strong>&lt;/td>
&lt;td>&lt;strong>3.39&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1.80 (legacy colocation)&lt;/td>
&lt;td>6,400&lt;/td>
&lt;td>23.2 %&lt;/td>
&lt;td>3.47&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The difference between PUE 1.15 and PUE 1.80 in €/GPU-hour is only &lt;strong>+8 %&lt;/strong>, because capex still dominates, but in absolute energy consumed the difference is &lt;strong>×2.96&lt;/strong>: 2,166 € against 6,400 € a year per node. That difference in absolute energy is exactly what the regulatory framework is going to measure, publish and, in the future, classify.&lt;/p>
&lt;h3 id="energy-as-a-fraction-of-total-tco">Energy as a fraction of total TCO&lt;/h3>
&lt;p>Annual TCO per node includes amortised capex + opex:&lt;/p>
$$\text{annual TCO per node} = \frac{\text{capex}}{\text{years}} + \text{annual opex} = 55{,}300\,\text{EUR} + 28{,}000\,\text{EUR} = 83{,}300\,\text{EUR}$$
&lt;p>With these numbers, energy represents:&lt;/p>
$$\frac{5{,}475}{83{,}300} \approx 6.6\,\%\ \text{of the all-in TCO}$$
&lt;p>In the low-opex scenario (solar PPA, own datacenter, no colocation):&lt;/p>
$$\frac{1{,}604}{68{,}300} \approx 2.3\,\%\ \text{of the TCO}$$
&lt;p>In the high-opex scenario (open-market tariff, expensive colocation):&lt;/p>
$$\frac{9{,}437}{130{,}300} \approx 7.2\,\%\ \text{of the TCO}$$
&lt;p>The weight of energy in all-in TCO ranges from 2 % to 7 %. The more capex dominates, the lower the weight of energy. Energy matters more in TCO the longer the amortisation and the lower the relative capex, that is, in scenarios of cheaper hardware or long amortisation periods.&lt;/p>
&lt;div class="diagram" style="max-width:720px;margin:1rem auto;">
&lt;svg viewBox="0 0 720 200" role="img" aria-label="Breakdown of annual TCO per 4xH100 node: amortised capex 66%, staff 9%, maintenance 11%, colocation 7%, energy 7%" xmlns="http://www.w3.org/2000/svg">
&lt;style>.ax{fill:none;stroke:currentColor;stroke-width:1}.br{fill:none;stroke:currentColor;stroke-width:1.4}.ts{font:11px sans-serif;fill:currentColor}.tl{font:bold 12px sans-serif;fill:currentColor}&lt;/style>
&lt;line class="ax" x1="60" y1="20" x2="60" y2="160"/>
&lt;line class="ax" x1="60" y1="160" x2="690" y2="160"/>
&lt;text x="8" y="95" class="ts" transform="rotate(-90 8 95)">EUR/year&lt;/text>
&lt;rect class="br" x="80" y="38" width="60" height="122"/>
&lt;text x="82" y="175" class="ts">Capex/year&lt;/text>
&lt;text x="84" y="32" class="ts">55,300&lt;/text>
&lt;rect class="br" x="190" y="122" width="60" height="38"/>
&lt;text x="192" y="175" class="ts">Staff&lt;/text>
&lt;text x="196" y="116" class="ts">7,500&lt;/text>
&lt;rect class="br" x="300" y="114" width="60" height="46"/>
&lt;text x="302" y="175" class="ts">Maint.&lt;/text>
&lt;text x="308" y="108" class="ts">9,000&lt;/text>
&lt;rect class="br" x="410" y="130" width="60" height="30"/>
&lt;text x="412" y="175" class="ts">Coloc.&lt;/text>
&lt;text x="418" y="124" class="ts">6,000&lt;/text>
&lt;rect class="br" x="520" y="134" width="60" height="26"/>
&lt;text x="522" y="175" class="ts">Energy&lt;/text>
&lt;text x="528" y="128" class="ts">5,475&lt;/text>
&lt;text x="60" y="195" class="ts">Base case: PUE 1.54; 0.116 EUR/kWh; 8-node cluster; 3-yr amort. Energy = 6.6 % of all-in TCO.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;hr>
&lt;h2 id="european-regulatory-framework-2024-2026">European regulatory framework 2024-2026&lt;/h2>
&lt;h3 id="map-of-the-rules">Map of the rules&lt;/h3>
&lt;p>The European framework on datacenters and energy is built from four regulatory layers with different scopes of application, required metrics and effective dates:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Rule&lt;/th>
&lt;th>Legal basis&lt;/th>
&lt;th>Main obligation&lt;/th>
&lt;th>Who it applies to&lt;/th>
&lt;th>From when&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>EED 2023/1791&lt;/strong>, Art. 12&lt;/td>
&lt;td>Directive (EU) 2023/1791&lt;/td>
&lt;td>Annual reporting of energy and sustainability KPIs to an EU database&lt;/td>
&lt;td>Datacenters ≥ 500 kW IT in the EU&lt;/td>
&lt;td>15 Sep. 2024 (1st report)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Delegated Reg. 2024/1364&lt;/strong>&lt;/td>
&lt;td>Art. 33(3) EED&lt;/td>
&lt;td>Specifies KPIs, formats and reporting deadlines (Phase 1 of the assessment scheme)&lt;/td>
&lt;td>Datacenters ≥ 500 kW IT in the EU&lt;/td>
&lt;td>Published 17 May 2024; in force&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>EU rating scheme&lt;/strong> (Phase 2, 2026 draft)&lt;/td>
&lt;td>Art. 33(3) EED&lt;/td>
&lt;td>Automatic sustainability label generated by the ReportENER database&lt;/td>
&lt;td>Datacenters that report under 2024/1364&lt;/td>
&lt;td>Automatic label from 15 Aug. 2027&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>CSRD / ESRS E1&lt;/strong>&lt;/td>
&lt;td>Directive 2022/2464/EU + Delegated Regulation (EU) 2023/2772&lt;/td>
&lt;td>Sustainability report: Scope 1-2-3 emissions, emissions intensity, transition plan&lt;/td>
&lt;td>Large EU companies (&amp;gt;500 employees, from FY 2024); expanding progressively&lt;/td>
&lt;td>Financial years from 1 Jan. 2024 (first reports 2025); listed SMEs from 2026&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>PNIEC 2023-2030&lt;/strong> (Spain)&lt;/td>
&lt;td>National Integrated Energy and Climate Plan&lt;/td>
&lt;td>Energy efficiency 44 %, renewables 81 % in electricity; datacenters included in the target; Royal Decree in progress (consultation Sep. 2025)&lt;/td>
&lt;td>Spain&lt;/td>
&lt;td>2025-2030&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="energy-efficiency-directive-eed-20231791">Energy Efficiency Directive: EED 2023/1791&lt;/h3>
&lt;p>Directive (EU) 2023/1791, published in the OJEU of 20 September 2023 (L 231), recasts the earlier Directive 2012/27/EU. Article 12 introduces for the first time a &lt;strong>reporting obligation specific to datacenters&lt;/strong> at European scale.&lt;/p>
&lt;p>&lt;strong>Threshold of application&lt;/strong>: datacenters with an electrical power demand of installed IT systems ≥ 500 kW. Member States may lower this threshold (Germany lowered it to 300 kW; France to 100 kW).&lt;/p>
&lt;p>&lt;strong>Types of datacenter covered&lt;/strong>: (a) enterprise datacenters, operated by a company solely for its own IT needs; (b) colocation datacenters, where the customer installs and manages its own equipment; (c) co-hosting or multi-tenant datacenters, where the customer accesses shared infrastructure.&lt;/p>
&lt;p>&lt;strong>What must be reported&lt;/strong>: 18 key performance indicators (KPIs) that include installed IT demand, total energy consumption, water consumption, reused waste heat, renewable energy consumed, and the four sustainability indicators: PUE, WUE, ERF and REF.&lt;/p>
&lt;p>&lt;strong>Deadlines&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>First report (2023 data): before 15 September 2024.&lt;/li>
&lt;li>Second report (2024 data): before 15 May 2025.&lt;/li>
&lt;li>Subsequent annual reports: before 15 May each year.&lt;/li>
&lt;/ul>
&lt;h3 id="delegated-regulation-eu-20241364">Delegated Regulation (EU) 2024/1364&lt;/h3>
&lt;p>Commission Delegated Regulation (EU) 2024/1364 of 14 March 2024 (OJEU L, 17 May 2024) constitutes &lt;strong>Phase 1&lt;/strong> of establishing the Union&amp;rsquo;s common assessment regime for datacenters. It specifies:&lt;/p>
&lt;ul>
&lt;li>The performance indicators and the information that operators must report to the European &lt;strong>ReportENER&lt;/strong> database.&lt;/li>
&lt;li>The calculation formulas for the four sustainability KPIs (PUE, WUE, ERF, REF).&lt;/li>
&lt;li>The reporting format and the classification categories by datacenter type and size.&lt;/li>
&lt;/ul>
&lt;p>The Commission has made the &lt;strong>ReportENER&lt;/strong> database available as the single entry point for reporting, or via the equivalent national systems of each Member State.&lt;/p>
&lt;h3 id="phase-2-rating-scheme-and-sustainability-label">Phase 2: rating scheme and sustainability label&lt;/h3>
&lt;p>In March 2026 the European Commission published the public consultation on the draft &lt;strong>second Delegated Regulation&lt;/strong> on the datacenter sustainability rating regime, Phase 2 of the scheme. The consultation was open until 23 April 2026.&lt;/p>
&lt;p>The draft establishes that the ReportENER database &lt;strong>will automatically generate an electronic sustainability label&lt;/strong> for every datacenter that has reported under Regulation 2024/1364. The label will show:&lt;/p>
&lt;ul>
&lt;li>PUE and WUE classes based on indices calculated under Annex I of the draft.&lt;/li>
&lt;li>REF (renewable energy factor) and ERF (energy reuse factor).&lt;/li>
&lt;li>Information on grid functions (demand response capability).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Date of first issue of labels&lt;/strong>: 15 August 2027, and every year thereafter.&lt;/p>
&lt;p>The draft also introduces amendments to Regulation 2024/1364, among them: the possibility of voluntary reporting for datacenters &amp;lt;500 kW, the removal of data traffic indicators from the list of mandatory KPIs, and the relaxation of reporting obligations for colocation operators (reflecting the difficulty of obtaining tenant data for confidentiality reasons).&lt;/p>
&lt;p>The Commission&amp;rsquo;s technical report of October 2025 anticipates that the &lt;strong>minimum performance standards (MPS)&lt;/strong> will be finalised between late 2027 and early 2028, and that they will progressively become mandatory for new builds and significant refurbishments.&lt;/p>
&lt;h3 id="csrd-and-esrs-e1-corporate-emissions-reporting">CSRD and ESRS E1: corporate emissions reporting&lt;/h3>
&lt;p>The &lt;strong>Corporate Sustainability Reporting Directive&lt;/strong> (CSRD, Directive 2022/2464/EU) requires companies in scope to publish a sustainability report drawn up under the &lt;strong>European Sustainability Reporting Standards&lt;/strong> (ESRS). The &lt;strong>ESRS E1&lt;/strong> standard covers climate change.&lt;/p>
&lt;p>&lt;strong>Temporal scope of application&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>Large companies (&amp;gt;500 employees, already subject to NFRD): financial year 2024 data, report published in 2025.&lt;/li>
&lt;li>Other large companies (&amp;gt;250 employees or &amp;gt;40 M € turnover or &amp;gt;20 M € balance sheet): financial year 2025 data, report in 2026.&lt;/li>
&lt;li>Listed SMEs: financial year 2026 data, report in 2027 (with the possibility of an extension).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>What ESRS E1 requires in relation to datacenters and energy&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>E1-4&lt;/strong>: GHG emission reduction targets in absolute value and in intensity (e.g. gCO₂eq per unit of product or service).&lt;/li>
&lt;li>&lt;strong>E1-5&lt;/strong>: Energy consumption and mix (renewable vs non-renewable energy, energy intensity).&lt;/li>
&lt;li>&lt;strong>E1-6&lt;/strong>: Gross GHG emissions Scope 1, Scope 2 (location-based and market-based) and Scope 3, without netting off offsets; emissions intensity.&lt;/li>
&lt;li>&lt;strong>E1-7&lt;/strong>: Removals and carbon projects (relevant for offsets that do not replace reduction).&lt;/li>
&lt;/ul>
&lt;p>The amended version of ESRS E1 (EFRAG Exposure Draft of July 2025, submitted to the European Commission in November 2025) expands the disclosure requirements from 9 to 11 and is expected to apply from January 2027.&lt;/p>
&lt;p>&lt;strong>Relevance for datacenter operators&lt;/strong>: a company that runs an on-premise GPU cluster for its own AI workloads has those datacenters within the perimeter of its Scope 1 (if it has its own generators) and Scope 2 (purchased electricity). If it contracts cloud services or colocation, those datacenters fall into its Scope 3 (category 1 or 11 under the GHG Protocol).&lt;/p>
&lt;h3 id="spain-pniec-context-and-the-royal-decree-in-progress">Spain: PNIEC context and the Royal Decree in progress&lt;/h3>
&lt;p>Spain&amp;rsquo;s &lt;strong>National Integrated Energy and Climate Plan (PNIEC) 2023-2030&lt;/strong>, updated in September 2024 (MITECO), sets targets of 81 % renewables in electricity and 44 % energy efficiency for 2030. Datacenters are included among the sectors under intensive efficiency monitoring.&lt;/p>
&lt;p>In August-September 2025, MITECO opened the public consultation on the draft &lt;strong>Royal Decree regulating the energy efficiency and sustainability of datacenters&lt;/strong>, transposing it from Art. 12 of EED 2023/1791. The Royal Decree introduces additional requirements for datacenters with total installed rated power above &lt;strong>1 MW&lt;/strong>: an obligation to use the waste heat generated to supply climate control services or other heat applications.&lt;/p>
&lt;p>The deadline for incorporating Art. 12 of the EED expired on 11 October 2025. The Royal Decree is awaiting the opinion of the Council of State.&lt;/p>
&lt;hr>
&lt;h2 id="regulatory-metrics-definitions-and-formulas">Regulatory metrics: definitions and formulas&lt;/h2>
&lt;h3 id="pue--power-usage-effectiveness">PUE — Power Usage Effectiveness&lt;/h3>
&lt;p>Defined in &lt;strong>ISO/IEC 30134-2:2018&lt;/strong> (European equivalent EN 50600-4-2). It is the central metric of the regulatory framework:&lt;/p>
$$\text{PUE} = \frac{E_{\text{DC}}}{E_{\text{IT}}}$$
&lt;p>where \(E_{\text{DC}}\) is the total energy consumed by the datacenter (including cooling, electrical distribution, lighting and losses) and \(E_{\text{IT}}\) is the energy consumed by the IT equipment (servers, storage, network).&lt;/p>
&lt;ul>
&lt;li>PUE = 1.0: theoretical perfection (all the energy goes to compute).&lt;/li>
&lt;li>PUE = 1.54: 2025 global average (Uptime Institute, 15th annual survey).&lt;/li>
&lt;li>PUE = 1.10–1.15: hyperscaler range.&lt;/li>
&lt;li>PUE ≥ 1.80: legacy, unoptimised facilities.&lt;/li>
&lt;/ul>
&lt;p>Regulation 2024/1364 requires annual PUE to be measured and reported. The Phase 2 draft introduces &lt;strong>PUE classes&lt;/strong> (A to D or similar) for the sustainability label.&lt;/p>
&lt;h3 id="wue--water-usage-effectiveness">WUE — Water Usage Effectiveness&lt;/h3>
&lt;p>Defined in &lt;strong>ISO/IEC 30134-9:2022&lt;/strong>:&lt;/p>
$$\text{WUE} = \frac{W_{\text{in}}}{E_{\text{IT}}}$$
&lt;p>where \(W_{\text{in}}\) is the datacenter&amp;rsquo;s total water consumption (m³), and the result is expressed in m³/MWh. ReportENER data (2024-2025) shows EU average values between 0.07 and 1.28 m³/MWh depending on Member State, with an EU average of ~0.58 m³/MWh.&lt;/p>
&lt;p>WUE is particularly relevant in water-stressed regions, such as southern and inland Spain, where evaporative cooling consumes drinking water.&lt;/p>
&lt;h3 id="erf--energy-reuse-factor">ERF — Energy Reuse Factor&lt;/h3>
&lt;p>Defined in &lt;strong>ISO/IEC 30134-6:2021&lt;/strong>:&lt;/p>
$$\text{ERF} = \frac{E_{\text{reuse}}}{E_{\text{DC}}}$$
&lt;p>where \(E_{\text{reuse}}\) is the energy (waste heat) exported and reused outside the datacenter (e.g. district heating networks, industrial processes). ERF varies between 0 (no reuse) and 1 (all the energy reused, theoretically). The Phase 2 draft proposes minimum ERF thresholds for new facilities.&lt;/p>
&lt;h3 id="ref--renewable-energy-factor">REF — Renewable Energy Factor&lt;/h3>
$$\text{REF} = \frac{E_{\text{res,tot}}}{E_{\text{DC}}}$$
&lt;p>where \(E_{\text{res,tot}}\) is the total renewable energy consumed (own generation + PPAs + Guarantees of Origin), divided by the datacenter&amp;rsquo;s total consumption. The Commission&amp;rsquo;s proposal points to targets of 75–100 % REF by 2030.&lt;/p>
&lt;h3 id="cue--carbon-usage-effectiveness">CUE — Carbon Usage Effectiveness&lt;/h3>
&lt;p>Defined in &lt;strong>ISO/IEC 30134-8:2022&lt;/strong>. Not included in the reporting obligation of Regulation 2024/1364, but identified as a future KPI in the Commission&amp;rsquo;s technical report (Oct. 2025):&lt;/p>
$$\text{CUE} = \frac{G_{\text{DC}}}{E_{\text{IT}}}$$
&lt;p>where \(G_{\text{DC}}\) is the datacenter&amp;rsquo;s total GHG emissions (gCO₂eq) and the result is expressed in gCO₂eq/kWh IT. It is equivalent to the product \(\text{PUE} \times I_{\text{grid}}\) when only location-based Scope 2 emissions are considered.&lt;/p>
&lt;hr>
&lt;h2 id="master-table-rule--what-it-requires--metricthreshold--date">Master table: rule × what it requires × metric/threshold × date&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Rule&lt;/th>
&lt;th>What it requires&lt;/th>
&lt;th>Metrics / thresholds&lt;/th>
&lt;th>Date of application&lt;/th>
&lt;th>To whom&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>EED 2023/1791, Art. 12&lt;/td>
&lt;td>Annual reporting of KPIs to an EU database (ReportENER)&lt;/td>
&lt;td>PUE, WUE, ERF, REF + 14 additional KPIs (energy, water, waste heat, renewables)&lt;/td>
&lt;td>15 Sep. 2024 (1st report, 2023 data); 15 May annually from 2025&lt;/td>
&lt;td>Datacenters ≥ 500 kW IT in the EU&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Delegated Reg. (EU) 2024/1364&lt;/td>
&lt;td>Technical specification of KPIs and reporting format (Phase 1 of the scheme)&lt;/td>
&lt;td>PUE = E DC/E IT; WUE = W in/E IT; ERF = E reuse/E DC; REF = E res/E DC&lt;/td>
&lt;td>In force since 17 May 2024&lt;/td>
&lt;td>Datacenters ≥ 500 kW IT in the EU&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>EU rating scheme, Phase 2 (2026 draft)&lt;/td>
&lt;td>Automatic electronic sustainability label with PUE and WUE classes&lt;/td>
&lt;td>PUE and WUE classes A-D (thresholds in Annex I of the draft; pending final adoption)&lt;/td>
&lt;td>Automatic labels from 15 Aug. 2027&lt;/td>
&lt;td>Datacenters that have reported under 2024/1364&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Minimum performance standards (MPS, expected 2027-2028)&lt;/td>
&lt;td>Mandatory minimum PUE, REF and ERF thresholds for new builds and refurbishments&lt;/td>
&lt;td>PUE targets differentiated by climate and size; REF ≥ 75-100 % by 2030; minimum ERF for new facilities&lt;/td>
&lt;td>Finalisation expected 2027-2028; progressively mandatory&lt;/td>
&lt;td>New and refurbished datacenters&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CSRD / ESRS E1&lt;/td>
&lt;td>Sustainability report: GHG emissions Scope 1, 2 (location- and market-based) and 3; emissions intensity; transition plan&lt;/td>
&lt;td>Scope 1+2+3 mandatory in tCO₂eq; intensity in gCO₂eq/functional unit&lt;/td>
&lt;td>Data from 1 Jan. 2024 (&amp;gt;500 employees); from 1 Jan. 2025 (&amp;gt;250 employees)&lt;/td>
&lt;td>Large EU companies subject to CSRD&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>PNIEC 2023-2030 / Spanish Royal Decree (in progress)&lt;/td>
&lt;td>Energy efficiency and sustainability of datacenters; obligation to use waste heat&lt;/td>
&lt;td>Renewables target 81 % by 2030; datacenters ≥ 1 MW: waste heat for climate control or other applications&lt;/td>
&lt;td>Royal Decree pending approval (consultation Sep. 2025)&lt;/td>
&lt;td>Datacenters in Spain&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="how-whtoken-and-gcotoken-connect-with-the-required-reporting">How Wh/token and gCO₂/token connect with the required reporting&lt;/h2>
&lt;h3 id="the-conversion-chain">The conversion chain&lt;/h3>
&lt;p>The technical inference efficiency figure, J/token or Wh/token, measured with tools such as DCGM, NVML or nvidia-smi, becomes a regulatory reporting figure through the following chain:&lt;/p>
$$E_{\text{token}} = \frac{P_{\text{IT}}}{T} \quad \text{[Wh/tok]}$$
$$E_{\text{DC/token}} = E_{\text{token}} \times \text{PUE} \quad \text{[Wh/tok adjusted to the datacenter]}$$
$$\text{gCO}_{2}\text{/token} = E_{\text{DC/token}} \times I_{\text{grid}} \quad \text{[gCO}_2\text{eq/tok]}$$
&lt;p>where \(T\) is throughput (tok/s), \(P_{\text{IT}}\) the power of the IT node, and \(I_{\text{grid}}\) the carbon intensity of the grid (gCO₂eq/kWh). The full methodology is in &lt;a href="https://blog.lo0.es/en/posts/watt-to-carbon-pue-grid-intensity-gco2-per-token/">C6&lt;/a>.&lt;/p>
&lt;p>For the reference node (4×H100 SXM, \(P_{\text{IT}} = 3.6\,\text{kW}\), indicative throughput 1,000 tok/s, PUE 1.54):&lt;/p>
$$E_{\text{DC/token}} = \frac{3.6\,\text{kW} \times 1.54}{1{,}000\,\text{tok/s}} = 5.544\,\text{J/tok} = 1.54 \times 10^{-3}\,\text{Wh/tok}$$
&lt;h3 id="from-whtoken-to-the-regulatory-kpi-aggregation">From Wh/token to the regulatory KPI: aggregation&lt;/h3>
&lt;p>What regulatory reporting (Regulation 2024/1364) requires is not per-token ratios but &lt;strong>annual totals&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>\(E_{\text{IT}}\): total energy of the IT equipment over the year (kWh).&lt;/li>
&lt;li>\(E_{\text{DC}}\): total datacenter energy over the year (kWh), including cooling and distribution.&lt;/li>
&lt;li>\(W_{\text{in}}\): total water consumption (m³).&lt;/li>
&lt;li>\(E_{\text{reuse}}\): energy (waste heat) exported and reused (kWh).&lt;/li>
&lt;li>\(E_{\text{res,tot}}\): renewable energy consumed (kWh).&lt;/li>
&lt;/ul>
&lt;p>The four sustainability KPIs are calculated from those totals. The link between the per-token ratio and regulatory reporting is:&lt;/p>
$$E_{\text{IT,annual}} = \sum_{\text{inferences}} E_{\text{token}} \times N_{\text{tokens}} + E_{\text{idle}} \quad \text{[kWh/year]}$$
&lt;p>The \(E_{\text{token}}\) figure is needed in order to attribute total IT consumption to inference workloads (vs idle, vs fine-tuning), which allows the &lt;strong>energy intensity of inference&lt;/strong> to be calculated as a fraction of the datacenter&amp;rsquo;s total consumption, a figure relevant to ESRS E1 reporting of emissions intensity.&lt;/p>
&lt;h3 id="from-whtoken-to-gcotoken-as-a-csrd-accounting-figure">From Wh/token to gCO₂/token as a CSRD accounting figure&lt;/h3>
&lt;p>Under &lt;strong>ESRS E1-6&lt;/strong>, companies subject to CSRD must report GHG emissions with &lt;strong>intensity per functional unit&lt;/strong> (E1-4). For a company running an on-premise LLM, the natural functional unit is the token generated, the query answered or the user served (under the Green Software Foundation&amp;rsquo;s SCI specification, ISO/IEC 21031:2022).&lt;/p>
&lt;p>gCO₂/token becomes a corporate accounting figure like this:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Technical measurement&lt;/strong>: J/token per node (DCGM/NVML).&lt;/li>
&lt;li>&lt;strong>PUE adjustment&lt;/strong>: Wh/token at datacenter level = J/token × PUE / 3,600.&lt;/li>
&lt;li>&lt;strong>Carbon intensity&lt;/strong>: gCO₂/token = Wh/token × \(I_{\text{grid}}\) / 1,000.&lt;/li>
&lt;li>&lt;strong>Annual scaling&lt;/strong>: tCO₂eq/year = gCO₂/token × annual N tokens / 10⁶ / 10⁶.&lt;/li>
&lt;li>&lt;strong>ESRS E1-6 reporting&lt;/strong>: location-based Scope 2 emissions (with national annual average \(I_{\text{grid}}\)) and market-based (with \(I_{\text{grid}}\) according to renewable energy contracts), in tCO₂eq/year + intensity in gCO₂eq/token.&lt;/li>
&lt;/ol>
&lt;p>The location-based / market-based distinction from the GHG Protocol Scope 2 Guidance is mandatory under ESRS E1-6: both methods must be reported.&lt;/p>
&lt;h3 id="worked-example-from-jtoken-to-tcoeqyear">Worked example: from J/token to tCO₂eq/year&lt;/h3>
&lt;p>Reference node (4×H100 SXM, PUE 1.54, throughput 1,000 tok/s, 70 % utilisation, Spanish average grid intensity 2024 ~108 gCO₂/kWh):&lt;/p>
$$E_{\text{DC/token}} = 1.54 \times 10^{-3}\,\text{Wh/tok}$$
$$\text{gCO}_{2}\text{/tok} = 1.54 \times 10^{-3} \times 108 \approx 0.166\,\text{gCO}_{2}\text{eq/tok}$$
&lt;p>Tokens generated per year (1,000 tok/s × 70 % util. × 8,760 h × 3,600 s/h):&lt;/p>
$$N_{\text{tokens/year}} = 1{,}000 \times 0.70 \times 8{,}760 \times 3{,}600 \approx 2.2 \times 10^{10}\,\text{tok}$$
&lt;p>Annual location-based Scope 2 emissions per node:&lt;/p>
$$\text{tCO}_{2}\text{eq/year} = \frac{0.166 \times 2.2 \times 10^{10}}{10^{12}} \approx 3.65\,\text{tCO}_{2}\text{eq}$$
&lt;p>For an 8-node cluster: ~29.2 tCO₂eq/year. With a solar PPA (effective intensity ~20 gCO₂/kWh market-based): ~5.4 tCO₂eq/year. The difference between the two methods, location-based vs market-based, is ×5.4, and both have to appear in the CSRD report.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Scenario&lt;/th>
&lt;th>Grid intensity (gCO₂/kWh)&lt;/th>
&lt;th>gCO₂/tok&lt;/th>
&lt;th>tCO₂eq/year (1 node, 70 % util.)&lt;/th>
&lt;th>ESRS method&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Spanish average 2024 (location-based)&lt;/td>
&lt;td>108&lt;/td>
&lt;td>0.166&lt;/td>
&lt;td>3.65&lt;/td>
&lt;td>Location-based mandatory&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Spanish solar PPA (market-based)&lt;/td>
&lt;td>~20&lt;/td>
&lt;td>0.031&lt;/td>
&lt;td>0.68&lt;/td>
&lt;td>Market-based mandatory&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>French average 2025 (location-based)&lt;/td>
&lt;td>19.6&lt;/td>
&lt;td>0.030&lt;/td>
&lt;td>0.66&lt;/td>
&lt;td>Location-based mandatory&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>German average 2025 (location-based)&lt;/td>
&lt;td>328&lt;/td>
&lt;td>0.505&lt;/td>
&lt;td>11.1&lt;/td>
&lt;td>Location-based mandatory&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="the-500-kw-threshold-and-on-premise-ai-datacenters">The 500 kW threshold and on-premise AI datacenters&lt;/h2>
&lt;h3 id="which-datacenters-does-it-affect-in-practice">Which datacenters does it affect in practice?&lt;/h3>
&lt;p>A 4×H100 SXM5 node draws ~3.6 kW IT. The 500 kW IT threshold is equivalent to ~139 nodes of 4×H100 SXM5. For a smaller cluster, the regulatory threshold looks distant.&lt;/p>
&lt;p>There are, however, three routes by which it applies to smaller on-premise AI infrastructure:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Route&lt;/th>
&lt;th>Explanation&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Shared datacenter&lt;/strong>&lt;/td>
&lt;td>If the GPU nodes sit in a larger corporate datacenter that exceeds 500 kW IT in total (not only GPUs), the datacenter as a whole is subject to reporting, and it is the datacenter operator who reports. The end user receives the PUE of its facility.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Threshold lowered by a Member State&lt;/strong>&lt;/td>
&lt;td>France lowered the threshold to 100 kW IT (~28 4×H100 nodes). Germany set it at 300 kW (~83 nodes). In those countries, medium-sized AI clusters are already subject to reporting.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>CSRD independent of the datacenter threshold&lt;/strong>&lt;/td>
&lt;td>The CSRD obligation applies to the company according to its size, not to the datacenter. A company subject to CSRD that operates even a single GPU node is obliged to include the Scope 2 emissions of that node in its sustainability report.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="pue-as-an-operational-figure-and-as-a-regulatory-figure">PUE as an operational figure and as a regulatory figure&lt;/h3>
&lt;p>PUE is simultaneously:&lt;/p>
&lt;ul>
&lt;li>An &lt;strong>operational figure&lt;/strong> for the TCO model (multiplier of energy cost and of gCO₂/token).&lt;/li>
&lt;li>A &lt;strong>regulatory KPI&lt;/strong> subject to mandatory reporting under Regulation 2024/1364.&lt;/li>
&lt;li>A &lt;strong>classification criterion&lt;/strong> in the future Phase 2 sustainability label.&lt;/li>
&lt;/ul>
&lt;p>The reference technical standard for measurement is &lt;strong>ISO/IEC 30134-2:2018&lt;/strong>, which defines four levels of PUE measurement depending on where IT power is measured (from the rack to the incoming transformers). Regulation 2024/1364 specifies that PUE measurement for reporting to ReportENER must follow this standard.&lt;/p>
&lt;p>For a typical on-premise facility, PUE has not historically been measured with the granularity the standard demands. The first compliance step is to &lt;strong>instrument the datacenter&lt;/strong> with power meters at the points specified by ISO/IEC 30134-2.&lt;/p>
&lt;hr>
&lt;h2 id="sensitivity-of-gcotoken-to-pue-and-energy-price">Sensitivity of gCO₂/token to PUE and energy price&lt;/h2>
&lt;p>The following table shows the variation in gCO₂/token for the reference node (4×H100 SXM, 1,000 tok/s, Spain) as a function of PUE and of the energy scenario (which determines the effective carbon intensity):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>PUE&lt;/th>
&lt;th>Grid intensity (gCO₂/kWh)&lt;/th>
&lt;th>gCO₂/1,000 tok&lt;/th>
&lt;th>gCO₂/1M tok&lt;/th>
&lt;th>Var. vs base&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1.15 (liquid, Spain solar)&lt;/td>
&lt;td>50&lt;/td>
&lt;td>0.064&lt;/td>
&lt;td>63.9&lt;/td>
&lt;td>−55 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1.15 (liquid, Spain average)&lt;/td>
&lt;td>108&lt;/td>
&lt;td>0.138&lt;/td>
&lt;td>138.0&lt;/td>
&lt;td>−2 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>1.54 (global average, Spain average)&lt;/strong>&lt;/td>
&lt;td>&lt;strong>108&lt;/strong>&lt;/td>
&lt;td>&lt;strong>0.166&lt;/strong>&lt;/td>
&lt;td>&lt;strong>166.3&lt;/strong>&lt;/td>
&lt;td>reference&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1.54 (global average, Spain night gas)&lt;/td>
&lt;td>220&lt;/td>
&lt;td>0.339&lt;/td>
&lt;td>338.8&lt;/td>
&lt;td>+104 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1.80 (legacy, Spain average)&lt;/td>
&lt;td>108&lt;/td>
&lt;td>0.194&lt;/td>
&lt;td>194.4&lt;/td>
&lt;td>+17 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1.80 (legacy, Spain night gas)&lt;/td>
&lt;td>220&lt;/td>
&lt;td>0.396&lt;/td>
&lt;td>396.0&lt;/td>
&lt;td>+138 %&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Grid intensity has more impact than PUE on gCO₂/token: going from Spanish solar (50 gCO₂/kWh) to Spanish night-time gas (220 gCO₂/kWh) multiplies emissions by ×4.4, while going from PUE 1.15 to 1.80 multiplies them only by ×1.57. The combination of a dirty grid plus a high PUE is the worst: ×6.2 against the base case.&lt;/p>
&lt;p>For &lt;strong>location-based CSRD reporting&lt;/strong>, the intensity used is the &lt;strong>national annual average&lt;/strong> (or regional if more granular data exists), not the hourly figure. For &lt;strong>market-based reporting&lt;/strong>, the effective intensity depends on the energy contract (PPA, Guarantees of Origin). Carbon-aware temporal shifting (moving load to hours of lower intensity) reduces real emissions but &lt;strong>does not directly change location-based reporting&lt;/strong>, which uses the annual grid average.&lt;/p>
&lt;hr>
&lt;h2 id="connection-between-operator-metrics-and-regulator-obligations">Connection between operator metrics and regulator obligations&lt;/h2>
&lt;h3 id="the-map-of-required-data">The map of required data&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Technical figure&lt;/th>
&lt;th>How it is obtained&lt;/th>
&lt;th>Use in TCO&lt;/th>
&lt;th>Use in regulatory reporting&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>\(P_{\text{IT}}\) (W)&lt;/td>
&lt;td>DCGM / NVML / IPMI&lt;/td>
&lt;td>Energy cost formula&lt;/td>
&lt;td>\(E_{\text{IT,annual}}\) for PUE, WUE, ERF, REF&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Throughput (tok/s)&lt;/td>
&lt;td>Engine metrics (vLLM, TGI)&lt;/td>
&lt;td>€/token, Wh/token&lt;/td>
&lt;td>Energy intensity of inference&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>PUE (measured)&lt;/td>
&lt;td>Meters on PDUs and IT equipment (ISO/IEC 30134-2)&lt;/td>
&lt;td>Multiplier in the TCO formula&lt;/td>
&lt;td>Mandatory ReportENER KPI&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Annual \(I_{\text{grid}}\) (gCO₂/kWh)&lt;/td>
&lt;td>REE / MITECO / national factors&lt;/td>
&lt;td>gCO₂/token for carbon-aware&lt;/td>
&lt;td>Emission factor for location-based Scope 2 ESRS E1-6&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hourly \(I_{\text{grid}}\)&lt;/td>
&lt;td>ElectricityMaps / Carbon Aware SDK&lt;/td>
&lt;td>Carbon-aware scheduling&lt;/td>
&lt;td>Location-based Scope 2 with hourly granularity (best practice)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>\(W_{\text{in}}\) (m³)&lt;/td>
&lt;td>Datacenter water meters&lt;/td>
&lt;td>Cost of water (where applicable)&lt;/td>
&lt;td>WUE for ReportENER&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>\(E_{\text{reuse}}\) (kWh)&lt;/td>
&lt;td>Heat export meters&lt;/td>
&lt;td>Possible waste heat revenue&lt;/td>
&lt;td>ERF for ReportENER&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>\(E_{\text{res,tot}}\) (kWh)&lt;/td>
&lt;td>Energy bills with a renewable attribute / GOs&lt;/td>
&lt;td>Energy cost with a PPA&lt;/td>
&lt;td>REF for ReportENER; market-based Scope 2 for ESRS E1-6&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hardware embodied carbon (gCO₂eq)&lt;/td>
&lt;td>Supplier LCA (AWS methodology, where available)&lt;/td>
&lt;td>—&lt;/td>
&lt;td>Scope 3 cat. 1 for ESRS E1-6&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="the-minimum-measurement-system-for-compliance">The minimum measurement system for compliance&lt;/h3>
&lt;p>For an on-premise datacenter subject to the obligations of Regulation 2024/1364 and to CSRD, the minimum measurement system needed is:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>A power meter at the datacenter entry point&lt;/strong> (total datacenter energy, \(E_{\text{DC}}\)).&lt;/li>
&lt;li>&lt;strong>Power meters on the IT racks&lt;/strong> (IT equipment energy, \(E_{\text{IT}}\)): in practice, metered PDUs or the sum of DCGM/NVML measurements.&lt;/li>
&lt;li>&lt;strong>A water meter&lt;/strong> for the datacenter cooling circuit (\(W_{\text{in}}\)).&lt;/li>
&lt;li>&lt;strong>A waste heat export meter&lt;/strong> if the datacenter has a recovery system (\(E_{\text{reuse}}\)).&lt;/li>
&lt;li>&lt;strong>A record of energy bills&lt;/strong> with a breakdown of renewable energy (PPAs, GOs) for calculating REF and market-based Scope 2.&lt;/li>
&lt;/ol>
&lt;p>Without this measurement system, reporting to ReportENER cannot be correct and CSRD reporting lacks the data base it needs.&lt;/p>
&lt;hr>
&lt;h2 id="minimum-performance-standards-the-2027-2028-outlook">Minimum Performance Standards: the 2027-2028 outlook&lt;/h2>
&lt;p>The European Commission&amp;rsquo;s technical report (Assessment, July 2025, published on the EU Op Portal) and EUDCA&amp;rsquo;s monitoring anticipate that the &lt;strong>Minimum Performance Standards (MPS)&lt;/strong> for datacenters will be defined in the 2027-2028 period with the following expected characteristics (not finalised):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>KPI&lt;/th>
&lt;th>MPS proposed for new builds&lt;/th>
&lt;th>MPS proposed for existing facilities&lt;/th>
&lt;th>Horizon&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>PUE&lt;/strong>&lt;/td>
&lt;td>≤ 1.3 (cold climate); ≤ 1.4 (temperate/warm climate)&lt;/td>
&lt;td>Staged targets differentiated by age&lt;/td>
&lt;td>2028+&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>REF&lt;/strong>&lt;/td>
&lt;td>≥ 75 % renewables in 2025; ≥ 100 % by 2030&lt;/td>
&lt;td>Progressive, following the CNDCP roadmap&lt;/td>
&lt;td>2025-2030&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ERF&lt;/strong>&lt;/td>
&lt;td>Minimum threshold for new facilities with usable heat output&lt;/td>
&lt;td>Feasibility assessment requirement&lt;/td>
&lt;td>2028+&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>WUE&lt;/strong>&lt;/td>
&lt;td>No general threshold proposed yet; focus on potable vs non-potable water&lt;/td>
&lt;td>Monitoring and reporting&lt;/td>
&lt;td>2027+&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>These values are indicative and come from the consultation process; the definitive values will appear in the second or third Delegated Regulation adopted under Art. 33(3) of the EED.&lt;/p>
&lt;hr>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/full-tco-on-premise-gpu-cluster-capex-gpu-hour-break-even/">A8 — Full TCO of an on-premise GPU cluster&lt;/a>&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 electricity market&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/watt-to-carbon-pue-grid-intensity-gco2-per-token/">C6 — From the watt to carbon: PUE, grid intensity and gCO₂/token&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/sovereign-on-premise-vs-hyperscalers-data/">A9 — Sovereign on-premise vs hyperscalers: the data&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/technical-controls-ens-iso-42001-eu-ai-act-cross-mapping/">Technical controls: ENS, ISO 42001 and the EU AI Act&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>EUR-Lex · Directiva (UE) 2023/1791 del Parlamento Europeo y del Consejo, de 13 de septiembre de 2023, relativa a la eficiencia energética (EED refundida) — &lt;a href="https://eur-lex.europa.eu/legal-content/ES/TXT/?uri=OJ:JOL_2023_231_R_0001">https://eur-lex.europa.eu/legal-content/ES/TXT/?uri=OJ:JOL_2023_231_R_0001&lt;/a>&lt;/li>
&lt;li>EUR-Lex · Reglamento Delegado (UE) 2024/1364 de la Comisión, de 14 de marzo de 2024, relativo a la primera fase del establecimiento de un régimen de evaluación común de la Unión para centros de datos — &lt;a href="https://eur-lex.europa.eu/eli/reg_del/2024/1364/oj/eng">https://eur-lex.europa.eu/eli/reg_del/2024/1364/oj/eng&lt;/a>&lt;/li>
&lt;li>BOE / DOUE · Texto en español del Reglamento Delegado (UE) 2024/1364 — &lt;a href="https://www.boe.es/buscar/doc.php?id=DOUE-L-2024-80715">https://www.boe.es/buscar/doc.php?id=DOUE-L-2024-80715&lt;/a>&lt;/li>
&lt;li>Comisión Europea · Commission adopts EU-wide scheme rating sustainability of data centres (15 mar. 2024) — &lt;a href="https://energy.ec.europa.eu/news/commission-adopts-eu-wide-scheme-rating-sustainability-data-centres-2024-03-15_en">https://energy.ec.europa.eu/news/commission-adopts-eu-wide-scheme-rating-sustainability-data-centres-2024-03-15_en&lt;/a>&lt;/li>
&lt;li>Comisión Europea · Rating scheme for data centres in the EU: Commission launches call for feedback (26 mar. 2026) — &lt;a href="https://energy.ec.europa.eu/news/rating-scheme-data-centres-eu-commission-launches-call-feedback-2026-03-27_en">https://energy.ec.europa.eu/news/rating-scheme-data-centres-eu-commission-launches-call-feedback-2026-03-27_en&lt;/a>&lt;/li>
&lt;li>DLA Piper · EU Commission proposes new data centre sustainability rating label (20 abr. 2026) — &lt;a href="https://www.dlapiper.com/en-us/insights/blogs/environment-health-safety-and-product-compliance/2026/eu-commission-proposes-new-data-centre-sustainability-rating-label">https://www.dlapiper.com/en-us/insights/blogs/environment-health-safety-and-product-compliance/2026/eu-commission-proposes-new-data-centre-sustainability-rating-label&lt;/a>&lt;/li>
&lt;li>RE24 Energy · What EU New Data Centre Rating Scheme Means for Operators (dic. 2025) — &lt;a href="https://re24.energy/blog-what-eu-new-data-centre-rating-scheme-means/">https://re24.energy/blog-what-eu-new-data-centre-rating-scheme-means/&lt;/a>&lt;/li>
&lt;li>Comisión Europea · Assessment of next steps to promote the energy performance and sustainability of data centres in the EU (2nd Technical Report, jul. 2025) — &lt;a href="https://op.europa.eu/o/opportal-service/download-handler?identifier=83be4c3e-5c79-11f0-a9d0-01aa75ed71a1&amp;format=PDF&amp;language=en&amp;productionSystem=cellar">https://op.europa.eu/o/opportal-service/download-handler?identifier=83be4c3e-5c79-11f0-a9d0-01aa75ed71a1&amp;format=PDF&amp;language=en&amp;productionSystem=cellar&lt;/a>&lt;/li>
&lt;li>Comisión Europea · Assessment of next steps — October 2025 follow-up — &lt;a href="https://op.europa.eu/o/opportal-service/download-handler?identifier=29aa14ed-a4ba-11f0-a7c5-01aa75ed71a1&amp;format=PDF&amp;language=en&amp;productionSystem=cellar">https://op.europa.eu/o/opportal-service/download-handler?identifier=29aa14ed-a4ba-11f0-a7c5-01aa75ed71a1&amp;format=PDF&amp;language=en&amp;productionSystem=cellar&lt;/a>&lt;/li>
&lt;li>Comisión Europea · Minimum performance standards for EU data centres (preparatory study) — &lt;a href="https://energy.ec.europa.eu/resources/preparatory-studies/minimum-performance-standards-eu-data-centres_en">https://energy.ec.europa.eu/resources/preparatory-studies/minimum-performance-standards-eu-data-centres_en&lt;/a>&lt;/li>
&lt;li>MITECO · Centros de datos: normativa y reporte (España) — &lt;a href="https://www.miteco.gob.es/en/energia/eficiencia/centros-de-datos/normativa.html">https://www.miteco.gob.es/en/energia/eficiencia/centros-de-datos/normativa.html&lt;/a>&lt;/li>
&lt;li>MITECO · PNIEC 2023-2030 (actualización sept. 2024) — &lt;a href="https://www.miteco.gob.es/content/dam/miteco/es/energia/files-1/pniec-2023-2030/PNIEC_2024_240924.pdf">https://www.miteco.gob.es/content/dam/miteco/es/energia/files-1/pniec-2023-2030/PNIEC_2024_240924.pdf&lt;/a>&lt;/li>
&lt;li>Ashurst · Draft Royal Decree regulating energy efficiency and sustainability of data centres in Spain (sept. 2025) — &lt;a href="https://www.ashurst.com/es-es/insights/draft-royal-decree-regulating-energy-efficiency-and-sustainability-of-data-centres-in-spain/">https://www.ashurst.com/es-es/insights/draft-royal-decree-regulating-energy-efficiency-and-sustainability-of-data-centres-in-spain/&lt;/a>&lt;/li>
&lt;li>EFRAG · Amended ESRS E1 Exposure Draft (jul. 2025) — &lt;a href="https://www.efrag.org/sites/default/files/media/document/2025-07/Amended_ESRS_Exposure_Draft_July_2025_ESRS_E1_0.pdf">https://www.efrag.org/sites/default/files/media/document/2025-07/Amended_ESRS_Exposure_Draft_July_2025_ESRS_E1_0.pdf&lt;/a>&lt;/li>
&lt;li>Normative · ESRS E1 Explained: CSRD Climate Disclosure (2026) — &lt;a href="https://normative.io/insight/esrs-e1/">https://normative.io/insight/esrs-e1/&lt;/a>&lt;/li>
&lt;li>CSRD Pro · Reporting Cloud Services and Data Centres for CSRD — &lt;a href="https://www.csrdpro.com/en/report-cloud-services-data-centres-csrd/">https://www.csrdpro.com/en/report-cloud-services-data-centres-csrd/&lt;/a>&lt;/li>
&lt;li>Uptime Institute · Global Data Center Survey 2025 (PUE medio global 1,54) — &lt;a href="https://datacenter.uptimeinstitute.com/rs/711-RIA-145/images/2025.Annual.Survey.Report.pdf">https://datacenter.uptimeinstitute.com/rs/711-RIA-145/images/2025.Annual.Survey.Report.pdf&lt;/a>&lt;/li>
&lt;li>SOCOMEC · Energy Efficiency Directive: Essential Guidelines for Data Center Compliance — &lt;a href="https://emea.socomec.com/en/news/eu-energy-efficiency-directive-what-new-rules-mean-data-centres">https://emea.socomec.com/en/news/eu-energy-efficiency-directive-what-new-rules-mean-data-centres&lt;/a>&lt;/li>
&lt;li>ISO/IEC 30134-2:2018 · Power Usage Effectiveness (PUE) — &lt;a href="https://www.iso.org/standard/63451.html">https://www.iso.org/standard/63451.html&lt;/a>&lt;/li>
&lt;li>ISO/IEC 30134-6:2021 · Energy Reuse Factor (ERF) — &lt;a href="https://www.iso.org/standard/75728.html">https://www.iso.org/standard/75728.html&lt;/a>&lt;/li>
&lt;li>ISO/IEC 30134-8:2022 · Carbon Usage Effectiveness (CUE) — &lt;a href="https://www.iso.org/standard/82562.html">https://www.iso.org/standard/82562.html&lt;/a>&lt;/li>
&lt;li>ISO/IEC 30134-9:2022 · Water Usage Effectiveness (WUE) — &lt;a href="https://www.iso.org/standard/82563.html">https://www.iso.org/standard/82563.html&lt;/a>&lt;/li>
&lt;li>Green Software Foundation · Software Carbon Intensity (SCI) Specification (ISO/IEC 21031:2022) — &lt;a href="https://sci.greensoftware.foundation/">https://sci.greensoftware.foundation/&lt;/a>&lt;/li>
&lt;li>White &amp;amp; Case · Data centres and energy consumption: evolving EU regulatory landscape and outlook for 2026 — &lt;a href="https://www.whitecase.com/insight-alert/data-centres-and-energy-consumption-evolving-eu-regulatory-landscape-and-outlook-2026">https://www.whitecase.com/insight-alert/data-centres-and-energy-consumption-evolving-eu-regulatory-landscape-and-outlook-2026&lt;/a>&lt;/li>
&lt;li>Datacenter Forum · New reporting requirements for data center operators introduced by the Delegated Regulation (EU) 2024/1364 — &lt;a href="https://datacenter-forum.ro/en/new-reporting-requirements-for-data-center-operators-introduced-by-the-delegated-regulation-eu-2024-1364/">https://datacenter-forum.ro/en/new-reporting-requirements-for-data-center-operators-introduced-by-the-delegated-regulation-eu-2024-1364/&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Levers for spending fewer watts per token: a quantified catalogue for LLM inference</title><link>https://blog.lo0.es/en/posts/levers-fewer-watts-per-token-llm-inference/</link><pubDate>Tue, 16 Jun 2026 09:00:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/levers-fewer-watts-per-token-llm-inference/</guid><description>&lt;blockquote>
&lt;p>Notation: amounts in &lt;strong>euros (N €)&lt;/strong>, decimals with a point. The dollar symbol 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>Seven independent levers act on the numerator or the denominator of the identity
\(\text{J/token} = \text{power (W)} / \text{throughput (tok/s)}\). Applied in order of
cost-benefit: &lt;strong>quantisation&lt;/strong> (FP16→FP8) cuts J/token by 30–50% without changing hardware;
&lt;strong>power capping&lt;/strong> to 70% of TDP reduces power by 30% with less than a 10% drop in
throughput on memory-bound loads; &lt;strong>DVFS&lt;/strong> in the decode phase saves a further 22–45%;
&lt;strong>continuous batching&lt;/strong> lowers J/token by 25–40% against unoptimised stacks; &lt;strong>speculative
decoding&lt;/strong> trims up to 29% off J/token at low batch; &lt;strong>prefix caching&lt;/strong> eliminates the
prefill recompute for repeated prompts; and &lt;strong>scheduling to clean hours&lt;/strong> shifts the
carbon footprint without changing physical consumption. Starting reference: a vLLM FP16 stack on an H100
SXM (700 W TDP) with Llama-3 70B produces ~0.39 J/token under realistic batch loads; an
unoptimised stack (PyTorch baseline) starts 2–6× higher. The levers stack; the combined effect
can reach a 73% reduction against the unoptimised baseline
(&lt;a href="https://arxiv.org/pdf/2504.17674">arXiv 2504.17674&lt;/a>).&lt;/p>
&lt;hr>
&lt;h2 id="the-reference-identity">The reference identity&lt;/h2>
$$\text{J/token} = \frac{\overline{P}\ [\text{W}]}{\text{throughput}\ [\text{tok/s}]}$$
&lt;p>where \(\overline{P}\) is the average power over the measurement window (see the methodology in
&lt;a href="https://blog.lo0.es/en/posts/energy-per-token-spain-methodology-electricity-market-speculation/">energy per token&lt;/a>). The levers act on one
of the two factors:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>They reduce \(\overline{P}\)&lt;/strong>: power capping, DVFS, scheduling to low-intensity hours.&lt;/li>
&lt;li>&lt;strong>They raise throughput&lt;/strong> (the denominator): quantisation, continuous batching, speculative decoding,
prefix caching, chunked prefill, model selection.&lt;/li>
&lt;li>&lt;strong>Both at once&lt;/strong>: quantisation (smaller weight footprint → a larger batch fits in VRAM → higher
throughput at similar or lower power).&lt;/li>
&lt;/ul>
&lt;p>The expanded formula including infrastructure overhead:&lt;/p>
$$\text{J/token}_{\text{effective}} = \frac{\overline{P}_{\text{GPU}} + \overline{P}_{\text{rest of node}}}{\text{throughput}_{\text{tok/s}}} \times \text{PUE}$$
&lt;p>For the lever calculations the work is done on \(\overline{P}_{\text{GPU}}\) for clarity; the
PUE factor (see &lt;a href="https://blog.lo0.es/en/posts/energy-per-token-spain-methodology-electricity-market-speculation/">energy per token&lt;/a>) amplifies or
attenuates the effect of each lever proportionally.&lt;/p>
&lt;hr>
&lt;h2 id="master-table-levers--impact--cost--tool">Master table: levers × impact × cost × tool&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Lever&lt;/th>
&lt;th>J/token reduction (%)&lt;/th>
&lt;th>Effect on latency&lt;/th>
&lt;th>Effect on quality&lt;/th>
&lt;th>Main OSS tool&lt;/th>
&lt;th>Source&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Quantisation FP16→FP8&lt;/td>
&lt;td>&lt;strong>30–50%&lt;/strong>&lt;/td>
&lt;td>−8–33% TPOT (improvement)&lt;/td>
&lt;td>&amp;lt;1% degradation on benchmarks&lt;/td>
&lt;td>vLLM, TRT-LLM, llm-compressor&lt;/td>
&lt;td>arXiv 2504.17674, baseten.co&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Quantisation FP16→INT4 (AWQ/GPTQ)&lt;/td>
&lt;td>&lt;strong>45–60%&lt;/strong>&lt;/td>
&lt;td>latency improves (lower BW)&lt;/td>
&lt;td>1–3% degradation depending on model&lt;/td>
&lt;td>AutoAWQ, llm-compressor, vLLM&lt;/td>
&lt;td>arXiv 2504.17674&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Continuous vs static batching&lt;/td>
&lt;td>&lt;strong>25–40%&lt;/strong> vs PyTorch&lt;/td>
&lt;td>+5× throughput (improvement)&lt;/td>
&lt;td>no impact&lt;/td>
&lt;td>vLLM, TGI, TRT-LLM&lt;/td>
&lt;td>arXiv 2504.17674, TokenPowerBench&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Power capping 70% TDP&lt;/td>
&lt;td>&lt;strong>20–30%&lt;/strong> power&lt;/td>
&lt;td>&amp;lt;10% throughput (decode)&lt;/td>
&lt;td>no impact&lt;/td>
&lt;td>nvidia-smi, DCGM, Zeus&lt;/td>
&lt;td>arXiv 2604.11391, NERSC docs&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DVFS decode-phase&lt;/td>
&lt;td>&lt;strong>22–45%&lt;/strong> in decode&lt;/td>
&lt;td>1–6% total latency&lt;/td>
&lt;td>no impact&lt;/td>
&lt;td>nvidia-smi, GreenLLM, DVFS-GPT&lt;/td>
&lt;td>arXiv 2501.08219, HAL 05190051&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Speculative decoding&lt;/td>
&lt;td>&lt;strong>up to 29%&lt;/strong> (batch≤16)&lt;/td>
&lt;td>TTFT improves&lt;/td>
&lt;td>no demonstrable impact&lt;/td>
&lt;td>vLLM, TRT-LLM&lt;/td>
&lt;td>arXiv 2602.09113&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Prefix caching&lt;/td>
&lt;td>&lt;strong>50–90%&lt;/strong> on reusable prefill&lt;/td>
&lt;td>TTFT −50–80% (repeated prompts)&lt;/td>
&lt;td>no impact&lt;/td>
&lt;td>vLLM, SGLang&lt;/td>
&lt;td>vLLM docs&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Chunked prefill&lt;/td>
&lt;td>~10–15% on mixed loads&lt;/td>
&lt;td>more stable TTFT&lt;/td>
&lt;td>no impact&lt;/td>
&lt;td>vLLM (SARATHI)&lt;/td>
&lt;td>arXiv 2308.16369&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SLM vs dense LLM selection&lt;/td>
&lt;td>&lt;strong>60–80%&lt;/strong> (7B vs 70B model)&lt;/td>
&lt;td>low latency&lt;/td>
&lt;td>degradation varies by task&lt;/td>
&lt;td>Ollama, vLLM, llama.cpp&lt;/td>
&lt;td>arXiv 2504.17674&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Scheduling to clean hours&lt;/td>
&lt;td>0% J/token, up to −70% CO₂&lt;/td>
&lt;td>no impact on the load&lt;/td>
&lt;td>no impact&lt;/td>
&lt;td>Kueue, Volcano, cron&lt;/td>
&lt;td>ACM SLIT, arXiv 2507.09942&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>Note: the percentages are against the effective J/token of the load, not against idle board
power. The effects are always measured under conditions of equal output quality (same model,
same serving stack, same prompt distribution).&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="lever-1-quantisation">Lever 1: quantisation&lt;/h2>
&lt;h3 id="mechanics">Mechanics&lt;/h3>
&lt;p>Quantisation reduces the numerical precision of the weights (and optionally the activations),
which shortens the time spent reading weights from HBM per generated token. Decode is
memory-bandwidth-bound: the bottleneck is reading the weights, not computing. Reducing bit width
frees bandwidth for higher throughput or allows a larger batch in VRAM.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Format&lt;/th>
&lt;th>Bits/weight&lt;/th>
&lt;th>BW reduction vs FP32&lt;/th>
&lt;th>J/token vs FP16&lt;/th>
&lt;th>Tool&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>FP32&lt;/td>
&lt;td>32&lt;/td>
&lt;td>1× (reference)&lt;/td>
&lt;td>+100% (worse)&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>BF16/FP16&lt;/td>
&lt;td>16&lt;/td>
&lt;td>2×&lt;/td>
&lt;td>reference&lt;/td>
&lt;td>vLLM native&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>FP8 (W8A8)&lt;/td>
&lt;td>8&lt;/td>
&lt;td>~4×&lt;/td>
&lt;td>&lt;strong>−30–50%&lt;/strong>&lt;/td>
&lt;td>vLLM, TRT-LLM, llm-compressor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>INT4 AWQ (W4A16)&lt;/td>
&lt;td>4&lt;/td>
&lt;td>~8×&lt;/td>
&lt;td>&lt;strong>−45–60%&lt;/strong>&lt;/td>
&lt;td>AutoAWQ, llm-compressor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>INT4 GPTQ (W4A16)&lt;/td>
&lt;td>4&lt;/td>
&lt;td>~8×&lt;/td>
&lt;td>&lt;strong>−40–55%&lt;/strong>&lt;/td>
&lt;td>AutoGPTQ, vLLM&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Concrete reference figures:&lt;/p>
&lt;ul>
&lt;li>Llama-3 405B on H100, FP16→FP8: −30% J/token measured; TPOT improves by 33% (Baseten,
&lt;a href="https://www.baseten.co/blog/33-faster-llm-inference-with-fp8-quantization/">baseten.co/blog/33-faster-llm-inference-with-fp8-quantization&lt;/a>).&lt;/li>
&lt;li>The vLLM+CUDA graphs stack vs the PyTorch baseline: 2–6× more efficient in J/token
(&lt;a href="https://arxiv.org/pdf/2504.17674">arXiv 2504.17674&lt;/a>).&lt;/li>
&lt;li>Llama-65B on V100 FP16: 3–4 J/token. Llama-3 70B on H100 FP8: 0.39 J/token. Combined
hardware+quantisation reduction: ~90%
(&lt;a href="https://mlcommons.org/2025/09/mlperf-inference-v5-1-results/">MLCommons, arXiv 2504.17674&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="quality-cost">Quality cost&lt;/h3>
&lt;p>FP8 quantisation with calibration produces &amp;lt;1% degradation on standard benchmarks (MMLU,
HumanEval). INT4 AWQ can produce 1–3% degradation depending on the model and the task;
INT4 GPTQ without fine calibration, up to 2–5%. Validate with &lt;a href="https://blog.lo0.es/en/posts/llm-energy-leaderboards-wh-per-token/">LLM energy leaderboards&lt;/a> and your own quality benchmarks.&lt;/p>
&lt;h3 id="oss-tooling">OSS tooling&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># vLLM with FP8 (load-time quantisation, H100/A100)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vllm serve meta-llama/Llama-3-70B-Instruct &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --quantization fp8 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --dtype auto
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># llm-compressor: offline quantisation to W4A16 (AWQ)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python -m llmcompressor.transformers.compression.helpers &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --model meta-llama/Llama-3-70B-Instruct &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --recipe w4a16_awq.yaml &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --output-dir llama-70b-w4a16/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="lever-2-continuous-batching">Lever 2: continuous batching&lt;/h2>
&lt;h3 id="mechanics-1">Mechanics&lt;/h3>
&lt;p>Static batching keeps the batch fixed: if one request finishes early, the slot stays
empty until the end of the batch. &lt;strong>Continuous batching&lt;/strong> inserts new requests as
soon as a slot frees up, keeping the GPU always at the highest possible utilisation.&lt;/p>
&lt;p>The energy effect: GPU power is almost constant (the GPU is always active); the
throughput grows. The result is a larger denominator at similar power:&lt;/p>
$$\text{J/token}_{\text{continuous batch}} = \frac{\overline{P}}{\text{throughput}_{\uparrow}}$$
&lt;p>Measured figures (&lt;a href="https://arxiv.org/pdf/2504.17674">arXiv 2504.17674&lt;/a>,
&lt;a href="https://arxiv.org/pdf/2512.03024">TokenPowerBench arXiv 2512.03024&lt;/a>):&lt;/p>
&lt;ul>
&lt;li>vLLM with PagedAttention vs unoptimised Transformers: −25–40% J/token on high
batch loads.&lt;/li>
&lt;li>Online continuous batching vs static offline: a further −5% of J/token (small but
consistent).&lt;/li>
&lt;li>Batch 32→256 tokens: −25% J/token on Llama-3 70B (kernel economies of scale).&lt;/li>
&lt;li>Throughput: ×5 against static batching stacks at equivalent load.&lt;/li>
&lt;/ul>
&lt;p>The efficiency knee on the H100 sits at around 256–512 tokens of batch; beyond that,
J/token flattens or rises slightly.&lt;/p>
&lt;h3 id="oss-tooling-1">OSS tooling&lt;/h3>
&lt;p>vLLM, TGI (HuggingFace Text Generation Inference), TRT-LLM. The relevant flag in vLLM:
&lt;code>--max-num-seqs&lt;/code> (maximum concurrent sequences); tuning it to the available VRAM
maximises the effective batch.&lt;/p>
&lt;hr>
&lt;h2 id="lever-3-power-capping">Lever 3: power capping&lt;/h2>
&lt;h3 id="mechanics-2">Mechanics&lt;/h3>
&lt;p>The power cap sets a ceiling on instantaneous power (W). The GPU respects it by cutting the
clock (internal DVFS). The efficiency trick: LLM decode is &lt;strong>memory-bandwidth-bound&lt;/strong>; the
GPU is already not at usefully full clock, and lowering the TDP reduces power without degrading
throughput proportionally.&lt;/p>
&lt;h3 id="the-power-cap-vs-throughput-curve-h100-sxm">The power cap vs throughput curve (H100 SXM)&lt;/h3>
&lt;p>Figures from (&lt;a href="https://arxiv.org/html/2604.11391v1">arXiv 2604.11391&lt;/a>) and NERSC
(&lt;a href="https://docs.nersc.gov/jobs/power-capping/">docs.nersc.gov/jobs/power-capping&lt;/a>):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Power cap (W)&lt;/th>
&lt;th>% of TDP (700 W)&lt;/th>
&lt;th>Relative throughput (memory-bound)&lt;/th>
&lt;th>Efficiency (tok/W)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>700 W&lt;/td>
&lt;td>100%&lt;/td>
&lt;td>100%&lt;/td>
&lt;td>1.00×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>560 W&lt;/td>
&lt;td>80%&lt;/td>
&lt;td>~95%&lt;/td>
&lt;td>~1.19×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>490 W&lt;/strong>&lt;/td>
&lt;td>&lt;strong>70%&lt;/strong>&lt;/td>
&lt;td>&lt;strong>~90–95%&lt;/strong>&lt;/td>
&lt;td>&lt;strong>~1.27×&lt;/strong> (sweet spot)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>420 W&lt;/td>
&lt;td>60%&lt;/td>
&lt;td>~80–85%&lt;/td>
&lt;td>~1.33× (latency rises)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>350 W&lt;/td>
&lt;td>50%&lt;/td>
&lt;td>~75% (the H100 reaches maximum BW at 350 W memory-bound)&lt;/td>
&lt;td>~1.50×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>200 W&lt;/td>
&lt;td>29%&lt;/td>
&lt;td>~50%&lt;/td>
&lt;td>frequency saturation&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Key finding from &lt;a href="https://arxiv.org/html/2604.11391v1">arXiv 2604.11391&lt;/a>: &lt;strong>the H100 reaches
its maximum effective memory bandwidth with only ~350 W&lt;/strong> on memory-bound loads
(STriad benchmark), against a TDP of 700 W. Going from 700 W to 490 W (−30% power) produces
less than a 10% drop in decode throughput: J/token improves by ~20–27%.&lt;/p>
&lt;p>For compute-bound loads (heavy prefill), the sweet spot shifts to 400–500 W, where
performance scales almost linearly with the cap; from 500 W to 700 W, the gain is only
~10% extra throughput for each additional 100 W.&lt;/p>
&lt;h3 id="jtoken-formula-with-a-power-cap">J/token formula with a power cap&lt;/h3>
$$\text{J/token}(P_{\text{cap}}) = \frac{P_{\text{cap}} \times \eta(P_{\text{cap}})}{\text{throughput}_{\text{base}} \times f(P_{\text{cap}})}$$
&lt;p>where \(\eta(P_{\text{cap}})\) is the fraction of power actually consumed under the
cap (on memory-bound loads, the GPU no longer consumes the whole cap), and \(f(P_{\text{cap}})\) is
the resulting fraction of throughput. In the H100&amp;rsquo;s 490–560 W zone,
\(\eta \approx 0{.}9\) and \(f \approx 0{.}92\text{–}0{.}95\): the numerator falls more than the
denominator, so J/token improves.&lt;/p>
&lt;h3 id="commands">Commands&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Set the power cap to 490 W on GPU 0 (H100 SXM, 700 W TDP)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo nvidia-smi -i &lt;span class="m">0&lt;/span> -pl &lt;span class="m">490&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Check the applied limit and the power draw in real time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nvidia-smi --query-gpu&lt;span class="o">=&lt;/span>power.limit,power.draw --format&lt;span class="o">=&lt;/span>csv -l &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># With DCGM: read DCGM_FI_DEV_POWER_USAGE in Prometheus&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># and DCGM_FI_DEV_POWER_LIMIT to confirm the cap is active&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Apply the cap to every GPU on the node (systemd/cron script)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>seq &lt;span class="m">0&lt;/span> 3&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> sudo nvidia-smi -i &lt;span class="nv">$i&lt;/span> -pl &lt;span class="m">490&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>With DCGM in production, the cap can be set via
&lt;code>dcgmi policy --set powercap:490&lt;/code> or through the NVIDIA GPU Operator (the
&lt;code>powerLimit&lt;/code> field in the DevicePlugin). Zeus (&lt;a href="https://ml.energy/zeus/">ml.energy/zeus&lt;/a>)
can sweep caps automatically and measure the resulting J/token per configuration.&lt;/p>
&lt;hr>
&lt;h2 id="lever-4-dvfs-dynamic-voltage-and-frequency-scaling">Lever 4: DVFS (Dynamic Voltage and Frequency Scaling)&lt;/h2>
&lt;h3 id="mechanics-3">Mechanics&lt;/h3>
&lt;p>DVFS is finer-grained than a power cap: it allows the SM frequency to be set directly
(&lt;code>nvidia-smi -lgc&lt;/code> to lock the GPU clock) or left for the driver to adjust dynamically
according to available power and load. In LLM inference, the asymmetry between phases
is the key fact:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Prefill&lt;/strong>: compute-bound. Benefits from maximum clock. Sensitive to frequency reduction.&lt;/li>
&lt;li>&lt;strong>Decode&lt;/strong>: memory-bandwidth-bound. The SM clock barely matters; what rules is
HBM bandwidth.&lt;/li>
&lt;/ul>
&lt;p>This asymmetry is what LLM-specific DVFS systems exploit:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>System&lt;/th>
&lt;th>Energy saving&lt;/th>
&lt;th>Latency penalty&lt;/th>
&lt;th>Hardware&lt;/th>
&lt;th>Source&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>DVFS-GPT (HAL)&lt;/td>
&lt;td>up to &lt;strong>32%&lt;/strong> at iso-latency&lt;/td>
&lt;td>~1–2%&lt;/td>
&lt;td>A100, RTX 4090&lt;/td>
&lt;td>HAL 05190051&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>EcoInfer&lt;/td>
&lt;td>up to &lt;strong>25.4%&lt;/strong> (average 21.5%)&lt;/td>
&lt;td>&amp;lt;5%&lt;/td>
&lt;td>A100&lt;/td>
&lt;td>arXiv MDPI Electronics&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DualScale (disaggregated prefill/decode)&lt;/td>
&lt;td>&lt;strong>22–45%&lt;/strong> with SLO&lt;/td>
&lt;td>1–6%&lt;/td>
&lt;td>H100&lt;/td>
&lt;td>arXiv 2602.18755&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GreenLLM (SLO-aware DVFS)&lt;/td>
&lt;td>&lt;strong>18–30%&lt;/strong>&lt;/td>
&lt;td>within the SLO&lt;/td>
&lt;td>—&lt;/td>
&lt;td>arXiv 2508.16449&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The paper &lt;a href="https://arxiv.org/abs/2501.08219">arXiv 2501.08219&lt;/a> measures that reducing the
GPU frequency from 2,842 MHz to 180 MHz achieves an average saving of 42% with only a 1–6%
latency increase in the decode phase, because decode is memory-bound and the SM
frequency is not the bottleneck.&lt;/p>
&lt;h3 id="commands-manual-dvfs">Commands (manual DVFS)&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Lock the SM clock at 1,200 MHz (H100 boost: 1,980 MHz) for decode&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo nvidia-smi -i &lt;span class="m">0&lt;/span> -lgc 1200,1200
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Restore the dynamic clock&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo nvidia-smi -i &lt;span class="m">0&lt;/span> -rgc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Persistent mode (needed for the lock to survive between jobs)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo nvidia-smi -pm &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For automatic DVFS tuned to the SLO (target TPOT), systems such as GreenLLM or
DVFS-GPT measure the time of each iteration and adjust the frequency in real time, without
overrunning the latency budget.&lt;/p>
&lt;hr>
&lt;h2 id="lever-5-model-selection-slm-moe-vs-dense">Lever 5: model selection (SLM, MoE vs dense)&lt;/h2>
&lt;h3 id="the-effect-of-scale">The effect of scale&lt;/h3>
&lt;p>J/token scales with model size, but sublinearly. For Llama-3
(&lt;a href="https://arxiv.org/pdf/2504.17674">arXiv 2504.17674&lt;/a>):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Model&lt;/th>
&lt;th>Parameters&lt;/th>
&lt;th>Relative J/token&lt;/th>
&lt;th>Factor vs 1B&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Llama-3 1B&lt;/td>
&lt;td>1B&lt;/td>
&lt;td>1.0×&lt;/td>
&lt;td>reference&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama-3 8B&lt;/td>
&lt;td>8B&lt;/td>
&lt;td>~2.3×&lt;/td>
&lt;td>×2.3 (not ×8)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama-3 70B&lt;/td>
&lt;td>70B&lt;/td>
&lt;td>~7.3×&lt;/td>
&lt;td>×7.3 (not ×70)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama-3 405B&lt;/td>
&lt;td>405B&lt;/td>
&lt;td>~40×&lt;/td>
&lt;td>×40 (not ×405)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>J/token grows ~7.3× from 1B to 70B, while parameters grow ×70: hardware
efficiency (caches, tensor parallelism, kernels) cushions the scaling.
Even so, moving from 70B to 8B cuts J/token by ~68% if the quality is sufficient for
the task.&lt;/p>
&lt;h3 id="moe-vs-dense">MoE vs dense&lt;/h3>
&lt;p>MoE models activate only a subset of experts per token (typically 2 of 8–64), which
reduces active compute. But there is an implementation trap:&lt;/p>
&lt;ul>
&lt;li>OLMoE-1B-7B (MoE, 1B active) vs OLMo-1B (dense): the MoE consumes &lt;strong>54.24% more&lt;/strong>
energy per token than the dense model of the same active size
(&lt;a href="https://arxiv.org/pdf/2504.17674">arXiv 2504.17674&lt;/a>), because the fused expert
kernels are ~19–63% slower than an equivalent dense GEMM.&lt;/li>
&lt;li>OLMoE-1B-7B vs OLMo-7B (dense): here the MoE is indeed more efficient (7B active → only 1B
active, a ~7× reduction in active FLOPs per token).&lt;/li>
&lt;/ul>
&lt;p>The rule: MoE is efficient when the comparison is &lt;strong>equal total parameters, fewer
active&lt;/strong> (for example Mixtral 8×7B vs dense Llama-3 70B). It is not efficient when the comparison
is &lt;strong>equal active parameters&lt;/strong> per token.&lt;/p>
&lt;h3 id="model-selection-table-by-use-case">Model selection table by use case&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Use case&lt;/th>
&lt;th>Recommended model&lt;/th>
&lt;th>Efficiency rationale&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Simple chat, entity extraction&lt;/td>
&lt;td>SLM 7–8B FP8&lt;/td>
&lt;td>−68% J/token vs 70B&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RAG with long contexts&lt;/td>
&lt;td>70B FP8 or MoE 8×7B&lt;/td>
&lt;td>optimal quality/J at K&amp;gt;2K tokens&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Complex code, reasoning&lt;/td>
&lt;td>70B FP8 or 405B INT4&lt;/td>
&lt;td>quality is non-negotiable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Classification, embeddings&lt;/td>
&lt;td>dedicated model (e.g. E5, BGE)&lt;/td>
&lt;td>orders of magnitude less J&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Deferrable offline batch&lt;/td>
&lt;td>large MoE (DeepSeek, Mixtral)&lt;/td>
&lt;td>high quality, batch throughput&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="lever-6-speculative-decoding">Lever 6: speculative decoding&lt;/h2>
&lt;h3 id="mechanics-4">Mechanics&lt;/h3>
&lt;p>Speculative decoding uses a small draft model to propose several
tokens, which the target model verifies in parallel in a single forward pass. If the tokens
are accepted, K tokens are generated per step instead of 1: potentially K× throughput.&lt;/p>
&lt;h3 id="the-energy-efficiency-condition">The energy efficiency condition&lt;/h3>
&lt;p>The J/token benefit &lt;strong>depends on batch size&lt;/strong> (&lt;a href="https://arxiv.org/pdf/2602.09113">arXiv 2602.09113&lt;/a>):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Batch size&lt;/th>
&lt;th>Effect on J/token&lt;/th>
&lt;th>Reason&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1–16 (low batch)&lt;/td>
&lt;td>&lt;strong>−up to 29%&lt;/strong>&lt;/td>
&lt;td>the draft model fills the waiting time; verification is cheap&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>32–64 (medium batch)&lt;/td>
&lt;td>~0% (neutral)&lt;/td>
&lt;td>verification overhead cancels out the gain&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>128+ (high batch)&lt;/td>
&lt;td>&lt;strong>+25%&lt;/strong> (worse)&lt;/td>
&lt;td>GPU saturated; the draft model adds overhead without saving&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Conclusion: speculative decoding is a J/token lever only in a &lt;strong>low-latency regime
(batch≤16)&lt;/strong>; in high-throughput serving it is counterproductive in J/token terms
(although it reduces TPOT latency).&lt;/p>
&lt;h3 id="oss-tooling-2">OSS tooling&lt;/h3>
&lt;p>vLLM supports speculative decoding with &lt;code>--speculative-model&lt;/code> and &lt;code>--num-speculative-tokens&lt;/code>.
TRT-LLM does too. The draft model must come from the same family (for example Llama-3 8B as
draft for Llama-3 70B).&lt;/p>
&lt;hr>
&lt;h2 id="lever-7-prefix-caching-and-chunked-prefill">Lever 7: prefix caching and chunked prefill&lt;/h2>
&lt;h3 id="prefix-caching">Prefix caching&lt;/h3>
&lt;p>The prefill KV-cache of a shared prompt (system prompt, few-shot examples, document
context) is identical across requests. Storing and reusing it eliminates the prefill
recompute for that fraction of the prompt.&lt;/p>
&lt;p>Energy impact: prefill is compute-bound and draws power spikes. Removing the
repeated prefill removes those spikes. In scenarios with a fixed 1,000-token system prompt
and 200-token user prompts, the saving is ~1,000/(1,000+200) = &lt;strong>~83% of prefill
energy&lt;/strong>. In total J/token, the effect depends on the length of the shared prompt against
the generation length.&lt;/p>
&lt;p>Enabling it in vLLM:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">vllm serve meta-llama/Llama-3-70B-Instruct &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --enable-prefix-caching &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --max-num-seqs &lt;span class="m">256&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="chunked-prefill-sarathi">Chunked prefill (SARATHI)&lt;/h3>
&lt;p>Chunked prefill splits the prefill into fixed-size chunks and processes each chunk together with
decode tokens from other requests. The benefit: the prefill of a long prompt no longer
blocks the decode of other requests (reducing TPOT spikes), which allows higher
GPU utilisation over time.&lt;/p>
&lt;p>In terms of total J/token, chunked prefill reduces the node&amp;rsquo;s peak power
(fewer prefill spikes) and improves average utilisation, which translates into ~10–15% less
J/token on mixed loads with long prompts (&lt;a href="https://arxiv.org/pdf/2308.16369">arXiv 2308.16369&lt;/a>).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Enable chunked prefill in vLLM (chunk size: 512 tokens)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vllm serve meta-llama/Llama-3-70B-Instruct &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --enable-chunked-prefill &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --max-num-batched-tokens &lt;span class="m">512&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="lever-8-scheduling-to-clean-hours">Lever 8: scheduling to clean hours&lt;/h2>
&lt;p>This lever does not reduce physical J/token, but it does reduce the &lt;strong>gCO₂/token&lt;/strong> of deferrable load.
The mechanics: moving training, document ingestion, batch re-ranking and fine-tuning
to the hours of lowest grid carbon intensity.&lt;/p>
&lt;p>Impact figures for temporal shifting (&lt;a href="https://arxiv.org/pdf/2507.09942">ACM SLIT, arXiv 2507.09942&lt;/a>):&lt;/p>
&lt;ul>
&lt;li>CO₂ reduction from temporal shifting: &lt;strong>up to 34.7%&lt;/strong> for flexible loads.&lt;/li>
&lt;li>With carbon-aware reinforcement learning (Eco-Orchestrator): up to a &lt;strong>70% offset&lt;/strong> in
integrated deployments.&lt;/li>
&lt;li>In Spain, the hourly variation in intensity is ~80–250 gCO₂/kWh: a factor of ~3× within the
same day (see &lt;a href="https://blog.lo0.es/en/posts/watt-to-carbon-pue-grid-intensity-gco2-per-token/">from watt to carbon&lt;/a>).&lt;/li>
&lt;/ul>
&lt;p>The practical implementation uses Kueue or Volcano on Kubernetes, with a grid intensity
metric (the ElectricityMaps API or esios) as the scheduling signal. Loads are marked with a
&lt;code>carbon-deadline&lt;/code> annotation (the maximum tolerable wait) and the scheduler places them
in the minimum-intensity hours within that window.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Kueue annotation for carbon-aware scheduling&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">metadata&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">annotations&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">kueue.x-k8s.io/carbon-aware&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;true&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">kueue.x-k8s.io/carbon-deadline&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;8h&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="the-power-cap-vs-throughput-curve-the-sweet-spot">The power cap vs throughput curve: the sweet spot&lt;/h2>
&lt;div class="diagram" style="max-width:720px;margin:1rem auto;">
&lt;svg viewBox="0 0 720 320" role="img" aria-label="Power cap vs throughput curve on H100 SXM: the efficiency sweet spot (minimum J/token) sits between 490 and 560 W, where the power reduction outpaces the throughput drop" xmlns="http://www.w3.org/2000/svg">
&lt;style>.ax{fill:none;stroke:currentColor;stroke-width:1}.ln{fill:none;stroke:currentColor;stroke-width:1.8}.ln2{fill:none;stroke:currentColor;stroke-width:1.8;stroke-dasharray:6 3}.tl{font:600 12px sans-serif;fill:currentColor}.ts{font:11px sans-serif;fill:currentColor}.dot{fill:currentColor}&lt;/style>
&lt;defs>&lt;marker id="arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="currentColor"/>&lt;/marker>&lt;/defs>
&lt;line class="ax" x1="60" y1="30" x2="60" y2="240" marker-end="url(#arr)"/>
&lt;line class="ax" x1="60" y1="240" x2="660" y2="240" marker-end="url(#arr)"/>
&lt;text x="62" y="22" class="ts">%&lt;/text>
&lt;text x="330" y="268" class="ts">Power cap (W) →&lt;/text>
&lt;text x="10" y="80" class="ts" transform="rotate(-90 10 140)">%&lt;/text>
&lt;text x="62" y="245" class="ts">200&lt;/text>
&lt;text x="152" y="245" class="ts">280&lt;/text>
&lt;text x="242" y="245" class="ts">350&lt;/text>
&lt;text x="332" y="245" class="ts">420&lt;/text>
&lt;text x="412" y="245" class="ts">490&lt;/text>
&lt;text x="492" y="245" class="ts">560&lt;/text>
&lt;text x="572" y="245" class="ts">630&lt;/text>
&lt;text x="642" y="245" class="ts">700&lt;/text>
&lt;text x="64" y="235" class="ts">0&lt;/text>
&lt;text x="54" y="195" class="ts">50&lt;/text>
&lt;text x="54" y="155" class="ts">70&lt;/text>
&lt;text x="54" y="115" class="ts">80&lt;/text>
&lt;text x="54" y="75" class="ts">90&lt;/text>
&lt;text x="44" y="45" class="ts">100&lt;/text>
&lt;line class="ax" x1="58" y1="40" x2="62" y2="40"/>
&lt;line class="ax" x1="58" y1="75" x2="62" y2="75"/>
&lt;line class="ax" x1="58" y1="115" x2="62" y2="115"/>
&lt;line class="ax" x1="58" y1="155" x2="62" y2="155"/>
&lt;line class="ax" x1="58" y1="195" x2="62" y2="195"/>
&lt;path class="ln" d="M90,195 L180,160 L240,130 L330,115 L420,95 L500,75 L590,55 L650,40"/>
&lt;path class="ln2" d="M90,160 L180,140 L240,128 L330,118 L420,108 L500,98 L590,92 L650,90"/>
&lt;text x="580" y="48" class="ts">power (% TDP)&lt;/text>
&lt;text x="560" y="104" class="ts">throughput (%)&lt;/text>
&lt;circle class="dot" cx="420" cy="95" r="5"/>
&lt;circle class="dot" cx="500" cy="75" r="5"/>
&lt;line class="ax" x1="420" y1="95" x2="420" y2="240" stroke-dasharray="3 3"/>
&lt;line class="ax" x1="500" y1="75" x2="500" y2="240" stroke-dasharray="3 3"/>
&lt;text x="380" y="88" class="tl">sweet spot&lt;/text>
&lt;text x="362" y="280" class="ts">490–560 W: −30% power, &amp;lt;10% throughput. Minimum J/token.&lt;/text>
&lt;text x="62" y="305" class="ts">H100 SXM (700 W TDP). Memory-bound load (LLM decode). Source: arXiv 2604.11391, NERSC.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>Reading the chart: the power curve (solid line) falls faster than the throughput
curve (dashed line) in the 490–560 W zone. Above 560 W, each additional 70 W
gives only ~5% extra throughput; below 420 W, throughput starts
falling faster than power. The &lt;strong>efficiency sweet spot&lt;/strong> (minimum J/token) sits
at 490–560 W for decode-bound loads.&lt;/p>
&lt;p>For compute-bound loads (pure prefill), the sweet spot shifts to 500–600 W: prefill
saturates SM compute and needs more power to sustain throughput.&lt;/p>
&lt;hr>
&lt;h2 id="how-to-measure-the-effect-and-validate-quality">How to measure the effect and validate quality&lt;/h2>
&lt;h3 id="measurement-stack">Measurement stack&lt;/h3>
&lt;p>The full stack for measuring the effect of each lever:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>What to measure&lt;/th>
&lt;th>Tool&lt;/th>
&lt;th>Metric&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Real-time GPU power&lt;/td>
&lt;td>DCGM (&lt;code>DCGM_FI_DEV_POWER_USAGE&lt;/code>)&lt;/td>
&lt;td>W per GPU, 100ms&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>J/token in production&lt;/td>
&lt;td>Kepler + vLLM tokens&lt;/td>
&lt;td>&lt;code>rate(kepler_joules) / rate(vllm_tokens)&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>J/token on the bench&lt;/td>
&lt;td>Zeus (&lt;code>ZeusMonitor&lt;/code>)&lt;/td>
&lt;td>J measured during the benchmark&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Throughput&lt;/td>
&lt;td>vLLM metrics (&lt;code>vllm:generation_tokens_total&lt;/code>)&lt;/td>
&lt;td>tok/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TPOT latency&lt;/td>
&lt;td>vLLM (&lt;code>vllm:e2e_request_latency&lt;/code>)&lt;/td>
&lt;td>ms/tok&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Output quality&lt;/td>
&lt;td>lm-evaluation-harness&lt;/td>
&lt;td>MMLU, HumanEval, etc.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>See the full stack in &lt;a href="https://blog.lo0.es/en/posts/measuring-energy-in-production-kepler-dcgm-stack/">energy tooling&lt;/a>.&lt;/p>
&lt;h3 id="measurement-protocol-per-lever">Measurement protocol per lever&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-promql" data-lang="promql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Real-time J/token (Kepler + vLLM in Prometheus)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">sum&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="kr">rate&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">kepler_container_joules_total&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="nl">container&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">&amp;#34;&lt;/span>&lt;span class="s">vllm&lt;/span>&lt;span class="p">&amp;#34;}[&lt;/span>&lt;span class="s">5m&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">))&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">sum&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="kr">rate&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">vllm_generation_tokens_total&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s">5m&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">))&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1"># Average power per GPU (DCGM)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">avg&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">by&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">gpu&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">DCGM_FI_DEV_POWER_USAGE&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1"># Check that the power cap is active&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">avg&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">by&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">gpu&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">DCGM_FI_DEV_POWER_LIMIT&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>With Zeus, the configuration sweep is automatic:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">zeus.monitor&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">ZeusMonitor&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">monitor&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ZeusMonitor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">gpu_indices&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">with&lt;/span> &lt;span class="n">monitor&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">begin_window&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;fp8_inference&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># run the benchmark with vLLM FP8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">run_benchmark&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;llama-3-70b-fp8&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">num_tokens&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10_000&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">monitor&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">end_window&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;fp8_inference&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;J/token: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">total_energy&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">10_000&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s2">.4f&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="quality-validation">Quality validation&lt;/h3>
&lt;p>Validating that the lever does not degrade quality is done with lm-evaluation-harness
(&lt;a href="https://github.com/EleutherAI/lm-evaluation-harness">github.com/EleutherAI/lm-evaluation-harness&lt;/a>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Compare MMLU between FP16 and FP8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lm_eval --model vllm &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --model_args &lt;span class="nv">pretrained&lt;/span>&lt;span class="o">=&lt;/span>meta-llama/Llama-3-70B-Instruct,dtype&lt;span class="o">=&lt;/span>float16 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --tasks mmlu --num_fewshot &lt;span class="m">5&lt;/span> --output_path ./results/fp16/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lm_eval --model vllm &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --model_args &lt;span class="nv">pretrained&lt;/span>&lt;span class="o">=&lt;/span>meta-llama/Llama-3-70B-Instruct,quantization&lt;span class="o">=&lt;/span>fp8 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --tasks mmlu --num_fewshot &lt;span class="m">5&lt;/span> --output_path ./results/fp8/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The MMLU score difference between FP16 and FP8 with calibration is typically
&amp;lt;1%. Without calibration it can be 2–4%.&lt;/p>
&lt;hr>
&lt;h2 id="pareto-decision-table-energy--latency--quality">Pareto decision table (energy / latency / quality)&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Lever&lt;/th>
&lt;th>J/token&lt;/th>
&lt;th>TPOT (latency)&lt;/th>
&lt;th>Quality&lt;/th>
&lt;th>Implementation cost&lt;/th>
&lt;th>Reversibility&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>FP8 quantisation&lt;/td>
&lt;td>↓↓↓&lt;/td>
&lt;td>↓ (improves)&lt;/td>
&lt;td>~ (−&amp;lt;1%)&lt;/td>
&lt;td>Low (1 flag)&lt;/td>
&lt;td>High&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>INT4 AWQ quantisation&lt;/td>
&lt;td>↓↓↓↓&lt;/td>
&lt;td>↓ (improves)&lt;/td>
&lt;td>↓ (−1–3%)&lt;/td>
&lt;td>Medium (recalibrate)&lt;/td>
&lt;td>High&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Continuous batching&lt;/td>
&lt;td>↓↓↓&lt;/td>
&lt;td>~ (neutral on TPOT)&lt;/td>
&lt;td>~&lt;/td>
&lt;td>Low (new engine)&lt;/td>
&lt;td>High&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Power cap 70% TDP&lt;/td>
&lt;td>↓↓&lt;/td>
&lt;td>↑ &amp;lt;10%&lt;/td>
&lt;td>~&lt;/td>
&lt;td>Very low (1 command)&lt;/td>
&lt;td>Immediate&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DVFS decode&lt;/td>
&lt;td>↓↓↓&lt;/td>
&lt;td>↑ &amp;lt;6%&lt;/td>
&lt;td>~&lt;/td>
&lt;td>Medium (script + tuning)&lt;/td>
&lt;td>High&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Speculative decoding&lt;/td>
&lt;td>↓ (low batch)&lt;/td>
&lt;td>↓ (improves TTFT)&lt;/td>
&lt;td>~&lt;/td>
&lt;td>Medium (draft model)&lt;/td>
&lt;td>High&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Prefix caching&lt;/td>
&lt;td>↓↓ (prefill)&lt;/td>
&lt;td>↓↓ (TTFT improves)&lt;/td>
&lt;td>~&lt;/td>
&lt;td>Low (1 flag)&lt;/td>
&lt;td>High&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Chunked prefill&lt;/td>
&lt;td>↓&lt;/td>
&lt;td>↑ stable TPOT&lt;/td>
&lt;td>~&lt;/td>
&lt;td>Low (1 flag)&lt;/td>
&lt;td>High&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SLM (7B vs 70B)&lt;/td>
&lt;td>↓↓↓↓&lt;/td>
&lt;td>↓↓ (improves a lot)&lt;/td>
&lt;td>↓↓ (−variable)&lt;/td>
&lt;td>High (quality re-eval)&lt;/td>
&lt;td>Medium&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>MoE (vs dense, same active size)&lt;/td>
&lt;td>↑ (+54%)&lt;/td>
&lt;td>↑&lt;/td>
&lt;td>~&lt;/td>
&lt;td>—&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Scheduling to clean hours&lt;/td>
&lt;td>~ J/token, ↓↓ CO₂&lt;/td>
&lt;td>~ (for deferrable)&lt;/td>
&lt;td>~&lt;/td>
&lt;td>Medium (scheduler)&lt;/td>
&lt;td>High&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Key: ↓↓↓↓ strong improvement · ↓↓↓ significant improvement · ↓↓ moderate improvement · ↓ slight improvement ·
~ neutral · ↑ worsens · ↑↑ worsens significantly.&lt;/p>
&lt;hr>
&lt;h2 id="stacking-levers-the-combined-effect">Stacking levers: the combined effect&lt;/h2>
&lt;p>The levers are mostly &lt;strong>orthogonal&lt;/strong> and they stack. The maximum combined impact
documented in (&lt;a href="https://arxiv.org/pdf/2504.17674">arXiv 2504.17674&lt;/a>):&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Correct application of the relevant inference optimisations can reduce
total energy consumption by up to 73% against unoptimised baselines.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Recommended sequence by cost-benefit:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Optimised engine&lt;/strong> (vLLM, TRT-LLM) with continuous batching: −25–40% immediately.&lt;/li>
&lt;li>&lt;strong>FP8 quantisation&lt;/strong> (if the hardware supports it: H100, A100 with limited support): a further −30–50%
on the remaining J/token.&lt;/li>
&lt;li>&lt;strong>Power cap at 70% TDP&lt;/strong>: −20–30% power with &amp;lt;10% of throughput. Low cost.&lt;/li>
&lt;li>&lt;strong>Prefix caching&lt;/strong>: turn it on if there are system prompts or repeated contexts. No cost.&lt;/li>
&lt;li>&lt;strong>Chunked prefill&lt;/strong>: if the load has long variable prompts.&lt;/li>
&lt;li>&lt;strong>DVFS in decode&lt;/strong>: a further −22–45% if the SLO allows it.&lt;/li>
&lt;li>&lt;strong>Speculative decoding&lt;/strong>: only if the batch is low (&amp;lt;16) and TTFT latency matters.&lt;/li>
&lt;li>&lt;strong>Model selection&lt;/strong>: move to an SLM if the quality is sufficient (evaluate with
lm-evaluation-harness on your specific task).&lt;/li>
&lt;/ol>
&lt;p>Quantified example on 4×H100 SXM (2,800 W node TDP), Llama-3 70B, chat load:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Configuration&lt;/th>
&lt;th>Power (W)&lt;/th>
&lt;th>Throughput (tok/s)&lt;/th>
&lt;th>J/token&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>PyTorch FP16, static batching&lt;/td>
&lt;td>~2,100&lt;/td>
&lt;td>~400&lt;/td>
&lt;td>&lt;strong>5.25&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>vLLM FP16, continuous batching&lt;/td>
&lt;td>~2,200&lt;/td>
&lt;td>~1,800&lt;/td>
&lt;td>&lt;strong>1.22&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>vLLM FP8, continuous batching&lt;/td>
&lt;td>~2,100&lt;/td>
&lt;td>~2,400&lt;/td>
&lt;td>&lt;strong>0.875&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>+ power cap 490 W/GPU (1,960 W node)&lt;/td>
&lt;td>~1,960&lt;/td>
&lt;td>~2,160&lt;/td>
&lt;td>&lt;strong>0.907&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>+ prefix caching (40% hit rate)&lt;/td>
&lt;td>~1,960&lt;/td>
&lt;td>~2,600&lt;/td>
&lt;td>&lt;strong>0.754&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>+ DVFS decode 1,200 MHz&lt;/td>
&lt;td>~1,500&lt;/td>
&lt;td>~2,400&lt;/td>
&lt;td>&lt;strong>0.625&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>The values are illustrative estimates based on the cited papers applied to
a 4×H100 node. Real J/token depends on the prompt distribution, the effective batch
and the temperature of the models. Measuring it with Zeus or DCGM+Kepler is mandatory.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="reference-hardware-tdp-and-power-cap-ranges">Reference hardware: TDP and power cap ranges&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>GPU&lt;/th>
&lt;th>TDP (W)&lt;/th>
&lt;th>Supported cap range&lt;/th>
&lt;th>Decode sweet spot&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>H100 SXM 80GB&lt;/td>
&lt;td>700&lt;/td>
&lt;td>200–700 W&lt;/td>
&lt;td>~490–560 W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>H100 PCIe 80GB&lt;/td>
&lt;td>350&lt;/td>
&lt;td>100–350 W&lt;/td>
&lt;td>~245–280 W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A100 SXM 80GB&lt;/td>
&lt;td>400&lt;/td>
&lt;td>100–400 W&lt;/td>
&lt;td>~280–320 W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A100 PCIe 80GB&lt;/td>
&lt;td>300&lt;/td>
&lt;td>100–300 W&lt;/td>
&lt;td>~210–240 W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>L40S 48GB&lt;/td>
&lt;td>350&lt;/td>
&lt;td>100–350 W&lt;/td>
&lt;td>~245–280 W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RTX 5090 (reference, PCIe)&lt;/td>
&lt;td>575&lt;/td>
&lt;td>~100–575 W&lt;/td>
&lt;td>~400–460 W&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>For the exact ranges: &lt;code>nvidia-smi -q -d POWER | grep -E &amp;quot;Min|Max|Current&amp;quot;&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="executive-summary-by-role">Executive summary by role&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Role&lt;/th>
&lt;th>First action&lt;/th>
&lt;th>Second action&lt;/th>
&lt;th>Key tool&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Cluster operator&lt;/td>
&lt;td>&lt;code>nvidia-smi -pl [70% TDP]&lt;/code> on every node&lt;/td>
&lt;td>Enable persistent mode&lt;/td>
&lt;td>nvidia-smi, DCGM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Serving engineer&lt;/td>
&lt;td>Migrate to vLLM FP8 with continuous batching&lt;/td>
&lt;td>Enable prefix caching&lt;/td>
&lt;td>vLLM, llm-compressor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Platform architect&lt;/td>
&lt;td>Select the smallest model that meets the quality SLO&lt;/td>
&lt;td>Design a carbon-based scheduling policy&lt;/td>
&lt;td>lm-evaluation-harness, Kueue&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>MLOps team&lt;/td>
&lt;td>Set up a power cap sweep with Zeus&lt;/td>
&lt;td>Instrument J/token in Prometheus&lt;/td>
&lt;td>Zeus, DCGM exporter&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>See the full measurement stack in &lt;a href="https://blog.lo0.es/en/posts/measuring-energy-in-production-kepler-dcgm-stack/">energy tooling&lt;/a>
and the J/token methodology in &lt;a href="https://blog.lo0.es/en/posts/energy-per-token-spain-methodology-electricity-market-speculation/">energy per token&lt;/a>.
For the context of reference energy leaderboards and benchmarks, see &lt;a href="https://blog.lo0.es/en/posts/llm-energy-leaderboards-wh-per-token/">LLM energy leaderboards&lt;/a>.
The connection with full TCO is in &lt;a href="https://blog.lo0.es/en/posts/gpu-idle-cost-not-on-any-invoice/">GPU utilisation as FinOps&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>arXiv 2504.17674 · Energy Considerations of LLM Inference and Efficiency Optimizations (CMU/Hugging Face, 2025) — &lt;a href="https://arxiv.org/pdf/2504.17674">https://arxiv.org/pdf/2504.17674&lt;/a>&lt;/li>
&lt;li>arXiv 2604.11391 · Architectural Trade-offs: power-capping NVIDIA H100 and H200 (FAU Erlangen, 2026) — &lt;a href="https://arxiv.org/html/2604.11391v1">https://arxiv.org/html/2604.11391v1&lt;/a>&lt;/li>
&lt;li>arXiv 2512.03024 · TokenPowerBench: Benchmarking the Power Consumption of LLM Inference — &lt;a href="https://arxiv.org/pdf/2512.03024">https://arxiv.org/pdf/2512.03024&lt;/a>&lt;/li>
&lt;li>arXiv 2602.09113 · Benchmarking the Energy Savings with Speculative Decoding Strategies — &lt;a href="https://arxiv.org/pdf/2602.09113">https://arxiv.org/pdf/2602.09113&lt;/a>&lt;/li>
&lt;li>arXiv 2501.08219 · Characterizing LLM Inference Energy-Performance Tradeoffs across Workloads and GPU Scaling — &lt;a href="https://arxiv.org/abs/2501.08219">https://arxiv.org/abs/2501.08219&lt;/a>&lt;/li>
&lt;li>arXiv 2602.18755 · DualScale: Energy-Efficient Disaggregated LLM Serving via Phase-Aware Placement and DVFS — &lt;a href="https://arxiv.org/pdf/2602.18755">https://arxiv.org/pdf/2602.18755&lt;/a>&lt;/li>
&lt;li>arXiv 2508.16449 · GreenLLM: SLO-Aware Dynamic Frequency Scaling for Energy-Efficient LLM Serving — &lt;a href="https://arxiv.org/pdf/2508.16449">https://arxiv.org/pdf/2508.16449&lt;/a>&lt;/li>
&lt;li>HAL 05190051 · DVFS-GPT: Dynamic Voltage and Frequency Scaling for Energy-Efficient LLMs — &lt;a href="https://hal.science/hal-05190051">https://hal.science/hal-05190051&lt;/a>&lt;/li>
&lt;li>arXiv 2308.16369 · SARATHI: Efficient LLM Inference by Piggybacking Decodes with Chunked Prefills — &lt;a href="https://arxiv.org/pdf/2308.16369">https://arxiv.org/pdf/2308.16369&lt;/a>&lt;/li>
&lt;li>arXiv 2507.09942 · Green-LLM: Optimal Workload Allocation for Environmentally-Aware Distributed Inference — &lt;a href="https://arxiv.org/pdf/2507.09942">https://arxiv.org/pdf/2507.09942&lt;/a>&lt;/li>
&lt;li>arXiv 2505.06371 · The ML.ENERGY Benchmark: Toward Automated Inference Energy Measurement and Optimization — &lt;a href="https://arxiv.org/html/2505.06371v1">https://arxiv.org/html/2505.06371v1&lt;/a>&lt;/li>
&lt;li>Zeus Project (ml.energy) — &lt;a href="https://ml.energy/zeus/">https://ml.energy/zeus/&lt;/a>&lt;/li>
&lt;li>Zeus · PyTorch blog: Deep Learning Energy Measurement and Optimization — &lt;a href="https://pytorch.org/blog/zeus/">https://pytorch.org/blog/zeus/&lt;/a>&lt;/li>
&lt;li>Baseten · 33% faster LLM inference with FP8 quantization — &lt;a href="https://www.baseten.co/blog/33-faster-llm-inference-with-fp8-quantization/">https://www.baseten.co/blog/33-faster-llm-inference-with-fp8-quantization/&lt;/a>&lt;/li>
&lt;li>NVIDIA · Managing Power Capping (DGX H100/H200 User Guide) — &lt;a href="https://docs.nvidia.com/dgx/dgxh100-user-guide/power-capping.html">https://docs.nvidia.com/dgx/dgxh100-user-guide/power-capping.html&lt;/a>&lt;/li>
&lt;li>NERSC · GPU Power Capping documentation — &lt;a href="https://docs.nersc.gov/jobs/power-capping/">https://docs.nersc.gov/jobs/power-capping/&lt;/a>&lt;/li>
&lt;li>MLCommons · MLPerf Inference v5.1 results — &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>vLLM · Disaggregated Prefill documentation — &lt;a href="https://docs.vllm.ai/en/latest/features/disagg_prefill/">https://docs.vllm.ai/en/latest/features/disagg_prefill/&lt;/a>&lt;/li>
&lt;li>Microsoft Research · Characterizing Power Management Opportunities for LLMs in the Cloud (ASPLOS 2024) — &lt;a href="https://www.microsoft.com/en-us/research/wp-content/uploads/2024/03/GPU_Power_ASPLOS_24.pdf">https://www.microsoft.com/en-us/research/wp-content/uploads/2024/03/GPU_Power_ASPLOS_24.pdf&lt;/a>&lt;/li>
&lt;li>EcoInfer (MDPI Electronics) · Optimizing Energy Efficiency with Latency Guarantees Through Iteration-Level GPU Frequency Control — &lt;a href="https://doi.org/10.3390/electronics15102139">https://doi.org/10.3390/electronics15102139&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>From watt to carbon, honestly: PUE, grid intensity and gCO₂ per token</title><link>https://blog.lo0.es/en/posts/watt-to-carbon-pue-grid-intensity-gco2-per-token/</link><pubDate>Tue, 16 Jun 2026 08:00:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/watt-to-carbon-pue-grid-intensity-gco2-per-token/</guid><description>&lt;blockquote>
&lt;p>Notation: amounts in &lt;strong>euros (N €)&lt;/strong>, decimals with a point. The dollar symbol is not used
(on this site it is a formula delimiter). Generic example hardware (4×H100 SXM 80 GB);
no real infrastructure. Emission figures in &lt;strong>gCO₂eq/kWh&lt;/strong> (CO₂ equivalents).&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>A model that consumes 2 J/token at the board (4×H100 SXM, PUE 1.45) emits between
\(0.08\) and \(1.05\) gCO₂ per 1,000 tokens depending on the region and the hour:
\(0.08\) in nuclear France in the small hours, \(0.22\) in solar Spain at midday,
\(0.72\) in Spain on night-time gas, and \(1.05\) in Germany on coal.
The difference, a factor of ×13, is set by three variables external to the hardware: the
datacenter &lt;strong>PUE&lt;/strong> (Uptime Institute 2025: global average 1.54; hyperscale 1.10–1.15),
the &lt;strong>grid carbon intensity&lt;/strong> (which varies in real time, from 5 to 600+ gCO₂/kWh depending
on zone and hour), and the type of &lt;strong>emissions&lt;/strong> being counted (location-based, market-based,
marginal). Moving batch work to hours of lower carbon intensity, temporal carbon-aware
shifting, cuts the emissions of deferrable work by between 20 % and 65 %
without touching the hardware. The &lt;strong>SCI&lt;/strong> specification (Software Carbon Intensity, Green Software
Foundation, ISO/IEC 21031:2022) formalises the metric as \(\text{SCI} = (E \times I + M) / R\),
where \(M\) captures the embodied carbon of the hardware, the part that almost no LLM
inference analysis includes today.&lt;/p>
&lt;hr>
&lt;h2 id="track-context">Track context&lt;/h2>
&lt;p>This article is &lt;strong>C6&lt;/strong> of the energy pillar. The previous ones:&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>&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 electricity market&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/measuring-energy-in-production-kepler-dcgm-stack/">C3 — Measurement tools in deployment: accuracy and overhead&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/mlperf-power-energy-efficiency-benchmark/">C4 — MLPerf Power: the certified standard benchmark&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-energy-leaderboards-wh-per-token/">C5 — LLM energy leaderboards&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>The starting point is the J/token already measured (methodology in C2, tools in C3).
This article converts that number into gCO₂/token.&lt;/p>
&lt;hr>
&lt;h2 id="pue-the-first-multiplier">PUE: the first multiplier&lt;/h2>
&lt;h3 id="definition">Definition&lt;/h3>
&lt;p>PUE (Power Usage Effectiveness) measures what fraction of the total energy consumed by
a datacenter actually reaches the IT equipment:&lt;/p>
$$\text{PUE} = \frac{\text{total datacenter energy (W)}}{\text{IT equipment energy (W)}}$$
&lt;p>A PUE of 1.0 would be perfect (all energy going to compute). A PUE of 2.0 means that
for every watt the GPU consumes, another watt is consumed in cooling, electrical
distribution, lighting and conversion losses. PUE turns &lt;strong>board power&lt;/strong>, the figure
DCGM or NVML measure, into the &lt;strong>total datacenter power&lt;/strong> drawn from the grid.&lt;/p>
&lt;h3 id="current-values">Current values&lt;/h3>
&lt;p>The &lt;strong>Uptime Institute Global Data Center Survey 2025&lt;/strong> (15th annual edition) reports:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Segment&lt;/th>
&lt;th>Typical PUE&lt;/th>
&lt;th>Source&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Global average&lt;/strong>&lt;/td>
&lt;td>&lt;strong>1.54&lt;/strong> (6th consecutive year unchanged)&lt;/td>
&lt;td>Uptime Institute 2025&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hyperscale (Google, Meta, Microsoft, Amazon)&lt;/td>
&lt;td>1.10–1.15&lt;/td>
&lt;td>Uptime Institute 2025&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Colocation / enterprise&lt;/td>
&lt;td>1.58–1.80&lt;/td>
&lt;td>Uptime Institute 2025&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Unoptimised on-premise&lt;/td>
&lt;td>1.6–2.0&lt;/td>
&lt;td>industry, various&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Theoretical limit (cold air, favourable climate)&lt;/td>
&lt;td>1.10–1.20&lt;/td>
&lt;td>ASHRAE / industry&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The stagnation of average PUE at 1.54 reflects the fact that legacy facilities, with
inefficient cooling, keep operating alongside the new ones. For a typical on-premise platform with no
specific investment in efficiency, assuming a PUE between 1.4 and 1.6 is reasonable.
Facilities with direct liquid cooling can reach 1.10–1.20.&lt;/p>
&lt;h3 id="how-it-inflates-jtoken">How it inflates J/token&lt;/h3>
&lt;p>If the reference node (4×H100 SXM) consumes 3,200 W at full load (GPU + CPU + DRAM + fans):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>PUE&lt;/th>
&lt;th>Total datacenter power&lt;/th>
&lt;th>Inflation factor over board&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1.10&lt;/td>
&lt;td>3,520 W&lt;/td>
&lt;td>+10 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1.40&lt;/td>
&lt;td>4,480 W&lt;/td>
&lt;td>+40 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1.54 (global average)&lt;/td>
&lt;td>4,928 W&lt;/td>
&lt;td>+54 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1.80 (enterprise legacy)&lt;/td>
&lt;td>5,760 W&lt;/td>
&lt;td>+80 %&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The energy per token on a leaderboard, measured at GPU or node level, does not include PUE.
The impact: going from PUE 1.10 (hyperscale) to PUE 1.54 (global average) multiplies
effective energy consumption by 1.40×. It is the same GPU, the same model, the same
throughput; the difference comes from the facility.&lt;/p>
&lt;div class="diagram" style="max-width:740px;margin:1rem auto;">
&lt;svg viewBox="0 0 740 190" role="img" aria-label="Effect of PUE on total energy: the PUE 1.0 bar represents IT only; at PUE 1.54 cooling and distribution add 54% on top of IT consumption" xmlns="http://www.w3.org/2000/svg">
&lt;style>.ax{fill:none;stroke:currentColor;stroke-width:1}.br{fill:none;stroke:currentColor;stroke-width:1.4}.ts{font:11px sans-serif;fill:currentColor}.tl{font:bold 12px sans-serif;fill:currentColor}&lt;/style>
&lt;line class="ax" x1="60" y1="20" x2="60" y2="150"/>
&lt;line class="ax" x1="60" y1="150" x2="700" y2="150"/>
&lt;text x="10" y="90" class="ts" transform="rotate(-90 10 90)">Power (W)&lt;/text>
&lt;rect class="br" x="80" y="100" width="70" height="50"/>
&lt;text x="82" y="165" class="ts">PUE 1.0&lt;/text>
&lt;text x="88" y="93" class="ts">3,200&lt;/text>
&lt;rect class="br" x="200" y="82" width="70" height="68"/>
&lt;text x="202" y="165" class="ts">PUE 1.10&lt;/text>
&lt;text x="208" y="75" class="ts">3,520&lt;/text>
&lt;rect class="br" x="320" y="64" width="70" height="86"/>
&lt;text x="322" y="165" class="ts">PUE 1.40&lt;/text>
&lt;text x="328" y="57" class="ts">4,480&lt;/text>
&lt;rect class="br" x="440" y="50" width="70" height="100"/>
&lt;text x="442" y="165" class="ts">PUE 1.54&lt;/text>
&lt;text x="448" y="43" class="ts">4,928&lt;/text>
&lt;rect class="br" x="560" y="30" width="70" height="120"/>
&lt;text x="562" y="165" class="ts">PUE 1.80&lt;/text>
&lt;text x="568" y="23" class="ts">5,760&lt;/text>
&lt;text x="60" y="182" class="ts">4×H100 SXM node at 3,200 W IT. Each bar adds cooling and distribution overhead per PUE.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;hr>
&lt;h2 id="grid-carbon-intensity">Grid carbon intensity&lt;/h2>
&lt;h3 id="what-it-measures-and-why-it-varies">What it measures and why it varies&lt;/h3>
&lt;p>The &lt;strong>carbon intensity&lt;/strong> of the electricity grid expresses how many grams of CO₂eq are emitted
per kilowatt-hour generated, as a function of the source mix (nuclear, wind, solar,
gas, coal, hydro). It is the most heterogeneous variable in the calculation: it varies by country,
by region within a country, and by hour of the day.&lt;/p>
&lt;p>The reference OSS tools are:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tool&lt;/th>
&lt;th>Signal type&lt;/th>
&lt;th>Coverage&lt;/th>
&lt;th>Access&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>ElectricityMaps&lt;/strong>&lt;/td>
&lt;td>Hourly average (production-based and flow-traced)&lt;/td>
&lt;td>60+ countries in real time&lt;/td>
&lt;td>API (limited free plan); OSS on GitHub&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>WattTime&lt;/strong>&lt;/td>
&lt;td>Hourly marginal (MOER)&lt;/td>
&lt;td>US + growing global coverage&lt;/td>
&lt;td>API; free data since 2025 (REsurety-WattTime partnership)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Carbon Aware SDK&lt;/strong> (Green Software Foundation)&lt;/td>
&lt;td>Wrapper over ElectricityMaps and WattTime&lt;/td>
&lt;td>Same sources&lt;/td>
&lt;td>OSS, Apache 2.0; github.com/Green-Software-Foundation/carbon-aware-sdk&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>ElectricityMaps (formerly electricityMap) publishes carbon intensity in
gCO₂eq/kWh hour by hour via API and on its interactive map (app.electricitymaps.com).
WattTime publishes the marginal operating emissions rate (MOER),
useful for calculating the causal impact of adding or removing load. The GSF Carbon Aware SDK
integrates both signals as interchangeable backends.&lt;/p>
&lt;h3 id="country-data-annual-averages-20242025">Country data (annual averages 2024–2025)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Country&lt;/th>
&lt;th>Average intensity 2024 (gCO₂eq/kWh)&lt;/th>
&lt;th>Approximate hourly range&lt;/th>
&lt;th>Source&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Spain&lt;/strong>&lt;/td>
&lt;td>&lt;strong>~108&lt;/strong>&lt;/td>
&lt;td>30–250&lt;/td>
&lt;td>Nowtricity / REE 2025&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>France&lt;/strong>&lt;/td>
&lt;td>&lt;strong>~21.7&lt;/strong> (2024); &lt;strong>~19.6&lt;/strong> (2025)&lt;/td>
&lt;td>5–80&lt;/td>
&lt;td>RTE Bilan Électrique 2025&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Germany&lt;/strong>&lt;/td>
&lt;td>&lt;strong>~363&lt;/strong> (2024); &lt;strong>~328&lt;/strong> (2025)&lt;/td>
&lt;td>100–600&lt;/td>
&lt;td>Fraunhofer ISE 2025&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>EU average&lt;/td>
&lt;td>~213&lt;/td>
&lt;td>—&lt;/td>
&lt;td>Ember European Electricity Review 2025&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>France has the lowest intensity in continental Europe thanks to its nuclear fleet
(&amp;gt;90 % low-carbon generation in 2025, according to RTE). Spain closed 2024 with a
historic record: 56.8 % renewable generation, with an average intensity of 108 gCO₂/kWh,
among the lowest in the non-nuclear EU. Germany, in accelerated transition but still
dependent on lignite and gas, has three times Spain&amp;rsquo;s average intensity.&lt;/p>
&lt;h3 id="hourly-variation-the-figure-that-matters-most-for-scheduling">Hourly variation: the figure that matters most for scheduling&lt;/h3>
&lt;p>Within a single country, the hourly variation in carbon intensity is enormous.
Data from the ElectricityMaps 2025 grid review for Spain:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Time of day&lt;/th>
&lt;th>Typical condition&lt;/th>
&lt;th>Estimated intensity (gCO₂eq/kWh)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Solar midday (11:00–15:00, summer)&lt;/td>
&lt;td>Solar covers &amp;gt;40 % of demand&lt;/td>
&lt;td>30–80&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Night-time trough (02:00–06:00, summer)&lt;/td>
&lt;td>Zero solar; variable wind&lt;/td>
&lt;td>80–180&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Demand peak (19:00–21:00, winter)&lt;/td>
&lt;td>Gas as the marginal plant&lt;/td>
&lt;td>180–280&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cold windless small hours (winter)&lt;/td>
&lt;td>Gas + combined cycle dominate&lt;/td>
&lt;td>220–300&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The price-carbon correlation in Spain is strong and negative (coefficient −0.70 in 2025
according to ElectricityMaps): cheap hours are also the cleanest, because both are
driven by renewable penetration. The 477 hours with negative prices in 2025
were also the hours of lowest carbon intensity.&lt;/p>
&lt;div class="diagram" style="max-width:740px;margin:1rem auto;">
&lt;svg viewBox="0 0 740 210" role="img" aria-label="Approximate daily variation of carbon intensity in Spain: low at midday with solar, high at night with gas; typical reference curve for a summer weekday" xmlns="http://www.w3.org/2000/svg">
&lt;style>.ax{fill:none;stroke:currentColor;stroke-width:1}.ln{fill:none;stroke:currentColor;stroke-width:2}.dsh{fill:none;stroke:currentColor;stroke-width:1.2;stroke-dasharray:4 3}.ts{font:11px sans-serif;fill:currentColor}.tl{font:bold 11px sans-serif;fill:currentColor}&lt;/style>
&lt;line class="ax" x1="60" y1="20" x2="60" y2="170"/>
&lt;line class="ax" x1="60" y1="170" x2="700" y2="170"/>
&lt;text x="10" y="100" class="ts" transform="rotate(-90 10 100)">gCO₂/kWh&lt;/text>
&lt;text x="360" y="190" class="ts">hour of day →&lt;/text>
&lt;text x="62" y="165" class="ts">0h&lt;/text>
&lt;text x="232" y="165" class="ts">6h&lt;/text>
&lt;text x="400" y="165" class="ts">12h&lt;/text>
&lt;text x="570" y="165" class="ts">18h&lt;/text>
&lt;text x="685" y="165" class="ts">24h&lt;/text>
&lt;text x="62" y="170" class="ts">|&lt;/text>
&lt;text x="232" y="170" class="ts">|&lt;/text>
&lt;text x="400" y="170" class="ts">|&lt;/text>
&lt;text x="570" y="170" class="ts">|&lt;/text>
&lt;text x="685" y="170" class="ts">|&lt;/text>
&lt;text x="62" y="38" class="ts">300&lt;/text>
&lt;text x="62" y="103" class="ts">150&lt;/text>
&lt;line class="dsh" x1="80" y1="100" x2="700" y2="100"/>
&lt;path class="ln" d="M80,70 C120,68 160,65 200,60 C240,55 280,45 320,35 C360,25 400,30 440,50 C480,70 520,90 560,95 C600,85 640,75 680,72"/>
&lt;text x="290" y="28" class="tl">solar minimum (~50 gCO₂/kWh)&lt;/text>
&lt;text x="490" y="98" class="ts">night gas (~150–200)&lt;/text>
&lt;text x="60" y="205" class="ts">Schematic summer day curve, Spain. Source: ElectricityMaps grid review 2025 + REE.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;h3 id="spain-vs-france-vs-germany-impact-on-gcotoken">Spain vs France vs Germany: impact on gCO₂/token&lt;/h3>
&lt;p>To anchor the difference in operational terms, with the reference node (4×H100 SXM,
indicative throughput 1,000 tok/s under load, PUE 1.45):&lt;/p>
&lt;p>Energy per token at the datacenter:&lt;/p>
$$E_{\text{DC}} = \frac{3{,}200\ \text{W} \times 1{.}45}{1{,}000\ \text{tok/s}} = 4{.}64\ \text{J/tok} = 1{.}29 \times 10^{-3}\ \text{Wh/tok}$$
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Country / hour&lt;/th>
&lt;th>Intensity (gCO₂/kWh)&lt;/th>
&lt;th>gCO₂ per 1,000 tokens&lt;/th>
&lt;th>gCO₂ per 1M tokens&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>France (2025 average)&lt;/td>
&lt;td>19.6&lt;/td>
&lt;td>0.025&lt;/td>
&lt;td>25.3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Spain solar (summer midday)&lt;/td>
&lt;td>~50&lt;/td>
&lt;td>0.064&lt;/td>
&lt;td>64.5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Spain 2024 average&lt;/td>
&lt;td>~108&lt;/td>
&lt;td>0.140&lt;/td>
&lt;td>139.3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Spain night-time gas (winter)&lt;/td>
&lt;td>~220&lt;/td>
&lt;td>0.284&lt;/td>
&lt;td>283.8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Germany 2025 average&lt;/td>
&lt;td>~328&lt;/td>
&lt;td>0.423&lt;/td>
&lt;td>423.0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Germany coal peak&lt;/td>
&lt;td>~550&lt;/td>
&lt;td>0.709&lt;/td>
&lt;td>709.0&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The range is ×28 between the French average and the German peak. Between the two hourly extremes
in Spain (solar vs winter night-time gas) the difference is ×4.4. The choice of country
and of execution hour moves carbon per token more than any hardware or engine
optimisation within that range.&lt;/p>
&lt;hr>
&lt;h2 id="scope-2-and-scope-3-what-counts-and-what-does-not">Scope 2 and Scope 3: what counts and what does not&lt;/h2>
&lt;h3 id="ghg-protocol-scopes">GHG Protocol scopes&lt;/h3>
&lt;p>The GHG Protocol defines three scopes for corporate emissions:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Scope&lt;/th>
&lt;th>Definition&lt;/th>
&lt;th>Datacenter example&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Scope 1&lt;/strong>&lt;/td>
&lt;td>Direct emissions from owned or controlled sources&lt;/td>
&lt;td>Emergency diesel generators&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Scope 2&lt;/strong>&lt;/td>
&lt;td>Indirect emissions from purchased electricity consumption&lt;/td>
&lt;td>Electricity consumption of the cluster&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Scope 3&lt;/strong>&lt;/td>
&lt;td>Other indirect emissions in the value chain&lt;/td>
&lt;td>Hardware manufacturing (embodied carbon)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>For an on-premise inference platform, &lt;strong>Scope 2&lt;/strong> is the dominant item in
operation; &lt;strong>upstream Scope 3&lt;/strong> (manufacturing of servers and GPUs) is typically the
second largest item over the hardware life cycle.&lt;/p>
&lt;h3 id="scope-2-location-based-vs-market-based">Scope 2: location-based vs market-based&lt;/h3>
&lt;p>The GHG Protocol Scope 2 Guidance (2015, under public revision 2025–2027) establishes two
accounting methods, both mandatory in corporate reporting:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Method&lt;/th>
&lt;th>What it measures&lt;/th>
&lt;th>How it is obtained&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Location-based&lt;/strong>&lt;/td>
&lt;td>Actual intensity of the electricity grid where the facility sits&lt;/td>
&lt;td>Emission factor of the national or regional grid (published by operators such as REE, RTE)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Market-based&lt;/strong>&lt;/td>
&lt;td>Intensity according to the contractual instruments for energy purchase&lt;/td>
&lt;td>Guarantees of Origin (GoO), PPAs or tariffs with a renewable attribute&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The revision under public consultation (October 2025) proposes requiring, for the first time,
hourly matching for the market-based method: buying 100 MWh
of solar over a year is not enough if it is consumed in hours without sun. The aim is for
market-based to reflect physical electricity and not just accounting certificates.&lt;/p>
&lt;p>For an inference cluster, the location-based method with hourly intensity (not an annual
average) is the most informative for carbon-aware operation: it shows in real time what
emissions each token generates.&lt;/p>
&lt;h3 id="marginal-vs-average-emissions">Marginal vs average emissions&lt;/h3>
&lt;p>This distinction, documented by ElectricityMaps and WattTime, is fundamental for evaluating
the real impact of scheduling decisions:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Definition&lt;/th>
&lt;th>When to use&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Average&lt;/strong>&lt;/td>
&lt;td>The share of all grid emissions attributable to the consumer according to their quota&lt;/td>
&lt;td>Location-based Scope 2 carbon reporting&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Marginal&lt;/strong> (MOER)&lt;/td>
&lt;td>Emissions of the generator that would respond to a marginal increase in load&lt;/td>
&lt;td>Evaluating the causal impact of adding or moving load&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Textbook example from ElectricityMaps: in a grid with 50 % wind (0 gCO₂/kWh) and
50 % gas (500 gCO₂/kWh), the average intensity is 250 gCO₂/kWh, but the marginal factor
is ~500 gCO₂/kWh (gas is the plant that responds to the demand increase). Reducing
load avoids 500 gCO₂/kWh, even though the Scope 2 report records only 250 gCO₂/kWh.&lt;/p>
&lt;p>Marginal and average &lt;strong>must never be mixed&lt;/strong> in the same accounting: they represent different
attribution paradigms (the GHG Protocol and ElectricityMaps both say so explicitly).&lt;/p>
&lt;h3 id="scope-3-the-embodied-carbon-of-the-hardware">Scope 3: the embodied carbon of the hardware&lt;/h3>
&lt;p>Embodied carbon is the CO₂eq footprint generated during
manufacturing, transport and end of life of the hardware. For GPUs and high-performance
servers, this item is significant:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Item&lt;/th>
&lt;th>Indicative value&lt;/th>
&lt;th>Source&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Service life of a datacenter server&lt;/td>
&lt;td>3–5 years&lt;/td>
&lt;td>AWS / industry&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Service life of the datacenter facility&lt;/td>
&lt;td>15–20 years&lt;/td>
&lt;td>industry&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Amortisation methodology&lt;/td>
&lt;td>Embodied carbon / years of service life&lt;/td>
&lt;td>GHG Protocol / AWS methodology 2025&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Embodied carbon of an AI server (indicative)&lt;/td>
&lt;td>1,000–3,000 kgCO₂eq (cradle-to-gate)&lt;/td>
&lt;td>AWS Embodied Carbon methodology&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Embodied carbon is amortised over the service life of the hardware: a server with
1,500 kgCO₂eq of embodied carbon and a 4-year service life contributes 375 kgCO₂eq/year of
Scope 3, regardless of how much it is used. A high utilisation rate reduces the
embodied carbon per token (the same hardware produces more functional value).&lt;/p>
&lt;p>None of the public LLM energy leaderboards (HF AI Energy Score, ML.ENERGY,
MLPerf Power) include Scope 3 in their metrics. The SCI specification incorporates it
explicitly.&lt;/p>
&lt;hr>
&lt;h2 id="the-full-conversion-from-jtoken-to-gcotoken">The full conversion: from J/token to gCO₂/token&lt;/h2>
&lt;h3 id="the-equation">The equation&lt;/h3>
$$\text{gCO}_{2}\text{/token} = \frac{E_{\text{board}}\ [\text{Wh/tok}] \times \text{PUE} \times I_{\text{grid}}\ [\text{gCO}_{2}\text{/kWh}]}{1{,}000}$$
&lt;p>where:&lt;/p>
&lt;ul>
&lt;li>\(E_{\text{board}}\) is the energy per token measured at GPU/node level (without PUE)&lt;/li>
&lt;li>\(\text{PUE}\) multiplies by the datacenter overhead&lt;/li>
&lt;li>\(I_{\text{grid}}\) is the grid carbon intensity at the moment of execution&lt;/li>
&lt;li>Dividing by 1,000 converts Wh to kWh&lt;/li>
&lt;/ul>
&lt;p>For the reference node (4×H100 SXM, throughput 1,000 tok/s, GPU+CPU+RAM consumption
3,200 W, PUE 1.45):&lt;/p>
$$E_{\text{board}} = \frac{3{,}200\ \text{W}}{1{,}000\ \text{tok/s}} = 3{.}2\ \text{J/tok} = 8{.}9 \times 10^{-4}\ \text{kWh/tok}$$
&lt;p>Then, applying PUE 1.45:&lt;/p>
$$E_{\text{DC}} = 8{.}9 \times 10^{-4} \times 1{.}45 = 1{.}29 \times 10^{-3}\ \text{kWh/tok}$$
&lt;p>And the emissions:&lt;/p>
$$\text{gCO}_{2}/\text{tok} = 1{.}29 \times 10^{-3} \times I_{\text{grid}}$$
&lt;h3 id="full-table-by-region-and-hour">Full table by region and hour&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Scenario&lt;/th>
&lt;th>PUE&lt;/th>
&lt;th>Grid intensity (gCO₂/kWh)&lt;/th>
&lt;th>gCO₂/1,000 tok&lt;/th>
&lt;th>gCO₂/1M tok&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>France 2025 average&lt;/td>
&lt;td>1.45&lt;/td>
&lt;td>19.6&lt;/td>
&lt;td>0.025&lt;/td>
&lt;td>25.3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Spain solar (summer midday)&lt;/td>
&lt;td>1.45&lt;/td>
&lt;td>50&lt;/td>
&lt;td>0.064&lt;/td>
&lt;td>64.5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Spain 2024 average&lt;/td>
&lt;td>1.45&lt;/td>
&lt;td>108&lt;/td>
&lt;td>0.139&lt;/td>
&lt;td>139.3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Spain night-time gas (winter)&lt;/td>
&lt;td>1.45&lt;/td>
&lt;td>220&lt;/td>
&lt;td>0.284&lt;/td>
&lt;td>283.8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Germany 2025 average&lt;/td>
&lt;td>1.45&lt;/td>
&lt;td>328&lt;/td>
&lt;td>0.423&lt;/td>
&lt;td>423.0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Germany coal peak&lt;/td>
&lt;td>1.45&lt;/td>
&lt;td>550&lt;/td>
&lt;td>0.709&lt;/td>
&lt;td>709.0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Spain solar + hyperscale PUE&lt;/td>
&lt;td>1.12&lt;/td>
&lt;td>50&lt;/td>
&lt;td>0.050&lt;/td>
&lt;td>50.0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Spain night-time gas + legacy PUE&lt;/td>
&lt;td>1.80&lt;/td>
&lt;td>220&lt;/td>
&lt;td>0.354&lt;/td>
&lt;td>354.0&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The PUE factor matters more in high-intensity scenarios: going from PUE 1.12 to 1.80
at the German coal peak moves the result from ~617 to ~860 gCO₂/1M tok (+39 %). In solar
Spain, the same PUE change moves it from 50 to 79 gCO₂/1M tok; the low grid intensity
cushions the impact of poor PUE.&lt;/p>
&lt;hr>
&lt;h2 id="carbon-aware-shifting-temporal-and-spatial">Carbon-aware shifting: temporal and spatial&lt;/h2>
&lt;h3 id="principle-and-tools">Principle and tools&lt;/h3>
&lt;p>Carbon-aware computing means running flexible load (batch, training,
fine-tuning, document ingestion) when and where the grid carbon intensity is
lower. The reference OSS tool is the &lt;strong>Carbon Aware SDK&lt;/strong> (Green Software
Foundation, Apache 2.0): a wrapper that queries ElectricityMaps or WattTime and returns
the current and forecast intensity for a zone and time window.&lt;/p>
&lt;p>The SDK distinguishes two types of shifting:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Applicable to&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Temporal&lt;/strong>&lt;/td>
&lt;td>Delaying or advancing execution within the same datacenter to a lower-carbon hour&lt;/td>
&lt;td>Batch, training, deferrable tasks with a loose deadline&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Spatial&lt;/strong>&lt;/td>
&lt;td>Moving the load to a geographic region with lower intensity at that moment&lt;/td>
&lt;td>Multi-cloud or multi-datacenter; requires model/data replication&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>For an on-premise platform in a single datacenter, only temporal shifting is
immediately applicable. Spatial shifting requires multi-site infrastructure.&lt;/p>
&lt;h3 id="quantifying-the-temporal-saving">Quantifying the temporal saving&lt;/h3>
&lt;p>Recent research (arXiv 2512.07799, 2512.08725; Microsoft Carbon-Aware
Computing Whitepaper) quantifies the saving from temporal shifting of batch load:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Study / case&lt;/th>
&lt;th>Emissions saving&lt;/th>
&lt;th>Conditions&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Batch load with 24 h shifting (simulation, several grids)&lt;/td>
&lt;td>&lt;strong>20–40 %&lt;/strong> emissions reduction&lt;/td>
&lt;td>24 h window, grid with a renewable-fossil mix&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ML training with shifting against grid forecast (Microsoft)&lt;/td>
&lt;td>~&lt;strong>30 %&lt;/strong>&lt;/td>
&lt;td>Azure, shifting against forecast intensity&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Greedy heuristics vs optimum (arXiv 2512.07799)&lt;/td>
&lt;td>≥ 90 % of the optimum&lt;/td>
&lt;td>Simple one-migration or greedy deferral&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>UBS + Microsoft, Azure Batch, 24 h window&lt;/td>
&lt;td>Validated with the Carbon Aware SDK&lt;/td>
&lt;td>Real temporal shifting in production&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>For Spain, where the price-carbon correlation is −0.70, shifting to solar hours
cuts both electricity cost and emissions per token at the same time. In the 477 hours with
negative prices recorded in 2025 (ElectricityMaps / REE), carbon intensity was
also at a minimum. The coincidence between clean hour and cheap hour means that
carbon-aware scheduling has no economic opportunity cost in Spain: optimising carbon and cost
point to the same time window.&lt;/p>
&lt;h3 id="quantification-for-the-reference-node">Quantification for the reference node&lt;/h3>
&lt;p>For a 1-hour batch task on the reference node (4×H100 SXM, 4,640 W total
with PUE 1.45), generating ~3,600 million tokens per hour:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Scenario&lt;/th>
&lt;th>Intensity (gCO₂/kWh)&lt;/th>
&lt;th>Emissions per batch hour&lt;/th>
&lt;th>Saving vs non-deferred execution&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>No shifting (Spain average)&lt;/td>
&lt;td>108&lt;/td>
&lt;td>&lt;strong>501 gCO₂&lt;/strong>&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Shifted to a solar hour (50 gCO₂/kWh)&lt;/td>
&lt;td>50&lt;/td>
&lt;td>&lt;strong>232 gCO₂&lt;/strong>&lt;/td>
&lt;td>&lt;strong>−54 %&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Shifted to a night-time gas hour (220 gCO₂/kWh)&lt;/td>
&lt;td>220&lt;/td>
&lt;td>&lt;strong>1,021 gCO₂&lt;/strong>&lt;/td>
&lt;td>+104 % (worst moment)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The range between the worst and the best moment to run that batch is ×4.4 in emissions.
Shifting to the cleanest hour available in a 24-hour window in Spain typically avoids
between 40 % and 60 % of the emissions of deferrable work.&lt;/p>
&lt;hr>
&lt;h2 id="the-sci-standard-software-carbon-intensity">The SCI standard: Software Carbon Intensity&lt;/h2>
&lt;h3 id="specification">Specification&lt;/h3>
&lt;p>&lt;strong>Software Carbon Intensity (SCI)&lt;/strong> is a Green Software
Foundation specification, published as standard ISO/IEC 21031:2022 and maintained on GitHub
(github.com/Green-Software-Foundation/sci). It defines a rate of carbon emissions
per functional unit of software:&lt;/p>
$$\text{SCI} = \frac{(E \times I) + M}{R}$$
&lt;p>where:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symbol&lt;/th>
&lt;th>Meaning&lt;/th>
&lt;th>Units&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>\(E\)&lt;/td>
&lt;td>Energy consumed by the software system (servers, network, user devices)&lt;/td>
&lt;td>kWh&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>\(I\)&lt;/td>
&lt;td>Carbon intensity of the energy consumed (location-based or another declared basis)&lt;/td>
&lt;td>gCO₂eq/kWh&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>\(M\)&lt;/td>
&lt;td>Embodied carbon of the hardware, amortised by time of use and utilisation percentage&lt;/td>
&lt;td>gCO₂eq&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>\(R\)&lt;/td>
&lt;td>Functional unit (the denominator that normalises the rate)&lt;/td>
&lt;td>per API call, per token, per user, etc.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>For an LLM inference platform, \(R\) is naturally the output token or the
query. SCI in gCO₂eq/token therefore includes the three components that most
current analyses omit: PUE implicit in \(E\), hourly intensity in \(I\), and
embodied carbon in \(M\).&lt;/p>
&lt;h3 id="key-difference-from-the-simple-calculation">Key difference from the simple calculation&lt;/h3>
&lt;p>The calculation \(E \times I\) (energy × grid intensity) is operational Scope 2. SCI
adds \(M\), the Scope 3 of the hardware, which has a different structure:&lt;/p>
$$M = \frac{\text{total embodied carbon (gCO2eq)}}{\text{service life (hours)}} \times \frac{\text{hours of use}}{1} \times \frac{\text{allocated resources}}{\text{total server resources}}$$
&lt;p>For an AI server with 1,500 kgCO₂eq of embodied carbon, a 4-year service life
(~35,040 hours) and 80 % utilisation:&lt;/p>
$$M_{\text{hour}} = \frac{1{,}500{,}000\ \text{gCO2eq}}{35{,}040\ \text{h}} \times 0{.}80 \approx 34\ \text{gCO2eq/h}$$
&lt;p>With 3,600 million tokens per hour:&lt;/p>
$$M_{\text{per token}} \approx \frac{34}{3{.}6 \times 10^{9}} \approx 9{.}4 \times 10^{-9}\ \text{gCO2eq/tok}$$
&lt;p>At this scale, embodied carbon per token is negligible against operational Scope 2
during operation. However, \(M\) becomes dominant in two cases: underutilised
hardware (low utilisation amplifies the cost per token) and hardware with a very
short life cycle (chips replaced every 2 years instead of 4).&lt;/p>
&lt;h3 id="sci-as-the-reference-metric-for-the-track">SCI as the reference metric for the track&lt;/h3>
&lt;p>The SCI specification and its AI extension (github.com/Green-Software-Foundation/sci-ai)
are being adopted as the reference metric for reporting the carbon footprint of
AI systems in companies subject to CSRD. It provides a common denominator, gCO₂eq per
functional unit, that allows architectures, regions and scheduling strategies to be
compared on the same basis.&lt;/p>
&lt;hr>
&lt;h2 id="limits-of-the-calculation-and-honesty">Limits of the calculation, and honesty&lt;/h2>
&lt;p>No gCO₂/token calculation captures the full reality. The limits of the model
set out in this article:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Limit&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Annual average vs hourly intensity&lt;/strong>&lt;/td>
&lt;td>Using the country&amp;rsquo;s annual average as the emission factor gives a stable but fictitious result. Intensity varies ×4–10× within a day. For location-based Scope 2 reporting with hourly data, the difference can be 30–50 % relative to the average.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Static PUE&lt;/strong>&lt;/td>
&lt;td>PUE varies with outdoor temperature (cooling works harder in summer) and with IT load. The declared PUE is an average; on hot days it can be 10–20 % worse.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Constant throughput&lt;/strong>&lt;/td>
&lt;td>The calculation uses throughput at full load. In production, with variable demand, consumption does not scale linearly with throughput; efficiency per token gets worse at low load.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Partial Scope 3&lt;/strong>&lt;/td>
&lt;td>Embodied carbon here covers only the IT hardware. It does not include the construction of the datacenter building, the manufacture of cooling equipment, or the energy supply chain.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>National emission factors&lt;/strong>&lt;/td>
&lt;td>The per-country values are annual averages. France has low intraday variation (nuclear dominates); Spain and Germany have high variation. The national factor is useful for order-of-magnitude comparisons, not for operational scheduling.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Embodied carbon of GPUs&lt;/strong>&lt;/td>
&lt;td>Lifecycle assessment data for AI chips such as the H100 are not public. Estimates rely on die-area models, which carry ±30–50 % uncertainty.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Spatial shifting omitted&lt;/strong>&lt;/td>
&lt;td>This article covers temporal shifting only. Spatial shifting (moving load between regions) can add another 20–40 % of reduction but requires multi-site infrastructure.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Cooling water and other impacts&lt;/strong>&lt;/td>
&lt;td>gCO₂eq does not capture cooling water consumption (WUE, Water Usage Effectiveness), another environmental impact indicator relevant to arid zones such as southern Spain.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/ai-energy-benchmarking-frameworks-metrics-state-of-the-art/">C1 — Energy benchmarking of LLM frameworks: state of the art&lt;/a>&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 electricity market&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/measuring-energy-in-production-kepler-dcgm-stack/">C3 — Measurement tools in deployment: accuracy and overhead&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/mlperf-power-energy-efficiency-benchmark/">C4 — MLPerf Power: the certified standard benchmark&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-energy-leaderboards-wh-per-token/">C5 — LLM energy leaderboards&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>Uptime Institute · Global Data Center Survey 2025 (PUE medio global 1,54, 15.ª edición) — &lt;a href="https://uptimeinstitute.com/resources/research-and-reports/uptime-institute-global-data-center-survey-results-2025">https://uptimeinstitute.com/resources/research-and-reports/uptime-institute-global-data-center-survey-results-2025&lt;/a>&lt;/li>
&lt;li>Uptime Institute Blog · Global PUEs — are they going anywhere? — &lt;a href="https://journal.uptimeinstitute.com/global-pues-are-they-going-anywhere/">https://journal.uptimeinstitute.com/global-pues-are-they-going-anywhere/&lt;/a>&lt;/li>
&lt;li>Uptime Institute Blog · Large data centers are mostly more efficient — &lt;a href="https://journal.uptimeinstitute.com/large-data-centers-are-mostly-more-efficient-analysis-confirms/">https://journal.uptimeinstitute.com/large-data-centers-are-mostly-more-efficient-analysis-confirms/&lt;/a>&lt;/li>
&lt;li>ElectricityMaps · Electricity Grid Review 2025: Spain (precio, intensidad, correlación precio-carbono −0,70) — &lt;a href="https://www.electricitymaps.com/grid-in-review-2025/spain">https://www.electricitymaps.com/grid-in-review-2025/spain&lt;/a>&lt;/li>
&lt;li>ElectricityMaps · Marginal emissions — what they are, and when to use them (actualizado enero 2025) — &lt;a href="https://www.electricitymaps.com/resources/publications/marginal-emissions-introduction">https://www.electricitymaps.com/resources/publications/marginal-emissions-introduction&lt;/a>&lt;/li>
&lt;li>ElectricityMaps · Interactive map and API — &lt;a href="https://app.electricitymaps.com">https://app.electricitymaps.com&lt;/a>&lt;/li>
&lt;li>WattTime · Average vs marginal emissions — &lt;a href="https://watttime.org/data-science/data-signals/average-vs-marginal/">https://watttime.org/data-science/data-signals/average-vs-marginal/&lt;/a>&lt;/li>
&lt;li>WattTime · REsurety-WattTime free global marginal emissions platform (marzo 2025) — &lt;a href="https://watttime.org/news-and-insights/resurety-and-watttime-announce-release-of-free-electricity-marginal-carbon-platform/">https://watttime.org/news-and-insights/resurety-and-watttime-announce-release-of-free-electricity-marginal-carbon-platform/&lt;/a>&lt;/li>
&lt;li>Red Eléctrica de España (REE) · Renewable energies generated 56 % of Spain&amp;rsquo;s electricity mix in 2024 — &lt;a href="https://www.ree.es/en/press-office/press-release/news/press-release/2025/01/renewable-energies-generated-56-per-cent-spains-electricity-mix-2024">https://www.ree.es/en/press-office/press-release/news/press-release/2025/01/renewable-energies-generated-56-per-cent-spains-electricity-mix-2024&lt;/a>&lt;/li>
&lt;li>Nowtricity · CO₂ emissions per kWh in Spain (media 2024: 108 gCO₂eq/kWh) — &lt;a href="https://www.nowtricity.com/country/spain/">https://www.nowtricity.com/country/spain/&lt;/a>&lt;/li>
&lt;li>RTE · Bilan électrique 2025 — GHG Emissions (Francia 2025: 19,6 gCO₂eq/kWh) — &lt;a href="https://analysesetdonnees.rte-france.com/en/annual-review-2025/ghg-emissions">https://analysesetdonnees.rte-france.com/en/annual-review-2025/ghg-emissions&lt;/a>&lt;/li>
&lt;li>RTE · Bilan électrique 2024 key findings (Francia 2024: 21,7 gCO₂eq/kWh) — &lt;a href="https://assets.rte-france.com/analyse-et-donnees/2025-11/RTE%20-%20Annual%20electricity%20review%202024%20-%20Key%20findings.pdf">https://assets.rte-france.com/analyse-et-donnees/2025-11/RTE%20-%20Annual%20electricity%20review%202024%20-%20Key%20findings.pdf&lt;/a>&lt;/li>
&lt;li>Fraunhofer ISE · German Public Electricity Generation in 2025 (Alemania 2025: ~328 gCO₂/kWh) — &lt;a href="https://www.ise.fraunhofer.de/en/press-media/press-releases/2026/german-public-electricity-generation-in-2025-wind-and-solar-power-take-the-lead.html">https://www.ise.fraunhofer.de/en/press-media/press-releases/2026/german-public-electricity-generation-in-2025-wind-and-solar-power-take-the-lead.html&lt;/a>&lt;/li>
&lt;li>Ember · European Electricity Review 2025 (intensidad UE media: 213 gCO₂/kWh) — &lt;a href="https://ember-energy.org/latest-insights/european-electricity-review-2025/five-years-of-progress/">https://ember-energy.org/latest-insights/european-electricity-review-2025/five-years-of-progress/&lt;/a>&lt;/li>
&lt;li>GHG Protocol · Scope 2 Standard Advances (consulta pública 2025, hourly matching, market-based revisions) — &lt;a href="https://ghgprotocol.org/blog/scope-2-standard-advances-isb-approves-consultation-market-and-location-based-revisions">https://ghgprotocol.org/blog/scope-2-standard-advances-isb-approves-consultation-market-and-location-based-revisions&lt;/a>&lt;/li>
&lt;li>GHG Protocol · Public Consultation Scope 2 (octubre 2025) — &lt;a href="https://ghgprotocol.org/sites/default/files/2025-10/GHG-Protocol-Scope2-Public-Consultation.pdf">https://ghgprotocol.org/sites/default/files/2025-10/GHG-Protocol-Scope2-Public-Consultation.pdf&lt;/a>&lt;/li>
&lt;li>Green Software Foundation · Software Carbon Intensity (SCI) Specification — &lt;a href="https://sci.greensoftware.foundation/">https://sci.greensoftware.foundation/&lt;/a>&lt;/li>
&lt;li>Green Software Foundation · SCI GitHub (ISO/IEC 21031:2022) — &lt;a href="https://github.com/Green-Software-Foundation/sci">https://github.com/Green-Software-Foundation/sci&lt;/a>&lt;/li>
&lt;li>Green Software Foundation · SCI for AI — &lt;a href="https://github.com/Green-Software-Foundation/sci-ai">https://github.com/Green-Software-Foundation/sci-ai&lt;/a>&lt;/li>
&lt;li>Green Software Foundation · Carbon Aware SDK (Apache 2.0) — &lt;a href="https://github.com/Green-Software-Foundation/carbon-aware-sdk">https://github.com/Green-Software-Foundation/carbon-aware-sdk&lt;/a>&lt;/li>
&lt;li>Green Software Foundation · Carbon-Aware Computing Whitepaper — UBS/Microsoft Azure Batch case — &lt;a href="https://greensoftware.foundation/articles/carbon-aware-computing-whitepaper-how-ubs-succeeded-in-measuring-and-reducing-car/">https://greensoftware.foundation/articles/carbon-aware-computing-whitepaper-how-ubs-succeeded-in-measuring-and-reducing-car/&lt;/a>&lt;/li>
&lt;li>arXiv 2512.07799 · Quantifying the Carbon Reduction of DAG Workloads: A Job Shop Scheduling Perspective — &lt;a href="https://arxiv.org/abs/2512.07799">https://arxiv.org/abs/2512.07799&lt;/a>&lt;/li>
&lt;li>arXiv 2512.08725 · Spatio-Temporal Shifting to Reduce Carbon, Water, and Land-Use Footprints of Cloud Workloads — &lt;a href="https://arxiv.org/abs/2512.08725">https://arxiv.org/abs/2512.08725&lt;/a>&lt;/li>
&lt;li>AWS · How AWS estimates embodied emissions of IT hardware (Scope 3 methodology, 2025) — &lt;a href="https://aws.amazon.com/blogs/infrastructure-sustainability/how-aws-estimates-embodied-emissions-of-it-hardware-the-science-and-technology-behind-the-latest-customer-carbon-footprint-methodology/">https://aws.amazon.com/blogs/infrastructure-sustainability/how-aws-estimates-embodied-emissions-of-it-hardware-the-science-and-technology-behind-the-latest-customer-carbon-footprint-methodology/&lt;/a>&lt;/li>
&lt;li>CodeCarbon · Track and reduce CO₂ emissions from your local computing — &lt;a href="https://codecarbon.io/">https://codecarbon.io/&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>LLM energy leaderboards: comparing models by Wh/token and choosing on efficiency</title><link>https://blog.lo0.es/en/posts/llm-energy-leaderboards-wh-per-token/</link><pubDate>Tue, 16 Jun 2026 04:00:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/llm-energy-leaderboards-wh-per-token/</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). Generic example hardware; no real infrastructure.&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>There are three OSS leaderboards with public data and documented methodology for comparing the energy efficiency of LLMs in inference: Hugging Face AI Energy Score (166 models, Wh/query on H100, 1–5 star scale, launched February 2025), ML.ENERGY Leaderboard v3 (University of Michigan, J/token per task, Zeus tooling, December 2025) and MLPerf Power (samples/joule certified with a physical Yokogawa WT310E power meter). The three measure different dimensions and are not directly interchangeable. The available data shows that reasoning models consume up to 700× more energy than their non-reasoning equivalents; that MoE models consume roughly 3× fewer J/token than a dense model with equivalent active parameters; and that INT4 quantisation cuts consumption by up to 79 % against FP16 under favourable conditions. The inference engine (vLLM vs Transformers) can move the result another 25–40 %. Without fixing hardware, engine, batch size and task, no comparison between leaderboards is valid.&lt;/p>
&lt;hr>
&lt;h2 id="track-context">Track context&lt;/h2>
&lt;p>This article is C5 of the energy pillar. The base context:&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>&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&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/measuring-energy-in-production-kepler-dcgm-stack/">C3 — Measurement tooling in deployment&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/mlperf-power-energy-efficiency-benchmark/">C4 — MLPerf Power&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>The &lt;a href="https://blog.lo0.es/en/posts/quantization-llm-inference-fp8-int4-gguf/">fundamentals of quantisation&lt;/a> are a prerequisite for the quantisation section of this article.&lt;/p>
&lt;hr>
&lt;h2 id="the-three-leaderboards-technical-data-sheet">The three leaderboards: technical data sheet&lt;/h2>
&lt;h3 id="1--hugging-face-ai-energy-score">1 · Hugging Face AI Energy Score&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Detail&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>URL&lt;/strong>&lt;/td>
&lt;td>huggingface.co/AIEnergyScore · huggingface.co/spaces/AIEnergyScore/Leaderboard&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Organisation&lt;/strong>&lt;/td>
&lt;td>Hugging Face (Sasha Luccioni et al.), with Salesforce and Cohere as initial partners&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Launch&lt;/strong>&lt;/td>
&lt;td>February 2025 (AI Action Summit, Paris); v2 December 2025&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Models indexed&lt;/strong>&lt;/td>
&lt;td>166 (v1, Feb 2025); +39 new ones in v2 (Dec 2025)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Tasks measured&lt;/strong>&lt;/td>
&lt;td>10 tasks: text generation, summarisation, classification, image generation, ASR, audio generation, translation, question answering, reasoning (added in v2)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Unit of measurement&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Wh (watt-hour) per 1,000 queries&lt;/strong> of the task&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Reference hardware&lt;/strong>&lt;/td>
&lt;td>&lt;strong>NVIDIA H100&lt;/strong> exclusively (a single GPU for class A/B models; multiple for class C)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Measurement tooling&lt;/strong>&lt;/td>
&lt;td>CodeCarbon (GPU energy) + the &lt;code>ai-energy-benchmarks&lt;/code> package (OSS, PyPI)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Rating system&lt;/strong>&lt;/td>
&lt;td>1–5 stars per task: quintiles of the energy range; ⭐⭐⭐⭐⭐ = the 20 % most efficient&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Reference batch size&lt;/strong>&lt;/td>
&lt;td>Batch size = 1 (does not reflect production with aggressive batching)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Access for proprietary models&lt;/strong>&lt;/td>
&lt;td>Yes, via an audited Docker container&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Update frequency&lt;/strong>&lt;/td>
&lt;td>No fixed cadence; v1 Feb 2025, v2 Dec 2025&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Project licence&lt;/strong>&lt;/td>
&lt;td>Apache 2.0 (repository github.com/huggingface/AIEnergyScore)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Scope of the metric. The AI Energy Score measures GPU energy only (CodeCarbon); it does not capture CPU, DRAM or system overhead. The Wh/1k-queries unit covers the whole run time (prefill + decode + framework overhead), but at batch = 1. The results are therefore comparable between models under the same test conditions, but not extrapolable to a production environment with real concurrency without correction.&lt;/p>
&lt;p>Model class (the project&amp;rsquo;s internal classification):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Class&lt;/th>
&lt;th>Definition&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>A&lt;/td>
&lt;td>Fits on a consumer GPU (≤ ~24 GB VRAM)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>B&lt;/td>
&lt;td>Requires a cloud GPU (≥ 40 GB VRAM)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>C&lt;/td>
&lt;td>Requires multiple GPUs&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3 id="2--mlenergy-leaderboard">2 · ML.ENERGY Leaderboard&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Detail&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>URL&lt;/strong>&lt;/td>
&lt;td>ml.energy/leaderboard&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Organisation&lt;/strong>&lt;/td>
&lt;td>Symbiotic Lab, University of Michigan (Mosharaf Chowdhury, Jae-Won Chung et al.)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Reference paper&lt;/strong>&lt;/td>
&lt;td>arXiv 2505.06371 — &amp;ldquo;The ML.ENERGY Benchmark: Toward Automated Inference Energy Measurement and Optimization&amp;rdquo; (NeurIPS 2025 D&amp;amp;B, Spotlight)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Current version&lt;/strong>&lt;/td>
&lt;td>v3.0 (December 2025)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Measurement tooling&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Zeus&lt;/strong> (github.com/ml-energy/zeus) via NVML + RAPL; measurement overhead in single-digit ms&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Unit of measurement&lt;/strong>&lt;/td>
&lt;td>&lt;strong>J/token&lt;/strong> (energy per output token generated) and total energy per complete response&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Reference hardware&lt;/strong>&lt;/td>
&lt;td>NVIDIA A100 80 GB and H100 SXM (declared per submission; varies between models)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Tasks measured&lt;/strong>&lt;/td>
&lt;td>6 tasks: chat (text conversation), reasoning, code generation, summarisation, visual question answering, video generation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Normalisation&lt;/strong>&lt;/td>
&lt;td>Mean energy per complete response (prefill + decode). Output J/token is also reported. The task is stated explicitly because it determines the output length&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Scope of the measurement&lt;/strong>&lt;/td>
&lt;td>GPU via NVML + CPU/DRAM via RAPL; not a power meter at the wall&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Models covered&lt;/strong>&lt;/td>
&lt;td>~40 architectures in the NeurIPS 2025 version; the web leaderboard is updated with more&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Licence&lt;/strong>&lt;/td>
&lt;td>Apache 2.0 (zeus: github.com/ml-energy/zeus); MIT (benchmark: github.com/ml-energy/benchmark)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Update frequency&lt;/strong>&lt;/td>
&lt;td>Continuous on the web leaderboard; the paper is a point-in-time snapshot&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Zeus as tooling. Zeus is the measurement engine of the ML.ENERGY Leaderboard and also a standalone package (&lt;code>pip install zeus-ml&lt;/code>). It supports NVIDIA GPU (NVML), AMD GPU (ROCm), CPU (RAPL), DRAM (RAPL), Apple Silicon and NVIDIA Jetson. The &lt;code>ZeusMonitor&lt;/code> adds measurement overhead in single-digit milliseconds. Since May 2025 it has been a PyTorch ecosystem project. MIT licence.&lt;/p>
&lt;hr>
&lt;h3 id="3--mlperf-power">3 · MLPerf Power&lt;/h3>
&lt;p>The full data sheet is in the &lt;a href="https://blog.lo0.es/en/posts/mlperf-power-energy-efficiency-benchmark/">C4 article&lt;/a>. A summary of the points relevant for comparison with the previous two:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Detail&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>URL&lt;/strong>&lt;/td>
&lt;td>mlcommons.org/benchmarks/inference-datacenter/&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Organisation&lt;/strong>&lt;/td>
&lt;td>MLCommons Power Working Group (&amp;gt;20 orgs)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Unit of measurement&lt;/strong>&lt;/td>
&lt;td>&lt;strong>samples/joule&lt;/strong> (throughput/mean power) = the inverse of J/sample&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Hardware&lt;/strong>&lt;/td>
&lt;td>Complete node measured at the wall (AC); Yokogawa WT310E analyser (±0.1 % of reading)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>LLM tasks&lt;/strong>&lt;/td>
&lt;td>GPT-J 6B, Llama 2 70B, Mixtral 8×7B (from v5.0)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Granularity&lt;/strong>&lt;/td>
&lt;td>Complete node (GPU + CPU + RAM + fans + PSU losses); no attribution to individual workloads&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Node overhead over GPU&lt;/strong>&lt;/td>
&lt;td>25–45 % of total consumption in submissions with a physical analyser&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Licence of the corpus&lt;/strong>&lt;/td>
&lt;td>Public results on GitHub (mlcommons/inference_results_vX.Y); PTDaemon requires MLCommons membership&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="comparison-of-the-three-leaderboards">Comparison of the three leaderboards&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Dimension&lt;/th>
&lt;th>HF AI Energy Score&lt;/th>
&lt;th>ML.ENERGY Leaderboard&lt;/th>
&lt;th>MLPerf Power&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Unit&lt;/strong>&lt;/td>
&lt;td>Wh/1k-queries&lt;/td>
&lt;td>Output J/token&lt;/td>
&lt;td>samples/J (complete node)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Fixed hardware&lt;/strong>&lt;/td>
&lt;td>H100 (all models)&lt;/td>
&lt;td>A100/H100 (varies)&lt;/td>
&lt;td>Depends on the submitter&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Measurement&lt;/strong>&lt;/td>
&lt;td>CodeCarbon (GPU)&lt;/td>
&lt;td>Zeus NVML+RAPL&lt;/td>
&lt;td>Physical AC power meter (Yokogawa)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>System coverage&lt;/strong>&lt;/td>
&lt;td>GPU only&lt;/td>
&lt;td>GPU + CPU + DRAM&lt;/td>
&lt;td>Complete node including fans and PSU&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Batch size&lt;/strong>&lt;/td>
&lt;td>1&lt;/td>
&lt;td>Varies by task&lt;/td>
&lt;td>Per LoadGen scenario&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Models covered&lt;/strong>&lt;/td>
&lt;td>166+ (text, image, audio)&lt;/td>
&lt;td>~40 generative LLMs&lt;/td>
&lt;td>Few (GPT-J, Llama 2, Mixtral)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Proprietary models&lt;/strong>&lt;/td>
&lt;td>Yes (audited Docker)&lt;/td>
&lt;td>No (OSS only)&lt;/td>
&lt;td>Yes (MLCommons members)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>External certification&lt;/strong>&lt;/td>
&lt;td>No&lt;/td>
&lt;td>No&lt;/td>
&lt;td>Yes (SPEC PTDaemon)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Frequency&lt;/strong>&lt;/td>
&lt;td>Point-in-time (v1, v2)&lt;/td>
&lt;td>Continuous&lt;/td>
&lt;td>Half-yearly (MLPerf rounds)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Licence&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Apache 2.0 / MIT&lt;/td>
&lt;td>Public results; PTDaemon: membership&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Incompatibility between leaderboards. The three measure different dimensions: Wh/query ≠ J/token ≠ node samples/J. A direct comparison requires converting units and assuming that the hardware, the engine and the task are equivalent, which is rarely the case across leaderboards.&lt;/p>
&lt;hr>
&lt;h2 id="how-energy-per-token-is-measured-and-normalised">How energy per token is measured and normalised&lt;/h2>
&lt;p>The base identity is developed in the &lt;a href="https://blog.lo0.es/en/posts/energy-per-token-spain-methodology-electricity-market-speculation/">C2 article&lt;/a>:&lt;/p>
$$E_{\text{token}} \,[\text{J/tok}] = \frac{\bar{P} \,[\text{W}]}{\text{throughput} \,[\text{tok/s}]}$$
&lt;p>To compare models against each other, every factor other than the model must be fixed:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Factor&lt;/th>
&lt;th>Effect if it varies&lt;/th>
&lt;th>How to fix it&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Hardware&lt;/strong>&lt;/td>
&lt;td>H100 vs A100 vs L40S changes the result by 2–4×&lt;/td>
&lt;td>Declare the exact hardware; compare only within the same HW&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Inference engine&lt;/strong>&lt;/td>
&lt;td>vLLM vs Transformers: 25–40 % difference in J/token&lt;/td>
&lt;td>Fix the engine and the version&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Batch size / concurrency&lt;/strong>&lt;/td>
&lt;td>Batch 1 vs batch 32: throughput rises but so does power; the ratio varies&lt;/td>
&lt;td>Declare the batch size; compare within the same regime&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Model precision&lt;/strong>&lt;/td>
&lt;td>FP16 vs INT8 vs INT4: up to −79 % energy&lt;/td>
&lt;td>Declare the precision; do not mix&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Response length&lt;/strong>&lt;/td>
&lt;td>A query with 50 tokens ≠ one with 500&lt;/td>
&lt;td>Use a fixed dataset or normalise per token&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Measurement window&lt;/strong>&lt;/td>
&lt;td>Including warm-up or idle inflates the numerator&lt;/td>
&lt;td>Align the power window with the token window (see C2)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Conversion formula Wh/query ↔ J/token:&lt;/p>
$$E_{\text{J/tok}} = \frac{E_{\text{Wh/query}} \times 3600}{\bar{n}_{\text{tokens/query}}}$$
&lt;p>Example: if a model consumes 0.05 Wh/query (= 180 J/query) and generates an average of 200 tokens per query:&lt;/p>
$$E_{\text{J/tok}} = \frac{0{.}05 \times 3600}{200} = \frac{180}{200} = 0{.}9 \,\text{J/tok}$$
&lt;hr>
&lt;h2 id="ai-energy-score-data-concrete-examples">AI Energy Score data: concrete examples&lt;/h2>
&lt;p>The v2 data (December 2025, H100 hardware, batch = 1, text generation task with reasoning on/off):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Model&lt;/th>
&lt;th>Active params&lt;/th>
&lt;th>Reasoning&lt;/th>
&lt;th>GPU Wh/1k queries&lt;/th>
&lt;th>Stars (text-gen)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>DistilGPT-2&lt;/td>
&lt;td>82 M&lt;/td>
&lt;td>—&lt;/td>
&lt;td>&lt;strong>1.31&lt;/strong>&lt;/td>
&lt;td>⭐⭐⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SmolLM3-3B&lt;/td>
&lt;td>3 B&lt;/td>
&lt;td>Off&lt;/td>
&lt;td>18.35&lt;/td>
&lt;td>⭐⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SmolLM3-3B&lt;/td>
&lt;td>3 B&lt;/td>
&lt;td>On&lt;/td>
&lt;td>12,791.22&lt;/td>
&lt;td>⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Phi-4-reasoning-plus&lt;/td>
&lt;td>15 B&lt;/td>
&lt;td>Off&lt;/td>
&lt;td>18.42&lt;/td>
&lt;td>⭐⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Phi-4-reasoning-plus&lt;/td>
&lt;td>15 B&lt;/td>
&lt;td>On&lt;/td>
&lt;td>9,461.61&lt;/td>
&lt;td>⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DeepSeek-R1-Distill-Llama-70B&lt;/td>
&lt;td>70 B&lt;/td>
&lt;td>Off&lt;/td>
&lt;td>49.53&lt;/td>
&lt;td>⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DeepSeek-R1-Distill-Llama-70B&lt;/td>
&lt;td>70 B&lt;/td>
&lt;td>On&lt;/td>
&lt;td>7,626.53&lt;/td>
&lt;td>⭐&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Source: Hugging Face AI Energy Score v2 (Dec 2025).&lt;/p>
&lt;p>The reasoning multiplier. The energy increase when reasoning is switched on ranges from ×154 (DeepSeek-R1-Distill-Llama-70B) to ×697 (SmolLM3-3B). The direct cause: reasoning models generate between 300 and 800 times more tokens than their non-reasoning equivalents (internal chains of thought). The mean across the v2 corpus is ×30 extra energy for reasoning.&lt;/p>
&lt;p>Newer models are not always more efficient. Of the 14 comparable models (no reasoning, no MoE, similar size) between the Feb 2025 and Dec 2025 cohorts: 8 out of 14 had equal or higher energy. The range runs from 3 % of the reference model&amp;rsquo;s energy to almost 2×. Parameter scale is no longer enough to estimate efficiency.&lt;/p>
&lt;hr>
&lt;h2 id="mlenergy-leaderboard-data-jtoken-by-family">ML.ENERGY Leaderboard data: J/token by family&lt;/h2>
&lt;p>The data from the arXiv 2505.06371 paper and from leaderboard v3 (A100/H100 hardware, vLLM as the reference engine):&lt;/p>
&lt;p>Scale within one family (Llama 3):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Size&lt;/th>
&lt;th>Params&lt;/th>
&lt;th>Relative J/token (base = 1B)&lt;/th>
&lt;th>Params/energy ratio&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Llama 3 · 1B&lt;/td>
&lt;td>1 B&lt;/td>
&lt;td>1.0×&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama 3 · 8B&lt;/td>
&lt;td>8 B&lt;/td>
&lt;td>~2.1×&lt;/td>
&lt;td>8× params → 2.1× energy&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama 3 · 70B&lt;/td>
&lt;td>70 B&lt;/td>
&lt;td>~7.3×&lt;/td>
&lt;td>70× params → 7.3× energy&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The sublinearity (70× params → 7.3× energy, not 70×) reflects that inference energy is dominated by memory bandwidth (memory-bandwidth bound), not by raw FLOPs.&lt;/p>
&lt;p>Dense vs MoE:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Model&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Total params&lt;/th>
&lt;th>Active params/token&lt;/th>
&lt;th>Relative J/token&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Llama 3 · 8B&lt;/td>
&lt;td>Dense&lt;/td>
&lt;td>8 B&lt;/td>
&lt;td>8 B&lt;/td>
&lt;td>1.0×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Mixtral 8×7B&lt;/td>
&lt;td>MoE (top-2)&lt;/td>
&lt;td>47 B&lt;/td>
&lt;td>~13 B&lt;/td>
&lt;td>~0.33×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama 3 · 70B&lt;/td>
&lt;td>Dense&lt;/td>
&lt;td>70 B&lt;/td>
&lt;td>70 B&lt;/td>
&lt;td>~3.5×&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The MoE activates only 2 of 8 experts per token. Mixtral 8×7B consumes roughly ⅓ of the J/token of a dense model with 8B active, at a quality comparable to a dense model of larger scale. Routing overhead and holding all the experts in memory cancel out part of the theoretical gain.&lt;/p>
&lt;p>Effect of the task (ML.ENERGY v3, same model):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Task&lt;/th>
&lt;th>Energy multiplier per response (vs chat)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Chat (text conversation)&lt;/td>
&lt;td>1× (reference)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Summarisation&lt;/td>
&lt;td>~2–4×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Code generation&lt;/td>
&lt;td>~3–6×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Reasoning&lt;/td>
&lt;td>&lt;strong>~25×&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Image + text&lt;/td>
&lt;td>1.1–5.2×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Video + text&lt;/td>
&lt;td>1.3–15.0×&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Reasoning uses ~10× more tokens per response, and the extra memory of the chain of thought reduces the effective batch size, raising energy per token through memory pressure.&lt;/p>
&lt;hr>
&lt;h2 id="effect-of-quantisation-on-energy-per-token">Effect of quantisation on energy per token&lt;/h2>
&lt;p>Data on NVIDIA H100 hardware, Llama 3 family (arXiv 2508.16712 and arXiv 2504.03360):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Precision&lt;/th>
&lt;th>Energy reduction vs FP16&lt;/th>
&lt;th>Condition&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>FP16&lt;/td>
&lt;td>reference (0 %)&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>BF16&lt;/td>
&lt;td>~0 % (iso-energy)&lt;/td>
&lt;td>Same hardware and engine&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>FP8&lt;/td>
&lt;td>−25 to −35 %&lt;/td>
&lt;td>H100/H200 with native hardware support&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>INT8&lt;/td>
&lt;td>−23 to −44 % (median ~39 %)&lt;/td>
&lt;td>Depends on batch size; more at low batches&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>INT4 (AWQ / GPTQ)&lt;/td>
&lt;td>−50 to −79 %&lt;/td>
&lt;td>Requires hardware with efficient low-precision support&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Warning. On GPUs without native INT4 hardware support (or with suboptimal dequantisation kernels), quantisation can increase latency and energy per token rather than reduce them, because of run-time dequantisation overhead. The benefit of quantisation is real on H100/A100 with TensorRT-LLM or a well-configured llama.cpp, but it is not guaranteed with any engine.&lt;/p>
&lt;p>Quantisation and throughput: the memory reduction per model frees VRAM, which allows larger batch sizes. At a larger batch, throughput rises more than power does, cutting J/token further still. The net effect can exceed the direct reduction in energy per operation.&lt;/p>
&lt;div class="diagram" style="max-width:760px;margin:1rem auto;">
&lt;svg viewBox="0 0 760 180" role="img" aria-label="Reduction in J per token by precision: FP16 reference, FP8 minus 30 percent, INT8 minus 40 percent, INT4 minus 70 percent, with a warning about dequantisation overhead if the hardware has no native support" xmlns="http://www.w3.org/2000/svg">
&lt;style>.ax{fill:none;stroke:currentColor;stroke-width:1}.br{fill:none;stroke:currentColor;stroke-width:1.3}.tl{font:600 12px sans-serif;fill:currentColor}.ts{font:11px sans-serif;fill:currentColor}.lbl{font:bold 11px sans-serif;fill:currentColor}&lt;/style>
&lt;line class="ax" x1="60" y1="20" x2="60" y2="140"/>
&lt;line class="ax" x1="60" y1="140" x2="720" y2="140"/>
&lt;text x="10" y="85" class="ts" transform="rotate(-90 10 85)">Relative J/token&lt;/text>
&lt;rect class="br" x="80" y="30" width="110" height="110"/>
&lt;text x="88" y="155" class="ts">FP16&lt;/text>
&lt;text x="100" y="80" class="lbl">100 %&lt;/text>
&lt;rect class="br" x="230" y="63" width="110" height="77"/>
&lt;text x="238" y="155" class="ts">FP8&lt;/text>
&lt;text x="248" y="108" class="lbl">~70 %&lt;/text>
&lt;rect class="br" x="380" y="74" width="110" height="66"/>
&lt;text x="388" y="155" class="ts">INT8&lt;/text>
&lt;text x="398" y="112" class="lbl">~61 %&lt;/text>
&lt;rect class="br" x="530" y="97" width="110" height="43"/>
&lt;text x="538" y="155" class="ts">INT4&lt;/text>
&lt;text x="548" y="122" class="lbl">~30 %&lt;/text>
&lt;text x="60" y="170" class="ts">Hardware: H100 SXM with native support. Without it, INT4 can be iso-energetic or worse than FP16.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;hr>
&lt;h2 id="effect-of-the-inference-engine">Effect of the inference engine&lt;/h2>
&lt;p>The engine is a variable that model-level leaderboards tend to fix, but which in production is a decision of your own. Data from published comparisons (vLLM, TensorRT-LLM, naive Transformers, A100):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Engine&lt;/th>
&lt;th>Relative J/token vs Transformers baseline&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Transformers (naive, not optimised)&lt;/td>
&lt;td>1.0× (reference)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>vLLM (PagedAttention, continuous batching)&lt;/td>
&lt;td>−25 to −35 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TensorRT-LLM (optimised NVIDIA kernels, FP8)&lt;/td>
&lt;td>−35 to −45 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>llama.cpp (hybrid CPU/GPU, INT4)&lt;/td>
&lt;td>Variable; −30 to −60 % depending on hardware&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Moving from naive Transformers to TensorRT-LLM can cut energy per token by more than moving from a 70B model to an 8B one of the same origin. The choice of engine is a first-order lever on energy efficiency.&lt;/p>
&lt;hr>
&lt;h2 id="limits-of-energy-leaderboards">Limits of energy leaderboards&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Limit&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Hardware dependence&lt;/strong>&lt;/td>
&lt;td>A ranking on H100 is not valid on A100 or L40S without correction. The hierarchy of models can change from one piece of hardware to another.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Engine dependence&lt;/strong>&lt;/td>
&lt;td>The results are valid only for the engine they were measured with. A model that is ×2 more efficient on the leaderboard can fall behind if a slower engine is used.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Artificial batch size&lt;/strong>&lt;/td>
&lt;td>AI Energy Score uses batch = 1. In production with aggressive batching, the efficiency relationship between large and small models changes: the large ones scale better with batch.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Training not captured&lt;/strong>&lt;/td>
&lt;td>All the leaderboards measure inference only. The energy cost of training (which can exceed that of inference by 1,000× over the life of the model) is out of scope.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Incompatibility between leaderboards&lt;/strong>&lt;/td>
&lt;td>Wh/query, J/token and samples/J measure different things. Converting between them requires knowing the mean output length, which varies by task and dataset.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Partial system coverage&lt;/strong>&lt;/td>
&lt;td>AI Energy Score and ML.ENERGY measure GPU (+CPU/DRAM with Zeus); they do not capture the overhead of the complete system (PSU losses, fans, interconnect). MLPerf Power does, but covers few models.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Data latency&lt;/strong>&lt;/td>
&lt;td>The leaderboards publish results months after the tests. New hardware (H200, B100, B200) may have no data available at the time of the decision.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>No PUE&lt;/strong>&lt;/td>
&lt;td>None of the three includes datacenter PUE. For real TCO, the leaderboard J/token must be multiplied by your own PUE.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="decision-table-choosing-a-model-on-energy-efficiency">Decision table: choosing a model on energy efficiency&lt;/h2>
&lt;p>The selection criteria in order, without recommendation prose:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Criterion&lt;/th>
&lt;th>Question&lt;/th>
&lt;th>Action&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Task with reasoning&lt;/strong>&lt;/td>
&lt;td>Does the task require step-by-step reasoning?&lt;/td>
&lt;td>Yes → multiply the model&amp;rsquo;s base energy by ×30–700 before comparing. If there is a non-reasoning alternative with sufficient quality, prefer it.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Size vs minimum quality&lt;/strong>&lt;/td>
&lt;td>What is the minimum acceptable quality for the task?&lt;/td>
&lt;td>Consult quality benchmarks (see &lt;a href="https://blog.lo0.es/en/posts/llm-quality-benchmarks-contamination-trap-oss-tools/">B7&lt;/a> when available). Pick the smallest model that clears the quality threshold; energy grows sublinearly with size.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Dense vs MoE&lt;/strong>&lt;/td>
&lt;td>Does the hardware have enough memory for the full MoE?&lt;/td>
&lt;td>If yes: the active-equivalent MoE consumes ~3× fewer J/token than the equivalent dense model. If not: paging or offload eats the gain.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Precision&lt;/strong>&lt;/td>
&lt;td>Does the hardware have native FP8/INT4 support?&lt;/td>
&lt;td>H100/H200: native FP8 (−30 %). With TensorRT-LLM: INT4 AWQ (−50 to −79 %). Without native support: stay on FP16 or BF16 until validated with your own benchmark.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Inference engine&lt;/strong>&lt;/td>
&lt;td>Is the optimal engine for the hardware being used?&lt;/td>
&lt;td>Measure with &lt;a href="https://blog.lo0.es/en/posts/measuring-energy-in-production-kepler-dcgm-stack/">C3&lt;/a>. If the engine is not optimised, changing engine can cut energy more than changing model.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Consult the leaderboard&lt;/strong>&lt;/td>
&lt;td>Is the task covered by AI Energy Score or ML.ENERGY?&lt;/td>
&lt;td>Filter by: same task, same hardware class, reasoning explicitly off/on. Do not compare models from different hardware classes or different engines.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Validate on your own hardware&lt;/strong>&lt;/td>
&lt;td>Are the leaderboard results on the same HW as yours?&lt;/td>
&lt;td>Always validate with Zeus or DCGM on your own hardware before taking the final decision. The leaderboard is a reference, not a prediction.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Quick signals table:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Signal&lt;/th>
&lt;th>Effect on energy&lt;/th>
&lt;th>Data source&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Switching reasoning on&lt;/td>
&lt;td>×30–700&lt;/td>
&lt;td>AI Energy Score v2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Going from dense 8B to dense 70B&lt;/td>
&lt;td>~×3.5&lt;/td>
&lt;td>ML.ENERGY Leaderboard v3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Going from dense 8B to active-equivalent 8B MoE&lt;/td>
&lt;td>~×0.33 (−67 %)&lt;/td>
&lt;td>ML.ENERGY v3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>FP16 → INT4 (compatible hardware)&lt;/td>
&lt;td>−50 to −79 %&lt;/td>
&lt;td>arXiv 2508.16712, 2504.03360&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Naive Transformers → TensorRT-LLM FP8&lt;/td>
&lt;td>−35 to −45 %&lt;/td>
&lt;td>TokenPowerBench, ML.ENERGY&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>PUE 1.0 → PUE 1.5&lt;/td>
&lt;td>+50 % on real datacenter energy&lt;/td>
&lt;td>MLPerf Power (scope)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="reference-data-energy-in-a-generic-node-4h100-sxm">Reference data: energy in a generic node (4×H100 SXM)&lt;/h2>
&lt;p>Generic example hardware, to anchor the leaderboard values to a real node:&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>TDP 4×H100 SXM 80 GB&lt;/td>
&lt;td>4 × 700 W = 2,800 W (GPU only)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Complete-node system power (at the wall)&lt;/td>
&lt;td>~3,500–5,000 W depending on load&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Non-GPU overhead over GPU&lt;/td>
&lt;td>25–45 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>J/token Llama 3 70B FP16, vLLM, batch 8&lt;/td>
&lt;td>~1–3 J/tok (indicative, A100/H100)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>J/token Llama 3 8B FP16, vLLM, batch 8&lt;/td>
&lt;td>~0.3–0.7 J/tok (indicative)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>J/token Mixtral 8×7B FP16, vLLM, batch 8&lt;/td>
&lt;td>~0.4–0.8 J/tok (indicative)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Energy per 1M tokens (Llama 3 70B, PUE 1.4)&lt;/td>
&lt;td>~0.5–1.2 kWh&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The J/token values are indicative and depend heavily on batch size, prompt length, prefill/decode ratio and engine version. For certified values, consult the MLPerf Power submissions (&lt;a href="https://mlcommons.org/benchmarks/inference-datacenter/">mlcommons.org&lt;/a>).&lt;/p>
&lt;p>For the alternative reference node (4×A100 PCIe 80 GB, TDP ~300 W each):&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>TDP 4×A100 PCIe&lt;/td>
&lt;td>4 × 300 W = 1,200 W (GPU only)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Complete-node system power&lt;/td>
&lt;td>~1,500–2,000 W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>J/token Llama 3 70B FP16, vLLM&lt;/td>
&lt;td>~2–5 J/tok (indicative; higher because of lower HBM bandwidth vs SXM)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="how-to-use-the-leaderboards-in-practice">How to use the leaderboards in practice&lt;/h2>
&lt;p>A decision flow based on the public data available:&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>Identify the dominant task of the workload&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>Consult AI Energy Score filtered by task and hardware class&lt;/td>
&lt;td>huggingface.co/spaces/AIEnergyScore/Leaderboard&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>Note the models with ⭐⭐⭐⭐ or ⭐⭐⭐⭐⭐ on the task&lt;/td>
&lt;td>Wh/1k-queries as a relative reference&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>Cross-check with ML.ENERGY for the J/token of each candidate&lt;/td>
&lt;td>ml.energy/leaderboard&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>If any model is in MLPerf Power (Llama 2, GPT-J, Mixtral), consult the certified samples/J&lt;/td>
&lt;td>mlcommons.org/benchmarks/inference-datacenter/&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6&lt;/td>
&lt;td>Select the 2–3 candidates with the best energy/quality ratio&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>7&lt;/td>
&lt;td>Measure on your own hardware with Zeus or DCGM&lt;/td>
&lt;td>github.com/ml-energy/zeus&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8&lt;/td>
&lt;td>Multiply the measured J/token by the datacenter PUE&lt;/td>
&lt;td>J/token × PUE = effective J/token in the datacenter&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>9&lt;/td>
&lt;td>Work out the electricity cost per token at the contracted price&lt;/td>
&lt;td>See &lt;a href="https://blog.lo0.es/en/posts/energy-per-token-spain-methodology-electricity-market-speculation/">C2&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/ai-energy-benchmarking-frameworks-metrics-state-of-the-art/">C1 — Energy benchmarking of LLM frameworks: state of the art&lt;/a>&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 electricity market&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/measuring-energy-in-production-kepler-dcgm-stack/">C3 — Measurement tooling in deployment: accuracy and overhead&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/mlperf-power-energy-efficiency-benchmark/">C4 — MLPerf Power: the certified standard benchmark&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/quantization-llm-inference-fp8-int4-gguf/">Fundamentals of quantisation for inference&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>Hugging Face · AI Energy Score · organización y leaderboard — &lt;a href="https://huggingface.co/AIEnergyScore">https://huggingface.co/AIEnergyScore&lt;/a>&lt;/li>
&lt;li>Hugging Face · Announcing AI Energy Score Ratings (Luccioni et al., feb. 2025) — &lt;a href="https://huggingface.co/blog/sasha/announcing-ai-energy-score">https://huggingface.co/blog/sasha/announcing-ai-energy-score&lt;/a>&lt;/li>
&lt;li>Hugging Face · AI Energy Score v2: Refreshed Leaderboard, now with Reasoning (Luccioni, Gamazaychikov, dic. 2025) — &lt;a href="https://huggingface.co/blog/sasha/ai-energy-score-v2">https://huggingface.co/blog/sasha/ai-energy-score-v2&lt;/a>&lt;/li>
&lt;li>Hugging Face · AIEnergyScore GitHub (Apache 2.0) — &lt;a href="https://github.com/huggingface/AIEnergyScore">https://github.com/huggingface/AIEnergyScore&lt;/a>&lt;/li>
&lt;li>ML.ENERGY Initiative · Leaderboard — &lt;a href="https://ml.energy/leaderboard">https://ml.energy/leaderboard&lt;/a>&lt;/li>
&lt;li>ML.ENERGY Initiative · Blog: Diagnosing Inference Energy Consumption with the ML.ENERGY Leaderboard v3.0 (dic. 2025) — &lt;a href="https://ml.energy/blog/measurement/energy/diagnosing-inference-energy-consumption-with-the-mlenergy-leaderboard-v30/">https://ml.energy/blog/measurement/energy/diagnosing-inference-energy-consumption-with-the-mlenergy-leaderboard-v30/&lt;/a>&lt;/li>
&lt;li>arXiv 2505.06371 · The ML.ENERGY Benchmark: Toward Automated Inference Energy Measurement and Optimization (Chung et al., NeurIPS 2025 D&amp;amp;B Spotlight) — &lt;a href="https://arxiv.org/abs/2505.06371">https://arxiv.org/abs/2505.06371&lt;/a>&lt;/li>
&lt;li>ML.ENERGY Initiative · Zeus: Deep Learning Energy Measurement and Optimization — &lt;a href="https://ml.energy/zeus/">https://ml.energy/zeus/&lt;/a>&lt;/li>
&lt;li>GitHub ml-energy/zeus (MIT) — &lt;a href="https://github.com/ml-energy/zeus">https://github.com/ml-energy/zeus&lt;/a>&lt;/li>
&lt;li>PyTorch Blog · Zeus: Deep Learning Energy Measurement and Optimization — &lt;a href="https://pytorch.org/blog/zeus/">https://pytorch.org/blog/zeus/&lt;/a>&lt;/li>
&lt;li>University of Michigan CSE · Power-hungry AI: Researchers evaluate energy consumption across models — &lt;a href="https://cse.engin.umich.edu/stories/power-hungry-ai-researchers-evaluate-energy-consumption-across-models">https://cse.engin.umich.edu/stories/power-hungry-ai-researchers-evaluate-energy-consumption-across-models&lt;/a>&lt;/li>
&lt;li>arXiv 2512.03024 · TokenPowerBench: Benchmarking the Power Consumption of LLM Inference (dic. 2024) — &lt;a href="https://arxiv.org/abs/2512.03024">https://arxiv.org/abs/2512.03024&lt;/a>&lt;/li>
&lt;li>arXiv 2508.16712 · Systematic Characterization of LLM Quantization: A Performance, Energy, and Quality Perspective — &lt;a href="https://arxiv.org/abs/2508.16712">https://arxiv.org/abs/2508.16712&lt;/a>&lt;/li>
&lt;li>arXiv 2504.03360 · Sustainable LLM Inference for Edge AI: Evaluating Quantized LLMs for Energy Efficiency, Output Accuracy, and Inference Latency — &lt;a href="https://arxiv.org/abs/2504.03360">https://arxiv.org/abs/2504.03360&lt;/a>&lt;/li>
&lt;li>Epoch AI · AI Energy Use: Data &amp;amp; Research — &lt;a href="https://epoch.ai/topics/energy">https://epoch.ai/topics/energy&lt;/a>&lt;/li>
&lt;li>MLCommons · MLPerf Inference Datacenter benchmark results — &lt;a href="https://mlcommons.org/benchmarks/inference-datacenter/">https://mlcommons.org/benchmarks/inference-datacenter/&lt;/a>&lt;/li>
&lt;li>arXiv 2410.12032 · MLPerf Power: Benchmarking the Energy Efficiency of Machine Learning Systems (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>Coalition for Sustainable AI · AI Energy Score as best practice in benchmarking — &lt;a href="https://www.sustainableaicoalition.org/ai-energy-score-a-standardized-approach-to-evaluating-ai-model-energy-efficiency/">https://www.sustainableaicoalition.org/ai-energy-score-a-standardized-approach-to-evaluating-ai-model-energy-efficiency/&lt;/a>&lt;/li>
&lt;/ul></description></item><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>Measuring energy in production: Kepler, DCGM and the practical stack (accuracy and overhead)</title><link>https://blog.lo0.es/en/posts/measuring-energy-in-production-kepler-dcgm-stack/</link><pubDate>Sun, 14 Jun 2026 05:00:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/measuring-energy-in-production-kepler-dcgm-stack/</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="what-this-article-covers">What this article covers&lt;/h2>
&lt;p>Third article of the energy track (C3). C1 made the conceptual inventory of the tools;
here we get practical: how the measurement stack is deployed on Kubernetes, where each
piece takes its figures from, how accurate it is against a power meter, how much
overhead it adds, and how energy is attributed per pod and per MIG instance. It is the
equivalent of B2/B3 for energy: to stop talking about what each tool measures and start
building the bench that measures it. With commands; no recommendations, only the mechanics.&lt;/p>
&lt;hr>
&lt;h2 id="the-measurement-stack-on-kubernetes">The measurement stack on Kubernetes&lt;/h2>
&lt;p>To measure energy per workload on a GPU cluster, the practical stack has four pieces, and the
good news is that three of them you already have if you do observability:&lt;/p>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 230" role="img" aria-label="Energy measurement stack on Kubernetes: DCGM exporter and Kepler export to Prometheus, which Grafana visualises, with the power meter as calibration" 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.3;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(#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="40" width="170" height="44" rx="6"/>&lt;text x="32" y="60" class="tl">DCGM exporter&lt;/text>&lt;text x="32" y="76" class="ts">GPU power&lt;/text>
&lt;rect class="bx" x="20" y="100" width="170" height="44" rx="6"/>&lt;text x="32" y="120" class="tl">Kepler (eBPF)&lt;/text>&lt;text x="32" y="136" class="ts">energy per pod/node&lt;/text>
&lt;path class="ar" d="M190,62 L250,90"/>
&lt;path class="ar" d="M190,122 L250,108"/>
&lt;rect class="bx" x="250" y="78" width="160" height="44" rx="6"/>&lt;text x="262" y="98" class="tl">Prometheus&lt;/text>&lt;text x="262" y="114" class="ts">time series&lt;/text>
&lt;path class="ar" d="M410,100 L470,100"/>
&lt;rect class="bx" x="470" y="78" width="160" height="44" rx="6"/>&lt;text x="482" y="98" class="tl">Grafana&lt;/text>&lt;text x="482" y="114" class="ts">panels · alerts&lt;/text>
&lt;rect class="dsh" x="650" y="78" width="110" height="44" rx="6"/>&lt;text x="662" y="98" class="tl">Power meter&lt;/text>&lt;text x="662" y="114" class="ts">calibration&lt;/text>
&lt;text x="20" y="180" class="ts">DCGM, Prometheus and Grafana are already there if you do GPU observability; Kepler adds per-pod attribution.&lt;/text>
&lt;text x="20" y="202" class="ts">The physical meter (point in time) calibrates the estimates: not part of the continuous stack, but the ground truth.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>The new piece compared with a normal observability stack is Kepler, which adds &lt;strong>energy
attribution per pod&lt;/strong>. DCGM already gives GPU power; Prometheus stores it; Grafana draws it. It
is reused infrastructure, not a new system, in line with &lt;a href="https://blog.lo0.es/en/posts/gpu-observability-llm-inference-twelve-dcgm-vllm-metrics/">GPU observability via DCGM&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="dcgm-exporter-the-base-of-gpu-power">DCGM exporter: the base of GPU power&lt;/h2>
&lt;p>GPU power, the dominant source in LLM inference, comes from NVIDIA&amp;rsquo;s dcgm-exporter
(part of the GPU Operator), which exposes DCGM metrics to Prometheus. The key metric is
&lt;code>DCGM_FI_DEV_POWER_USAGE&lt;/code> (instantaneous power in W), alongside utilisation
(&lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code>) and memory. With that, energy is the integral of power over time
across the workload&amp;rsquo;s window. DCGM gives power at card level; to split it per pod or per
MIG instance you need a layer on top, which is Kepler.&lt;/p>
&lt;hr>
&lt;h2 id="kepler-in-depth-ebpf-and-the-sources">Kepler in depth: eBPF and the sources&lt;/h2>
&lt;p>Kepler (Kubernetes-based Efficient Power Level Exporter) is a Prometheus exporter that
measures energy at container, pod and node level, using eBPF to keep overhead low and
scientific methods to improve accuracy (&lt;a href="https://github.com/sustainable-computing-io/kepler">Kepler · GitHub&lt;/a>).
Its strength is that it combines several power sources:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Source&lt;/th>
&lt;th>What it covers&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>RAPL&lt;/strong>&lt;/td>
&lt;td>CPU and DRAM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>NVML&lt;/strong>&lt;/td>
&lt;td>NVIDIA GPU power&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ACPI&lt;/strong>&lt;/td>
&lt;td>platform power management&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Redfish / IPMI&lt;/strong>&lt;/td>
&lt;td>platform power (BMC)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Regression models&lt;/strong>&lt;/td>
&lt;td>estimation when there is no real metric&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>For the GPU, the &lt;code>dcgmEndpoint&lt;/code> parameter points at the dcgm-exporter metrics URL, which
enables power attribution per MIG instance (&lt;a href="https://github.com/sustainable-computing-io/kepler/blob/main/docs/user/configuration.md">Kepler · configuration&lt;/a>).
That is: DCGM gives the card&amp;rsquo;s power, Kepler splits it between the pods (and MIG partitions)
that use it, via eBPF and models. The result is per-pod energy metrics in Prometheus, ready
for Grafana, usable for scheduling or scaling, consumption reporting and visualisation
(&lt;a href="https://github.com/sustainable-computing-io/kepler">Kepler · GitHub&lt;/a>).&lt;/p>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 210" role="img" aria-label="Kepler combines RAPL, NVML/DCGM, ACPI and Redfish, and with eBPF splits the energy per pod and per MIG instance" 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(#km)}&lt;/style>
&lt;defs>&lt;marker id="km" 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="36" width="150" height="30" rx="5"/>&lt;text x="30" y="56" class="ts">RAPL (CPU/DRAM)&lt;/text>
&lt;rect class="bx" x="20" y="76" width="150" height="30" rx="5"/>&lt;text x="30" y="96" class="ts">NVML/DCGM (GPU)&lt;/text>
&lt;rect class="bx" x="20" y="116" width="150" height="30" rx="5"/>&lt;text x="30" y="136" class="ts">ACPI · Redfish/IPMI&lt;/text>
&lt;path class="ar" d="M170,51 L230,80"/>
&lt;path class="ar" d="M170,91 L230,91"/>
&lt;path class="ar" d="M170,131 L230,102"/>
&lt;rect class="bx" x="230" y="70" width="170" height="44" rx="6"/>&lt;text x="242" y="90" class="tl">Kepler (eBPF + model)&lt;/text>&lt;text x="242" y="106" class="ts">splits the power&lt;/text>
&lt;path class="ar" d="M400,92 L460,92"/>
&lt;rect class="bx" x="460" y="70" width="180" height="44" rx="6"/>&lt;text x="472" y="90" class="tl">Energy per pod / MIG&lt;/text>&lt;text x="472" y="106" class="ts">→ Prometheus&lt;/text>
&lt;text x="20" y="180" class="ts">DCGM gives the card's power; Kepler attributes it to each pod and MIG partition, as OpenCost attributes cost.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;hr>
&lt;h2 id="deployment-a-daemonset-on-top-of-prometheus">Deployment: a DaemonSet on top of Prometheus&lt;/h2>
&lt;p>The deployment is a DaemonSet (one Kepler per node), pointing at the existing Prometheus
and at the dcgm-exporter:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Helm, pointing at the dcgm-exporter for GPU attribution&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">helm install kepler kepler/kepler &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --namespace kepler --create-namespace &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --set &lt;span class="nv">dcgmEndpoint&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;http://dcgm-exporter:9400/metrics&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Prerequisites: a kernel with eBPF, the dcgm-exporter running (from the GPU Operator) and
Prometheus scraping. Once deployed, Kepler exposes metrics such as
&lt;code>kepler_container_joules_total&lt;/code> per pod, queried with PromQL and drawn in Grafana. Energy per
workload stops being a manual estimate and becomes a continuous time series, just like cost
with OpenCost.&lt;/p>
&lt;hr>
&lt;h2 id="promql-queries-energy-per-pod">PromQL queries: energy per pod&lt;/h2>
&lt;p>With Kepler exporting, these are the queries that build the panels. The exact names vary by
version; check your &lt;code>/metrics&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-promql" data-lang="promql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Cumulative energy per pod (joules)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nv">kepler_container_joules_total&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1"># Mean power per namespace over the last hour (W)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">sum&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">by&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">namespace&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="kr">rate&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">kepler_container_joules_total&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s">1h&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">))&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1"># GPU power per node (from DCGM, W)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">sum&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">by&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">node&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">DCGM_FI_DEV_POWER_USAGE&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1"># Energy per token: power ÷ throughput (with a gateway/engine metric)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">sum&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="kr">rate&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">kepler_container_joules_total&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s">5m&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">sum&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="kr">rate&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">vllm_generation_tokens_total&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s">5m&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">))&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The last one closes the circle with the cost track: it crosses Kepler&amp;rsquo;s energy with the
engine/gateway tokens to give J/token in real time, per workload. With that in Grafana you
have energy per pod, per namespace and per token, continuously, the energy equivalent of the
OpenCost cost report.&lt;/p>
&lt;hr>
&lt;h2 id="a-calibration-procedure">A calibration procedure&lt;/h2>
&lt;p>Since Kepler estimates, it is worth calibrating once per node type. A simple procedure:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Power meter at the node input&lt;/strong> (or a PDU/BMC reading), measuring the node&amp;rsquo;s real power.&lt;/li>
&lt;li>&lt;strong>Controlled load&lt;/strong>: a stable sweep at a known power (the engine at 80 % GPU, say).&lt;/li>
&lt;li>&lt;strong>Compare&lt;/strong>: the node&amp;rsquo;s sum of &lt;code>kepler_container_joules_total&lt;/code> plus idle against the meter
reading over the same window.&lt;/li>
&lt;li>&lt;strong>Adjust&lt;/strong> Kepler&amp;rsquo;s factor or model if the deviation is noticeable, and document the
residual error.&lt;/li>
&lt;li>&lt;strong>Repeat&lt;/strong> for each node type (calibration is not transferable between different hardware).&lt;/li>
&lt;/ol>
&lt;p>With that residual error documented, Kepler&amp;rsquo;s continuous figure has a known error bar,
which is exactly what a CSRD auditor or a technical committee will ask for. Measuring without
calibrating gives a number with no credibility; calibrating once turns the continuous estimate
into a defensible figure.&lt;/p>
&lt;hr>
&lt;h2 id="accuracy-estimation-vs-power-meter">Accuracy: estimation vs power meter&lt;/h2>
&lt;p>The data honesty of the energy track: Kepler estimates (eBPF + models + counters), it does
not measure with a power meter. Accuracy depends on the source: with NVML/DCGM and RAPL
available, the figure is fairly faithful (it reads hardware counters); when it falls back on
regression models (with no real metric), it is an estimate with more error. Good practice:
calibrate against a physical power meter at least once per node type, adjust, and use
Kepler as a continuous proxy. The meter is the point-in-time ground truth; Kepler, the
continuous series calibrated against it. For a CSRD report that an auditor may challenge, that
initial calibration is what gives the continuous figure credibility.&lt;/p>
&lt;hr>
&lt;h2 id="overhead-the-cost-of-measuring">Overhead: the cost of measuring&lt;/h2>
&lt;p>Measuring energy has its own compute cost, worth budgeting for. In a Kubernetes environment,
the overhead of the monitoring system is split between the Prometheus server and the targets:
the Prometheus server consumes ~150 % of CPU (1.5 cores) and ~15 GB of RAM, while the
targets (node exporter and dcgm-exporter) together use ~35 % of CPU and ~300 MB of RAM
(&lt;a href="https://arxiv.org/pdf/2504.10702">arXiv · Container-level Energy Observability&lt;/a>). Kepler uses
eBPF precisely to keep its own overhead low. The reading: the bulk of the cost of measuring is
in Prometheus (which you probably already have for observability), not in the energy
exporters. Adding Kepler to an existing observability stack is marginal; standing up
Prometheus just for this would be expensive. That is why measuring energy is nearly free if
you already observe, and a project if you do not.&lt;/p>
&lt;hr>
&lt;h2 id="zeus-for-the-bench-and-for-optimisation-not-for-continuous-production">Zeus: for the bench and for optimisation, not for continuous production&lt;/h2>
&lt;p>Zeus (ml.energy) plays a different role: it is not a continuous production exporter, it is
the bench tool for measuring and optimising the energy of one specific workload (a
benchmark, a training run), with power capping and frequency selection. It fits into the
benchmarking flow (alongside GuideLLM/AIPerf): during a sweep, Zeus measures the energy per
configuration and lets you test the effect of power capping on performance. The practical
division: Kepler/DCGM in production (continuous per-pod attribution), Zeus on the bench
(fine measurement + optimisation of one workload), CodeCarbon if you want carbon context
integrated into an ML pipeline.&lt;/p>
&lt;hr>
&lt;h2 id="codecarbon-and-scaphandre-in-practice">CodeCarbon and Scaphandre in practice&lt;/h2>
&lt;p>The other two pieces, with their specific role:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>CodeCarbon&lt;/strong> integrates inside the code of an ML pipeline (a decorator or a context
manager wrapping the training or the inference), and returns the energy and the CO₂eq of
that block, using &lt;code>nvidia-smi&lt;/code> for the GPU and estimating CPU/RAM. It fits when you want the
carbon figure per experiment or per ML job, integrated into the data flow, not at
infrastructure level. It is the closest to the power meter among the Python tools.&lt;/li>
&lt;li>&lt;strong>Scaphandre&lt;/strong> is a metrology agent in Rust that reads RAPL and gives process/VM power
with raw hardware accuracy. For CPU it is very accurate; for GPU it has to be combined with
NVML. It fits when you need the most faithful CPU metrology, or a lightweight agent
independent of Kubernetes.&lt;/li>
&lt;/ul>
&lt;p>The division with Kepler: Kepler attributes energy per pod in the cluster (the
infrastructure view); CodeCarbon gives carbon per ML job (the pipeline view);
Scaphandre gives raw CPU metrology. They do not compete; they cover different layers, and
a mature platform uses whichever matches the question.&lt;/p>
&lt;hr>
&lt;h2 id="choosing-the-stack-by-objective">Choosing the stack by objective&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Objective&lt;/th>
&lt;th>Tool&lt;/th>
&lt;th>Why&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Continuous per-pod attribution (production)&lt;/td>
&lt;td>&lt;strong>Kepler + DCGM&lt;/strong>&lt;/td>
&lt;td>eBPF, per pod/MIG, into Prometheus&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fine measurement + optimisation (bench)&lt;/td>
&lt;td>&lt;strong>Zeus&lt;/strong>&lt;/td>
&lt;td>measures and optimises (power capping)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Carbon in an ML pipeline&lt;/td>
&lt;td>&lt;strong>CodeCarbon&lt;/strong>&lt;/td>
&lt;td>integrated CO₂eq, close to the power meter&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Raw CPU accuracy (RAPL)&lt;/td>
&lt;td>&lt;strong>Scaphandre&lt;/strong>&lt;/td>
&lt;td>hardware metrology&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Calibration / ground truth&lt;/td>
&lt;td>&lt;strong>power meter&lt;/strong>&lt;/td>
&lt;td>the standard everything is calibrated against&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>It is not &amp;ldquo;one tool&amp;rdquo;, it is a stack by objective: continuous production (Kepler/DCGM),
bench (Zeus), reporting (CodeCarbon), calibration (power meter). Mixing them according to the
phase is what gives a complete and credible energy measurement.&lt;/p>
&lt;hr>
&lt;h2 id="from-figure-to-action">From figure to action&lt;/h2>
&lt;p>Measuring is the start; the value is in acting. With energy per pod in Prometheus:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Reporting (CSRD)&lt;/strong>: the carbon footprint per workload, calibrated, ready for regulatory
reporting.&lt;/li>
&lt;li>&lt;strong>Energy/carbon-aware scheduling&lt;/strong>: move deferrable load to hours or nodes of lower
intensity (connects with the hourly carbon of the Spanish grid).&lt;/li>
&lt;li>&lt;strong>Power capping&lt;/strong>: with Zeus, trim peak power with little performance loss, lowering the W in
the numerator of J/token.&lt;/li>
&lt;li>&lt;strong>Optimisation&lt;/strong>: identify pods with poor energy efficiency (a lot of energy per token) and
attack them with quantisation or batching.&lt;/li>
&lt;/ul>
&lt;p>The measurement stack is not a panel to look at: it is the input to scheduling, optimisation
and reporting decisions. Just as OpenCost closes the cost loop, Kepler+DCGM closes the energy
one.&lt;/p>
&lt;hr>
&lt;h2 id="from-energy-to-carbon-the-final-layer">From energy to carbon: the final layer&lt;/h2>
&lt;p>The energy figure (kWh) becomes carbon by multiplying by the grid intensity, and here the
practical stack connects with the hourly source. In Spain, the intensity is published by &lt;strong>Red
Eléctrica (esios) and aggregated by ElectricityMaps&lt;/strong>, hour by hour. The pattern:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-promql" data-lang="promql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Carbon per workload: energy (kWh) × grid intensity (gCO2/kWh)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="k">sum&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">by&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">namespace&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="kr">increase&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">kepler_container_joules_total&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s">1h&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mf">3.6&lt;/span>&lt;span class="nv">e6&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">on&lt;/span>&lt;span class="o">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">group_left&lt;/span>&lt;span class="o">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nv">grid_carbon_intensity_gco2_kwh&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>where &lt;code>grid_carbon_intensity_gco2_kwh&lt;/code> is a metric you feed from esios/ElectricityMaps (an
exporter or a periodic push). With that, the Grafana panel shows &lt;strong>gCO₂ per namespace and per
token, hour by hour&lt;/strong>, not an annual average. And since Spanish intensity varies a lot (from
~80 in solar hours to ~250 on gas-heavy nights), that hourly resolution is what enables
carbon-aware scheduling: moving the deferrable work to the clean hours lowers the measured
carbon. The measurement stack does not only report carbon; with the hourly figure, it &lt;strong>allows
it to be reduced&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="energy-efficiency-kpis-to-watch">Energy efficiency KPIs to watch&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>KPI&lt;/th>
&lt;th>What it indicates&lt;/th>
&lt;th>Where from&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>J/token per model&lt;/strong>&lt;/td>
&lt;td>energy efficiency&lt;/td>
&lt;td>Kepler ÷ engine tokens&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Mean power per pod&lt;/strong>&lt;/td>
&lt;td>consumption per workload&lt;/td>
&lt;td>&lt;code>rate(kepler_container_joules_total)&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>gCO₂/token (hourly)&lt;/strong>&lt;/td>
&lt;td>real footprint&lt;/td>
&lt;td>energy × grid intensity&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Idle energy&lt;/strong>&lt;/td>
&lt;td>waste&lt;/td>
&lt;td>power of pods with no traffic&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Effective PUE&lt;/strong>&lt;/td>
&lt;td>DC overhead&lt;/td>
&lt;td>total energy ÷ compute energy&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>These five turn the energy panel into a decision tool: which model is more efficient, which pod
wastes, when it pays to schedule. Without them the stack is a pretty panel; with them, it is
the input to optimisation and reporting.&lt;/p>
&lt;hr>
&lt;h2 id="example-energy-attribution-on-a-multi-tenant-cluster">Example: energy attribution on a multi-tenant cluster&lt;/h2>
&lt;p>With Kepler splitting per pod, an energy report per team on the example node (8×H100,
5.6 kW of boards, ~7.84 kW with PUE), over one month:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Team&lt;/th>
&lt;th>Energy/month (kWh)&lt;/th>
&lt;th>gCO₂ (ES grid ~160)&lt;/th>
&lt;th>Mean J/token&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>A · chat-prod&lt;/td>
&lt;td>~3,100&lt;/td>
&lt;td>~496 kg&lt;/td>
&lt;td>~2.2 J/tok&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>B · batch&lt;/td>
&lt;td>~1,400&lt;/td>
&lt;td>~224 kg&lt;/td>
&lt;td>~2.8 J/tok&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>C · experimentation&lt;/td>
&lt;td>~900&lt;/td>
&lt;td>~144 kg&lt;/td>
&lt;td>~6.5 J/tok&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>idle&lt;/td>
&lt;td>~250&lt;/td>
&lt;td>~40 kg&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>What it reveals: A is efficient (FP8, high utilisation → 2.2 J/token); C is inefficient
(6.5 J/token, underused GPU), just as it dragged the idle cost in the FinOps track. The carbon
column takes the figure into the per-team CSRD report. And the idle row (~250 kWh, ~40 kg
CO₂) is pure wasted energy. Without Kepler, that split does not exist: you would only see the
node&amp;rsquo;s total consumption, with no idea whose each watt is. With it, energy is attributable and
actionable, exactly like cost with OpenCost. In fact, the two panels together (OpenCost cost +
Kepler energy) give the complete picture of efficiency per team.&lt;/p>
&lt;hr>
&lt;h2 id="energy-and-carbon-aware-scheduling">Energy and carbon-aware scheduling&lt;/h2>
&lt;p>The highest-return action the stack enables: scheduling by energy and carbon. With energy
per pod and hourly grid intensity in Prometheus, two policies:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>By carbon&lt;/strong>: move the deferrable load (training, ingestion, overnight batch) to the
hours of lowest grid intensity. In Spain, the hours of peak solar (~80 gCO₂/kWh) against
gas-heavy nights (~250). The same workload emits ~3× less when scheduled at the right hour.&lt;/li>
&lt;li>&lt;strong>By efficiency&lt;/strong>: consolidate workloads to eliminate idle (a powered GPU with no work is
wasted energy), and direct each workload to the hardware most efficient for it.&lt;/li>
&lt;/ul>
&lt;p>Both use the same data (energy per pod + hourly intensity) that the stack already exposes, and
they connect with cluster scheduling (Kueue/Volcano). It is the difference between
measuring carbon (and reporting it) and reducing it (by scheduling). The C3 stack
enables both.&lt;/p>
&lt;hr>
&lt;h2 id="deployment-checklist">Deployment checklist&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Step&lt;/th>
&lt;th>Action&lt;/th>
&lt;th>Verification&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>dcgm-exporter (GPU Operator)&lt;/td>
&lt;td>&lt;code>DCGM_FI_DEV_POWER_USAGE&lt;/code> in Prometheus&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>Kepler DaemonSet, kernel with eBPF&lt;/td>
&lt;td>&lt;code>kepler_container_joules_total&lt;/code> per pod&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>&lt;code>dcgmEndpoint&lt;/code> pointing at the exporter&lt;/td>
&lt;td>GPU/MIG attribution works&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>Grid intensity metric (esios)&lt;/td>
&lt;td>&lt;code>grid_carbon_intensity&lt;/code> in Prometheus&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>Calibration vs power meter (once per node type)&lt;/td>
&lt;td>error bar documented&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6&lt;/td>
&lt;td>Grafana panels (J/token, carbon, idle)&lt;/td>
&lt;td>KPIs visible&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Step 5 (calibration) is the one most often skipped and the one that gives the figure
credibility; step 3 (&lt;code>dcgmEndpoint&lt;/code>) is the one most often forgotten, and without it the GPU is
not attributed.&lt;/p>
&lt;hr>
&lt;h2 id="energy-by-phase-prefill-vs-decode">Energy by phase: prefill vs decode&lt;/h2>
&lt;p>A level of detail the stack allows and that guides optimisation: power is not constant
during a request. Prefill (processing the prompt) is compute-bound and draws a lot of power
in a burst; decode (generating tokens) is memory-bound and draws a lower peak but for
longer. With fine DCGM sampling that bimodal profile is visible, and it has consequences:&lt;/p>
&lt;ul>
&lt;li>A workload with long prompts (a lot of prefill) has a different power profile from one with
long generation (a lot of decode), even if they produce the same tokens.&lt;/li>
&lt;li>&lt;strong>Power capping&lt;/strong> affects each phase differently: trimming peak power mostly touches the
prefill.&lt;/li>
&lt;/ul>
&lt;p>For most cases the mean J/token is enough; to optimise energy efficiency thoroughly,
separating prefill and decode consumption (aligning the DCGM window with each phase) reveals
where the spend is. It is the energy equivalent of separating TTFT and TPOT in benchmarking,
the same principle, measuring the two phases separately because they behave differently.&lt;/p>
&lt;hr>
&lt;h2 id="state-of-the-art-the-llm-resolution-gap">State of the art: the LLM resolution gap&lt;/h2>
&lt;p>An honest note on the limits of current tooling. The general-purpose tools (Kepler,
CodeCarbon, Scaphandre) measure well at machine, process and pod level, but they &lt;strong>lack
LLM-specific resolution&lt;/strong>: out of the box they do not distinguish prefill from decode energy,
nor energy per token by phase, nor the energy cost of a reasoning block against a normal
response. It is an open gap in the field: per-pod attribution exists, but attribution &lt;strong>per
token and per inference phase&lt;/strong> has to be built by crossing power (DCGM/Kepler) with engine
metrics (vLLM exposes tokens per phase). The 2026 state of the art is a mature stack for
infrastructure and an emerging one for LLM-specific resolution, exactly the crossing
that the reproducible harness (S4) has to build by hand. Acknowledging it avoids promising a
per-token accuracy that the general-purpose tools do not deliver on their own.&lt;/p>
&lt;hr>
&lt;h2 id="limits-and-traps-data-driven">Limits and traps (data-driven)&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>Uncalibrated estimation.&lt;/strong> Kepler estimates; without calibrating against a power meter at
least once, the figure can carry a noticeable error, especially when it falls back on
regression models.&lt;/li>
&lt;li>&lt;strong>Forgetting the &lt;code>dcgmEndpoint&lt;/code>.&lt;/strong> Without pointing Kepler at the dcgm-exporter, GPU (and
MIG) attribution does not work; it is the key parameter for GPU.&lt;/li>
&lt;li>&lt;strong>Accounting for overhead badly.&lt;/strong> The bulk of the cost of measuring is in Prometheus; if
you stand it up just for energy, budget for it (1.5 cores, 15 GB).&lt;/li>
&lt;li>&lt;strong>Confusing bench and production.&lt;/strong> Zeus measures one workload finely; Kepler attributes
continuously in production. Using one for the other gives the wrong figure.&lt;/li>
&lt;li>&lt;strong>Misaligned windows.&lt;/strong> For energy per token, the power window and the token window must
coincide; if they do not, the J/token does not correspond.&lt;/li>
&lt;/ol>
&lt;p>With the measurement stack in place, the energy track has its instrumentation; the following
articles (C6 carbon, C8 TCO and regulation) build on this data. The foundation is this: a
continuous per-pod measurement, calibrated, on top of the observability infrastructure you
already have.&lt;/p>
&lt;h2 id="closing">Closing&lt;/h2>
&lt;p>Measuring the energy of an AI cluster in production does not require a new system: it requires
adding Kepler, per-pod attribution via eBPF, to the DCGM, Prometheus and Grafana stack you
already have for observability. That is the central idea of C3: the cost of measuring is almost
entirely in the Prometheus you already pay for, and Kepler turns it from &amp;ldquo;card power&amp;rdquo; into
&amp;ldquo;energy per pod, per team and per token&amp;rdquo;. With two cautions that separate a credible figure
from a decorative panel: calibrate once against a power meter (to have an error bar that
survives an audit) and point the &lt;code>dcgmEndpoint&lt;/code> (without which the GPU is not attributed).
Done that way, energy stops being the soft axis of sustainability and becomes an actionable
time series: the J/token per model that exposes inefficiency, the hourly carbon that enables
clean scheduling, the idle that gets recovered, and the CSRD report that holds up. For the
sovereign platform, the Kepler+DCGM stack closes the energy loop just as OpenCost closes the
cost one, and together, with GuideLLM&amp;rsquo;s goodput, they give the three faces of the dashboard
measured on the same iron, in euros, joules and grams of CO₂.&lt;/p>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/mlperf-power-energy-efficiency-benchmark/">MLPerf Power&lt;/a> — the standard measurement at the wall (PTDaemon), complementary to software instrumentation (DCGM/RAPL/Kepler).&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 sensor metrology that feeds all these tools: averaging window, cumulative counter and what falls outside the counter.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-energy-leaderboards-wh-per-token/">LLM energy efficiency leaderboards&lt;/a> — where the J/token these tools produce end up: the public rankings and how to interpret them without being misled by the setup.&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 measured watts to gCO₂eq and to euros, applying 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> — the optimisations that reduce the consumption these tools measure: quantization, batching, engine and power schedulers.&lt;/li>
&lt;/ul>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>Kepler · GitHub (CNCF, eBPF, por pod/nodo) — &lt;a href="https://github.com/sustainable-computing-io/kepler">https://github.com/sustainable-computing-io/kepler&lt;/a>&lt;/li>
&lt;li>Kepler · configuración (fuentes, dcgmEndpoint para MIG) — &lt;a href="https://github.com/sustainable-computing-io/kepler/blob/main/docs/user/configuration.md">https://github.com/sustainable-computing-io/kepler/blob/main/docs/user/configuration.md&lt;/a>&lt;/li>
&lt;li>CNCF · explorando Kepler (consumo de aplicaciones cloud) — &lt;a href="https://www.cncf.io/blog/2023/10/11/exploring-keplers-potentials-unveiling-cloud-application-power-consumption/">https://www.cncf.io/blog/2023/10/11/exploring-keplers-potentials-unveiling-cloud-application-power-consumption/&lt;/a>&lt;/li>
&lt;li>Red Hat · Kepler: monitorización eficiente de energía para Kubernetes — &lt;a href="https://next.redhat.com/2023/08/22/introducing-kepler-efficient-power-monitoring-for-kubernetes/">https://next.redhat.com/2023/08/22/introducing-kepler-efficient-power-monitoring-for-kubernetes/&lt;/a>&lt;/li>
&lt;li>arXiv · Container-level Energy Observability in Kubernetes (overhead) — &lt;a href="https://arxiv.org/pdf/2504.10702">https://arxiv.org/pdf/2504.10702&lt;/a>&lt;/li>
&lt;li>NVIDIA · dcgm-exporter — &lt;a href="https://github.com/NVIDIA/dcgm-exporter">https://github.com/NVIDIA/dcgm-exporter&lt;/a>&lt;/li>
&lt;li>Zeus Project (ml.energy) — &lt;a href="https://ml.energy/zeus/">https://ml.energy/zeus/&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Energy per token in Spain: methodology, the electricity market and the cases of speculation</title><link>https://blog.lo0.es/en/posts/energy-per-token-spain-methodology-electricity-market-speculation/</link><pubDate>Sun, 14 Jun 2026 03:00:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/energy-per-token-spain-methodology-electricity-market-speculation/</guid><description>&lt;blockquote>
&lt;p>Notation: amounts in &lt;strong>euros (N €)&lt;/strong>, decimals with a point. The whole article is focused on
the &lt;strong>Spanish electricity market&lt;/strong> (OMIE). The dollar symbol is not used (on this site it is
a formula delimiter).&lt;/p>
&lt;/blockquote>
&lt;h2 id="what-this-article-covers">What this article covers&lt;/h2>
&lt;p>This is the second article of the &lt;strong>energy&lt;/strong> track (C2), and deliberately longer, because it puts
together two things that are almost never told together: the &lt;strong>technical methodology&lt;/strong> of measuring
energy per token, and the &lt;strong>reality of the Spanish electricity market&lt;/strong> that puts a price on that
energy. For an inference platform in Spain, the J/token figure is half the story; the other half is
that those kilowatt-hours are bought in a market that is &lt;strong>marginal-priced, volatile and with
documented cases of manipulation&lt;/strong>. Anyone who sizes the electricity cost of a cluster without
understanding how the price is formed in OMIE, and why it has tripled in a year, is building
30–50 % of the TCO on sand. This article covers the measurement, the market, the cases of
speculation and the strategies for not being left exposed. No partisan opinions: data, market
mechanics and documented facts, with their sources.&lt;/p>
&lt;hr>
&lt;h2 id="the-identity-energy-per-token-and-why-the-price-rules">The identity: energy per token, and why the price rules&lt;/h2>
&lt;p>Energy per token comes from the identity set out in the &lt;a href="https://blog.lo0.es/en/posts/cost-performance-energy-three-axes-llm-inference/">opening article&lt;/a>:&lt;/p>
$$\text{energy per token (J)} = \frac{\text{average power (W)}}{\text{throughput (tok/s)}}$$
&lt;p>And the &lt;strong>electricity cost per token&lt;/strong> is that energy multiplied by the price of electricity:&lt;/p>
$$\text{electricity cost per token} = \text{energy per token (kWh)} \times \text{PUE} \times \text{price (€/kWh)}$$
&lt;p>Here is the point of this article: the first two factors (energy and PUE) are controlled by your
engineering; the third, the &lt;strong>price&lt;/strong>, is set by the Spanish electricity market, and it is the one
that moves most. The same workload, with the same efficiency, can cost three times as much in
electricity depending on the month, not because of the technology but because of OMIE. That is why
measuring energy per token well is necessary but not sufficient: you have to understand the price
variable that multiplies it.&lt;/p>
&lt;hr>
&lt;h2 id="methodology-measuring-energy-per-token-without-fooling-yourself">Methodology: measuring energy per token without fooling yourself&lt;/h2>
&lt;p>Before the market, the measurement. As we saw in &lt;a href="https://blog.lo0.es/en/posts/ai-energy-benchmarking-frameworks-metrics-state-of-the-art/">the energy introduction&lt;/a>,
the energy-per-token figure has four instrumentation decisions that change the
result:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Decision&lt;/th>
&lt;th>Trap&lt;/th>
&lt;th>Good practice&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Sampling frequency&lt;/td>
&lt;td>coarse sampling misses the prefill peaks&lt;/td>
&lt;td>sample finely (sub-second)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Board vs node&lt;/td>
&lt;td>the GPU alone underestimates by 10–20 %&lt;/td>
&lt;td>measure the whole node or declare the limit&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Time window&lt;/td>
&lt;td>including warm-up or shutdown distorts the J/token&lt;/td>
&lt;td>align the window with the measured workload&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Idle baseline&lt;/td>
&lt;td>attributing or subtracting changes the number&lt;/td>
&lt;td>decide and document it&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 200" role="img" aria-label="Alignment of the measurement window: the DCGM power and the tool throughput must cover the same interval, with no warm-up or shutdown" xmlns="http://www.w3.org/2000/svg">
&lt;style>.ax{fill:none;stroke:currentColor;stroke-width:1}.bx{fill:none;stroke:currentColor;stroke-width:1.3}.dsh{fill:none;stroke:currentColor;stroke-width:1.2;stroke-dasharray:4 3}.tl{font:600 12px sans-serif;fill:currentColor}.ts{font:11px sans-serif;fill:currentColor}&lt;/style>
&lt;line class="ax" x1="40" y1="150" x2="740" y2="150"/>
&lt;text x="360" y="175" class="ts">time →&lt;/text>
&lt;rect class="dsh" x="60" y="60" width="90" height="90"/>
&lt;text x="62" y="52" class="ts">warm-up (discard)&lt;/text>
&lt;rect class="bx" x="150" y="40" width="420" height="110"/>
&lt;text x="300" y="33" class="tl">measurement window (aligned)&lt;/text>
&lt;text x="165" y="95" class="ts">power (DCGM) ── J integrated here&lt;/text>
&lt;text x="165" y="115" class="ts">throughput (tool) ── tokens counted here&lt;/text>
&lt;rect class="dsh" x="570" y="60" width="90" height="90"/>
&lt;text x="572" y="52" class="ts">shutdown (discard)&lt;/text>
&lt;text x="40" y="195" class="ts">Energy is the integral of power over time; if the power window and the token window do not match, the J/token does not match the throughput.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>The golden rule: &lt;strong>the same window for the power and for the tokens&lt;/strong>. If DCGM integrates the
power of one interval and the benchmark tool counts the tokens of another, the J/token means
nothing. With that settled, you already have the energy per token; the rest of the article is about
what multiplies it.&lt;/p>
&lt;hr>
&lt;h2 id="the-spanish-electricity-market-how-the-price-is-formed">The Spanish electricity market: how the price is formed&lt;/h2>
&lt;p>In Spain (and Portugal), the wholesale price of electricity is set by &lt;strong>OMIE&lt;/strong> (Operador del
Mercado Ibérico de Energía), which runs the day-ahead market and &lt;strong>sets the price for each hour&lt;/strong>
(&lt;a href="https://www.omie.es/">OMIE&lt;/a>). The system is &lt;strong>marginal-priced&lt;/strong> (&lt;em>pay-as-clear&lt;/em>): each hour
supply (the plants, ordered from cheapest to most expensive) and demand are matched, and &lt;strong>the price
for everyone is that of the last plant to enter&lt;/strong>, the marginal one. That marginal price &lt;strong>is the
same across all of Spain&lt;/strong> (except the Canaries) and applies to all agents &lt;strong>regardless
of their initial bid&lt;/strong> (&lt;a href="https://www.energiaysociedad.es/omie-cual-es-su-importancia-para-el-sistema-electrico-espanol-y-portugues/">Energía y Sociedad&lt;/a>).&lt;/p>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 250" role="img" aria-label="OMIE marginal clearing: supply ordered from cheap to expensive (renewables, nuclear, gas) crosses demand and the price for everyone is that of the last plant to enter" xmlns="http://www.w3.org/2000/svg">
&lt;style>.ax{fill:none;stroke:currentColor;stroke-width:1}.st{fill:none;stroke:currentColor;stroke-width:1.6}.dsh{fill:none;stroke:currentColor;stroke-width:1.2;stroke-dasharray:4 3}.tl{font:600 12px sans-serif;fill:currentColor}.ts{font:11px sans-serif;fill:currentColor}&lt;/style>
&lt;line class="ax" x1="60" y1="40" x2="60" y2="200"/>
&lt;line class="ax" x1="60" y1="200" x2="700" y2="200"/>
&lt;text x="20" y="120" class="ts" transform="rotate(-90 20 120)">€/MWh&lt;/text>
&lt;text x="360" y="228" class="ts">MWh offered (merit order) →&lt;/text>
&lt;path class="st" d="M60,195 L180,193 L180,180 L320,176 L320,150 L440,140 L440,90 L560,60"/>
&lt;text x="95" y="188" class="ts">renewables ~0&lt;/text>
&lt;text x="230" y="170" class="ts">nuclear&lt;/text>
&lt;text x="360" y="132" class="ts">gas (marginal)&lt;/text>
&lt;line class="st" x1="430" y1="40" x2="430" y2="200"/>
&lt;text x="395" y="52" class="ts">demand&lt;/text>
&lt;line class="dsh" x1="60" y1="120" x2="430" y2="120"/>
&lt;text x="62" y="114" class="tl">marginal price: EVERYONE is paid it&lt;/text>
&lt;text x="60" y="245" class="ts">Renewables and nuclear, cheap to produce, are paid the price gas sets: hence the "windfall profits".&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>The consequence, central to understanding the bill: when &lt;strong>gas&lt;/strong> is the marginal plant (the usual
case in hours without sun or wind), &lt;strong>renewables, nuclear and hydro, dirt cheap
to produce, are paid the price of gas&lt;/strong>. That difference between production cost and price
received is what are called &lt;strong>&amp;ldquo;windfall profits&amp;rdquo;&lt;/strong>, the heart of the
debate about market design. For the buyer of electricity, a datacenter for
example, it means that the price paid &lt;strong>does not reflect the cost of generating&lt;/strong>, but that of the
most expensive technology needed that hour.&lt;/p>
&lt;hr>
&lt;h2 id="the-volatility-the-price-that-triples-in-a-year">The volatility: the price that triples in a year&lt;/h2>
&lt;p>The marginal-priced market, tied to gas in the expensive hours, produces &lt;strong>enormous volatility&lt;/strong>.
The 2026 data illustrates it: the Spanish wholesale price closed &lt;strong>May 2026 with an average of
54 €/MWh, more than triple the 16.92 €/MWh of the same month in 2025&lt;/strong>
(&lt;a href="https://www.merca2.es/2026/05/30/precio-luz-mayo-2026-disparo-2386473/">Merca2&lt;/a>). Tripling
in a year, without your consumption or your efficiency changing.&lt;/p>
&lt;p>And within a single day, the dispersion is brutal because of the effect of renewables: &lt;strong>solar and
wind enter at prices close to zero&lt;/strong>, and in the midday hours of May 2026 prices
reached &lt;strong>negative&lt;/strong> levels in several sessions (&lt;a href="https://www.merca2.es/2026/05/30/precio-luz-mayo-2026-disparo-2386473/">Merca2&lt;/a>).
The structural context: wind and solar went from &lt;strong>26 % of generation in 2019 to more
than 40 % in the first half of 2024&lt;/strong>, and over that period the wholesale price was &lt;strong>more than
40 % lower&lt;/strong> than it would have been with 2019 renewable levels
(&lt;a href="https://www.bde.es/f/webbe/SES/Secciones/Publicaciones/PublicacionesSeriadas/DocumentosOcasionales/23/Fich/do2316.pdf">Banco de España&lt;/a>).&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Reference&lt;/th>
&lt;th>Value&lt;/th>
&lt;th>Source&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Wholesale May 2026&lt;/td>
&lt;td>&lt;strong>54 €/MWh&lt;/strong>&lt;/td>
&lt;td>Merca2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Wholesale May 2025&lt;/td>
&lt;td>&lt;strong>16.92 €/MWh&lt;/strong>&lt;/td>
&lt;td>Merca2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Year-on-year variation&lt;/td>
&lt;td>&lt;strong>+219 %&lt;/strong> (×3.2)&lt;/td>
&lt;td>derived&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Solar hours 2026&lt;/td>
&lt;td>prices close to &lt;strong>0 or negative&lt;/strong>&lt;/td>
&lt;td>Merca2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Renewables in generation&lt;/td>
&lt;td>26 % (2019) → &amp;gt;40 % (2024)&lt;/td>
&lt;td>Banco de España&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The reading for a cluster: the electricity part of the TCO &lt;strong>is not a fixed number, it is a variable
with a range of 3× year on year and from zero-price hours to peak hours within the day&lt;/strong>. Sizing the
energy cost with an annual average price and forgetting about it is ignoring the biggest risk in the
model.&lt;/p>
&lt;hr>
&lt;h2 id="the-structure-of-the-bill-wholesale-is-not-what-you-pay">The structure of the bill: wholesale is not what you pay&lt;/h2>
&lt;p>It is worth not confusing the &lt;strong>wholesale price&lt;/strong> (the OMIE pool price, the one the headlines talk
about) with what a company actually pays. On top of the wholesale price come:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Component&lt;/th>
&lt;th>What it is&lt;/th>
&lt;th>Nature&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Energy (wholesale)&lt;/td>
&lt;td>the OMIE price hour by hour&lt;/td>
&lt;td>variable, volatile&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Access tolls&lt;/td>
&lt;td>use of the transmission and distribution networks&lt;/td>
&lt;td>regulated&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Charges&lt;/td>
&lt;td>system costs (past renewables, etc.)&lt;/td>
&lt;td>regulated&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Taxes&lt;/td>
&lt;td>IEE (special electricity tax) + VAT&lt;/td>
&lt;td>fiscal&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The result: the &lt;strong>industrial retail&lt;/strong> price a datacenter pays is well above the
wholesale price, since tolls, charges and taxes can &lt;strong>double&lt;/strong> the price of pure energy. That is
why this article always distinguishes between the wholesale price (~0.054 €/kWh in May 2026) and
industrial retail (~0.12 €/kWh): for the TCO the second one matters, but the first is the one that
moves and drags the second with it. A large company can access the wholesale market more
directly (via a supplier or a representative), reducing the mark-up, but taking on the
exposure to volatility that comes with it.&lt;/p>
&lt;p>There is also the &lt;strong>PVPC&lt;/strong> (Precio Voluntario al Pequeño Consumidor), the regulated tariff indexed
to the wholesale price for small consumers; a datacenter does not use PVPC, but its existence explains
why the volatility of the pool reaches public opinion and political debate directly, and,
with it, the regulation that ends up affecting everyone.&lt;/p>
&lt;hr>
&lt;h2 id="the-20212022-crisis-the-origin-of-the-problem">The 2021–2022 crisis: the origin of the problem&lt;/h2>
&lt;p>Today&amp;rsquo;s volatility is not new: it originates in the &lt;strong>gas crisis of 2021–2022&lt;/strong>. When
the price of gas shot up (the marginal plant in many hours), the marginal-pricing system
passed that price on to &lt;strong>all&lt;/strong> electricity, including that generated by cheap renewables, nuclear and
hydro. The result was wholesale prices that were several times the historical
levels and massive &lt;strong>&amp;ldquo;windfall profits&amp;rdquo;&lt;/strong> for generators of cheap
technologies that were paid the price of gas. That episode is what motivated both the &lt;strong>Iberian
exception&lt;/strong> (capping gas in price formation) and the European debate about &lt;strong>redesigning the
market&lt;/strong>, and it explains why, years later, the price is still a first-order risk
variable for anyone consuming a lot of megawatt-hours. For a multi-year TCO model,
the lesson is that the Spanish electricity price has shown it can &lt;strong>multiply within
months&lt;/strong> through external factors (gas geopolitics), and that no assumption of a &amp;ldquo;stable&amp;rdquo; price
survives an episode like that unless it is covered by contract.&lt;/p>
&lt;hr>
&lt;h2 id="the-cases-of-speculation-and-manipulation">The cases of speculation and manipulation&lt;/h2>
&lt;p>The volatility of marginal pricing creates incentives to &lt;strong>manipulate&lt;/strong> the price, and in Spain there are
&lt;strong>documented cases with final CNMC fines&lt;/strong>. The largest sanctions on utilities for
manipulating the wholesale market (&lt;a href="https://nadaesgratis.es/jose-luis-ferreira/manipulacion-del-precio-en-el-mercado-electrico-espanol">Nada es Gratis&lt;/a>):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Company&lt;/th>
&lt;th>CNMC fine&lt;/th>
&lt;th>Concept&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Iberdrola&lt;/strong>&lt;/td>
&lt;td>&lt;strong>25 million €&lt;/strong>&lt;/td>
&lt;td>manipulation of the wholesale price via hydro plants&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Naturgy&lt;/strong>&lt;/td>
&lt;td>&lt;strong>19.5 million €&lt;/strong>&lt;/td>
&lt;td>manipulation of the wholesale market&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Endesa&lt;/strong>&lt;/td>
&lt;td>&lt;strong>5.8 million €&lt;/strong>&lt;/td>
&lt;td>manipulation of the wholesale market&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The &lt;strong>Iberdrola&lt;/strong> case is the most illustrative of how marginal pricing is gamed: between
&lt;strong>30 November and 23 December 2013&lt;/strong>, the company &lt;strong>raised the prices of several
hydro plants&lt;/strong> so that &lt;strong>they would not clear despite the high prices in the
day-ahead market&lt;/strong> (&lt;a href="https://nadaesgratis.es/jose-luis-ferreira/manipulacion-del-precio-en-el-mercado-electrico-espanol">Nada es Gratis&lt;/a>).
The mechanism: &lt;strong>withhold&lt;/strong> cheap water (not bidding it, or bidding it at a prohibitive price) so that
the clearing needs a more expensive plant, &lt;strong>pushing up the marginal price paid to your whole
portfolio&lt;/strong>. In a &lt;em>pay-as-clear&lt;/em> system, withdrawing cheap capacity raises the price of &lt;strong>everything&lt;/strong>
you sell that hour; the incentive to manipulate is embedded in the design.&lt;/p>
&lt;p>OMIE has supervision mechanisms and carries out audits to prevent manipulation
(&lt;a href="https://www.energiaysociedad.es/omie-cual-es-su-importancia-para-el-sistema-electrico-espanol-y-portugues/">Energía y Sociedad&lt;/a>),
and the CNMC sanctions it when it is detected; the fines above are the proof that it happens. For
the buyer, the relevant point is not to assign blame, but to recognise that &lt;strong>the price paid is
formed in a market where manipulation is possible and has happened&lt;/strong>, and that therefore
exposure to that price is a risk to manage, not a figure to accept.&lt;/p>
&lt;hr>
&lt;h2 id="the-other-speculation-hoarding-grid-capacity-and-the-new-2026-law">The other speculation: hoarding grid capacity (and the new 2026 law)&lt;/h2>
&lt;p>There is a second form of speculation, distinct from price manipulation, that affects
&lt;strong>directly&lt;/strong> anyone who wants to build a datacenter: the &lt;strong>hoarding of access and connection
permits&lt;/strong> to the grid. For years, many developers reserved &lt;strong>connection capacity&lt;/strong> at
grid nodes for projects (mostly renewable) that &lt;strong>had no real intention or capacity
to build&lt;/strong>, blocking that capacity for firm projects and speculating on the value of the
permit. Since an inference platform is a &lt;strong>demand facility&lt;/strong> that needs its connection
point, this bottleneck hits it squarely: grid capacity is a scarce and
hoarded resource.&lt;/p>
&lt;p>The regulatory response of 2026 targets exactly that. The Government (Ministry for the Ecological
Transition) finalised a set of rules, within the framework of &lt;strong>Royal Decree-Law 7/2026&lt;/strong>, to &lt;strong>free up
grid capacity and fight speculation&lt;/strong>, ensuring that firm requests can
connect (&lt;a href="https://elperiodicodelaenergia.com/el-gobierno-ultima-una-normativa-para-liberar-la-capacidad-de-las-redes-electricas-y-combatir-la-especulacion/">El Periódico de la Energía&lt;/a>,
&lt;a href="https://www.fieldfisher.com/es-es/locations/espana/actualidad/nuevo-paquete-regulatorio-energias-renovables">Fieldfisher&lt;/a>).
The central mechanism, with &lt;strong>effect from 22 March 2026&lt;/strong>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Element&lt;/th>
&lt;th>Detail&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Who pays&lt;/td>
&lt;td>holders of access and connection permits for &lt;strong>demand facilities&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>What they pay&lt;/td>
&lt;td>a &lt;strong>monthly charge&lt;/strong> for &amp;ldquo;reserving&amp;rdquo; capacity until entering operation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>How it is calculated&lt;/td>
&lt;td>transmission and distribution tolls &lt;strong>× a &amp;ldquo;k factor&amp;rdquo;&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Modulation&lt;/td>
&lt;td>by voltage level and by the &lt;strong>delay&lt;/strong> in commissioning&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>k factor&lt;/td>
&lt;td>to be set by resolution of the Secretary of State for Energy&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The logic: if reserving capacity &lt;strong>costs every month&lt;/strong> and the cost &lt;strong>grows with the delay&lt;/strong>,
hoarding stops being free and the speculator releases the capacity it is not going to use. For a
&lt;strong>real&lt;/strong> datacenter project the implication is twofold: (1) that charge on the reserved capacity has
to be budgeted &lt;strong>during construction&lt;/strong>, and (2) there is a strong incentive to &lt;strong>build
quickly&lt;/strong>, since every month of delay in starting up adds to the charge. In other words, the new law turns
commissioning time into an explicit cost. For the TCO model and the timetable of the
proposal, this is a figure to build in from the start: grid capacity is no longer reserved
&amp;ldquo;just in case&amp;rdquo; for free, and the construction schedule now has a bill attached.&lt;/p>
&lt;hr>
&lt;h2 id="the-design-debate-why-marginal-pricing-rewards-speculation">The design debate: why marginal pricing rewards speculation&lt;/h2>
&lt;p>The underlying problem is not just that some companies manipulate: it is that &lt;strong>the market design
rewards doing it&lt;/strong>. In a &lt;em>pay-as-clear&lt;/em> system (everyone is paid the marginal price), a generator with
a lot of cheap capacity has a perverse incentive: &lt;strong>withdrawing part of its cheap capacity&lt;/strong> raises
the marginal price it is paid &lt;strong>for all the capacity it does sell&lt;/strong>. If you control enough market share, the
extra revenue from raising the price of your whole portfolio can exceed what you lose by not selling
the withdrawn capacity. That is exactly what the CNMC sanctioned in the hydro case.&lt;/p>
&lt;p>The design alternatives under debate:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Design&lt;/th>
&lt;th>How it pays&lt;/th>
&lt;th>Effect on the incentive to speculate&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Pay-as-clear&lt;/strong> (current)&lt;/td>
&lt;td>everyone is paid the marginal price&lt;/td>
&lt;td>high: withdrawing capacity raises the price of everything&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Pay-as-bid&lt;/strong>&lt;/td>
&lt;td>each one is paid its own bid&lt;/td>
&lt;td>lower incentive, but strategic bidding&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Long-term contracts / PPA&lt;/strong>&lt;/td>
&lt;td>fixed bilateral price&lt;/td>
&lt;td>takes volume out of the pool, reduces exposure&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>There is no technical consensus that &lt;em>pay-as-bid&lt;/em> is better (it introduces its own problems of
strategic bidding), and the reform of the European electricity market has opted more for &lt;strong>promoting
long-term contracts (PPA and CfD)&lt;/strong> than for changing the pool mechanism. For the
buyer, the practical conclusion is the same as for the regulator: &lt;strong>taking your volume out of the pool
through forward contracts&lt;/strong> is the most direct way of not being exposed to the marginal price, and to
whoever manipulates it.&lt;/p>
&lt;hr>
&lt;h2 id="the-iberian-exception-a-patch-with-an-expiry-date">The Iberian exception: a patch with an expiry date&lt;/h2>
&lt;p>Faced with the gas price crisis of 2021–2022, the European Commission granted Spain and Portugal
an &lt;strong>exception&lt;/strong> allowing them to &lt;strong>cap the price of the gas used to produce electricity&lt;/strong>
(&lt;a href="https://www.merca2.es/2026/05/30/precio-luz-mayo-2026-disparo-2386473/">market context&lt;/a>).
The &amp;ldquo;Iberian exception&amp;rdquo; partially decoupled the electricity price from gas, containing the peaks.
It is relevant for a multi-year cost projection because it is a &lt;strong>regulatory mechanism with
limited duration&lt;/strong>: any 36-month TCO model has to consider what happens to the price if the
exception changes or expires. Regulation is another price variable, not just the market.&lt;/p>
&lt;hr>
&lt;h2 id="what-it-means-for-the-electricity-cost-of-a-cluster">What it means for the electricity cost of a cluster&lt;/h2>
&lt;p>Putting together energy per token (technical) with the Spanish price (market), the electricity cost per
token of an example node (8×H100, 0.78 kWh per million tokens with PUE) &lt;strong>according to the price
scenario&lt;/strong>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Price scenario (Spain)&lt;/th>
&lt;th>€/kWh&lt;/th>
&lt;th>Electricity cost / 1M tokens&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Solar hour / negative price&lt;/td>
&lt;td>~0&lt;/td>
&lt;td>~0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>May 2025 (low wholesale)&lt;/td>
&lt;td>0.017&lt;/td>
&lt;td>~0.013 €&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>May 2026 (average wholesale)&lt;/td>
&lt;td>0.054&lt;/td>
&lt;td>~0.042 €&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Industrial retail (with tolls and taxes)&lt;/td>
&lt;td>~0.12&lt;/td>
&lt;td>~0.094 €&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Peak hour / crisis&lt;/td>
&lt;td>0.20+&lt;/td>
&lt;td>~0.16 €&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The range is more than &lt;strong>10×&lt;/strong> between the solar hour and the peak hour, and &lt;strong>3×&lt;/strong> year on year at the
level of the average. Over a fleet consuming megawatt-hours a year, that variability is the difference
between a comfortable TCO and a suffocated one, and it does not depend on your technology but on
&lt;strong>when and how you buy the energy&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="strategies-for-not-being-left-exposed">Strategies for not being left exposed&lt;/h2>
&lt;p>This is where the technical figure turns into a decision. Four levers for managing
exposure to the Spanish price, from the least to the most structural:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Strategy&lt;/th>
&lt;th>What it does&lt;/th>
&lt;th>Trade-off&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Indexed tariff&lt;/strong>&lt;/td>
&lt;td>you pay the wholesale price hour by hour&lt;/td>
&lt;td>cheap on average, maximum exposure to volatility&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Fixed / forward tariff (OMIP)&lt;/strong>&lt;/td>
&lt;td>price locked by contract&lt;/td>
&lt;td>predictability, you pay a premium for the insurance&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>PPA with a renewable plant&lt;/strong>&lt;/td>
&lt;td>you buy directly from a solar/wind farm&lt;/td>
&lt;td>stable price and low carbon, requires volume and term&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Solar self-consumption&lt;/strong>&lt;/td>
&lt;td>you generate on site&lt;/td>
&lt;td>you cover the sunlight hours almost free, capex and space&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Temporal scheduling&lt;/strong>&lt;/td>
&lt;td>move shiftable load to cheap hours&lt;/td>
&lt;td>only applies to the non-urgent (batch, fine-tuning)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 210" role="img" aria-label="Energy purchasing strategies against volatility: indexed exposes, fixed/PPA stabilise, self-consumption and scheduling exploit the cheap hours" 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="50" width="170" height="56" rx="6"/>&lt;text x="32" y="72" class="tl">Indexed&lt;/text>&lt;text x="32" y="90" class="ts">maximum exposure&lt;/text>
&lt;rect class="bx" x="210" y="50" width="170" height="56" rx="6"/>&lt;text x="222" y="72" class="tl">Fixed / PPA&lt;/text>&lt;text x="222" y="90" class="ts">predictability (premium)&lt;/text>
&lt;rect class="bx" x="400" y="50" width="170" height="56" rx="6"/>&lt;text x="412" y="72" class="tl">Self-consumption&lt;/text>&lt;text x="412" y="90" class="ts">sunlight hours ~free&lt;/text>
&lt;rect class="bx" x="590" y="50" width="170" height="56" rx="6"/>&lt;text x="602" y="72" class="tl">Scheduling&lt;/text>&lt;text x="602" y="90" class="ts">batch at cheap hours&lt;/text>
&lt;text x="20" y="140" class="ts">← more market exposure · more control / predictability →&lt;/text>
&lt;text x="20" y="180" class="ts">For online inference (non-shiftable): fixed tariff/PPA + self-consumption. For batch/fine-tuning: schedule to off-peak or solar hours.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>The sensible combination for an inference platform in Spain: &lt;strong>a PPA or a fixed tariff&lt;/strong> for the
base load (online inference, which cannot be moved), &lt;strong>solar self-consumption&lt;/strong> to cover the midday
hours almost free, and &lt;strong>scheduling&lt;/strong> of the shiftable work (training, overnight batch) towards the
off-peak or peak-solar hours. That turns the volatility of marginal pricing from &lt;strong>risk&lt;/strong> into
&lt;strong>opportunity&lt;/strong>: the same zero-price hours that sink generators&amp;rsquo; revenue are the
cheap hours for whoever consumes.&lt;/p>
&lt;hr>
&lt;h2 id="solar-self-consumption-the-numbers-for-a-cluster">Solar self-consumption: the numbers for a cluster&lt;/h2>
&lt;p>Spain is one of the best places in Europe for solar, and for a datacenter self-consumption
has a clear cost logic. The numbers, for illustration:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Reference value&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Solar output in Spain&lt;/td>
&lt;td>~1,400–1,600 kWh per kWp per year&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Capex of an industrial installation&lt;/td>
&lt;td>~600–900 € per kWp&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Panel service life&lt;/td>
&lt;td>~25–30 years&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Electricity cost avoided (retail)&lt;/td>
&lt;td>~0.12 €/kWh&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>For a &lt;strong>100 kWp&lt;/strong> installation (warehouse roof): it generates ~150 MWh/year, with a capex of
~70,000–90,000 €. At 0.12 €/kWh avoided, it saves ~18,000 €/year, with a &lt;strong>payback of ~4–6 years&lt;/strong> and
then ~20 years of almost free energy. The snag: a cluster consumes 24/7 and solar only produces by
day, so self-consumption &lt;strong>covers a fraction&lt;/strong>, the midday hours, not everything. But those midday
hours are precisely the ones with &lt;strong>low or negative wholesale prices&lt;/strong>, so self-consumption and the
market complement each other: at night you buy cheap (off-peak), by day you generate. The &lt;em>avoided cost&lt;/em> is
not only that of the energy, it is that of &lt;strong>not being exposed&lt;/strong> to the non-existent solar peak and to
daytime volatility. For a cluster with roof space available, self-consumption is the most solid
structural lever on electricity cost in Spain.&lt;/p>
&lt;hr>
&lt;h2 id="annual-electricity-tco-three-scenarios-for-a-cluster-in-spain">Annual electricity TCO: three scenarios for a cluster in Spain&lt;/h2>
&lt;p>Putting it all together, the annual electricity cost of an 8×H100 node (~7.84 kW with PUE, ~68,700 kWh/year at
100 % utilisation) according to the purchasing strategy, in Spain:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Strategy&lt;/th>
&lt;th>Effective €/kWh&lt;/th>
&lt;th>Annual electricity cost&lt;/th>
&lt;th>Exposure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Indexed (unhedged)&lt;/td>
&lt;td>~0.08 (variable)&lt;/td>
&lt;td>&lt;strong>~5,500 €&lt;/strong> ±a lot&lt;/td>
&lt;td>maximum to volatility&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fixed / renewable PPA&lt;/td>
&lt;td>~0.06 (stable)&lt;/td>
&lt;td>&lt;strong>~4,120 €&lt;/strong>&lt;/td>
&lt;td>low, predictable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>PPA + solar self-consumption&lt;/td>
&lt;td>~0.045 (mixed)&lt;/td>
&lt;td>&lt;strong>~3,090 €&lt;/strong>&lt;/td>
&lt;td>low + minimal carbon&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The difference between the worst and the best strategy is &lt;strong>~2,400 €/year per node&lt;/strong>, before counting
the risk: the indexed option can shoot up in a bad month, while PPA+solar is stable and low.
Over a fleet of dozens of nodes and a 36-month horizon, the choice of &lt;strong>how the energy is bought&lt;/strong>
moves the TCO as much as a hardware decision, and it is a lever decided with
contracts, not with engineering. This number feeds directly into the TCO model of the FinOps track
(A8) and the sizing of the proposal.&lt;/p>
&lt;hr>
&lt;h2 id="ppas-the-central-lever-and-its-small-print-in-2026">PPAs: the central lever (and its small print in 2026)&lt;/h2>
&lt;p>Of all the strategies, the &lt;strong>PPA&lt;/strong> (Power Purchase Agreement, a long-term energy purchase
contract) is the most important piece for a datacenter in Spain today, and it deserves a
section of its own because its current situation is &lt;strong>exceptionally favourable… with a catch&lt;/strong>.&lt;/p>
&lt;h3 id="what-a-ppa-is-in-short">What a PPA is, in short&lt;/h3>
&lt;p>A PPA is a &lt;strong>bilateral, long-term contract&lt;/strong> (typically &lt;strong>10–12 years&lt;/strong> in Spain) between
a consumer and a renewable generator, at a &lt;strong>locked price&lt;/strong> per MWh. It takes your volume out of the
OMIE pool: instead of paying the marginal price hour by hour (with its volatility and its exposure to
manipulation), you pay the contract price. There are two families: &lt;strong>physical&lt;/strong> (you receive the energy from
that farm) and &lt;strong>financial/virtual&lt;/strong> (a &lt;em>swap&lt;/em> covering the difference against the market); and two
profile forms: &lt;strong>pay-as-produced&lt;/strong> (you pay for what the farm generates, when it generates, cheap but
intermittent) and &lt;strong>baseload&lt;/strong> (a guaranteed flat profile, more expensive but firm).&lt;/p>
&lt;h3 id="prices-today-historic-lows">Prices today: historic lows&lt;/h3>
&lt;p>Spain is living a unique moment in PPA prices. &lt;strong>Solar PPAs fell to a historic low
of 32.5 €/MWh in the fourth quarter of 2025&lt;/strong>, with the most competitive percentiles &lt;strong>below
30 €/MWh&lt;/strong>, half the French level (&lt;a href="https://www.pv-magazine.es/2026/02/04/la-canibalizacion-provoca-una-caida-record-de-los-precios-de-los-ppas-fotovoltaicos-en-espana-hasta-los-325-e-mwh/">pv-magazine&lt;/a>,
&lt;a href="https://elperiodicodelaenergia.com/la-canibalizacion-acerca-el-precio-de-los-ppas-solares-a-30-mwh-en-espana-la-mitad-que-en-francia/">El Periódico de la Energía&lt;/a>).
Wind sits at around &lt;strong>50–60 €/MWh&lt;/strong>. To put it in context: a solar PPA at 30 €/MWh is
&lt;strong>~0.030 €/kWh&lt;/strong>, less than half the industrial retail price (~0.12 €/kWh) and well below the
volatile wholesale price.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Technology (PPA, Spain 2026)&lt;/th>
&lt;th>Price&lt;/th>
&lt;th>Reference&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Solar photovoltaic&lt;/td>
&lt;td>&lt;strong>~32.5 €/MWh&lt;/strong> (percentiles &amp;lt;30)&lt;/td>
&lt;td>pv-magazine&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Wind&lt;/td>
&lt;td>&lt;strong>~50–60 €/MWh&lt;/strong>&lt;/td>
&lt;td>market&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Industrial retail (for comparison)&lt;/td>
&lt;td>~120 €/MWh&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="why-so-cheap-cannibalisation">Why so cheap: cannibalisation&lt;/h3>
&lt;p>The fall is no accident: it is the &lt;strong>cannibalisation&lt;/strong> of photovoltaics. The more solar is installed,
the more midday hours there are with wholesale prices close to zero or negative, which &lt;strong>sinks the value
captured&lt;/strong> by solar (captured prices have fallen below 15 €/MWh), and with it the
price at which farms sign PPAs (&lt;a href="https://www.energiaestrategica.com/espana-atraviesa-un-cierre-de-la-ventana-de-ppas-solares-mientras-el-nuevo-real-decreto-busca-aliviar-la-industria/">Energía Estratégica&lt;/a>).
With &lt;strong>more than 40 GW competing for 30 GW of demand&lt;/strong>, there is an excess of solar supply that cheapens the
PPA. For the industrial consumer it is a historic opportunity; for the solar developer, a crisis
of profitability, hence the talk of the &amp;ldquo;closing of the solar PPA window&amp;rdquo; and of the new
Royal Decree seeking to &lt;strong>restore industrial competitiveness&lt;/strong>.&lt;/p>
&lt;h3 id="spain-european-leader-in-ppas">Spain, European leader in PPAs&lt;/h3>
&lt;p>This is no marginal phenomenon: in &lt;strong>2024 Spain was the country with the most PPAs signed in Europe for the sixth
consecutive year, with 47 agreements for 4.66 GW&lt;/strong> of renewable capacity (&lt;a href="https://www.energiaysociedad.es/energias-renovables/ppaa/">market sources&lt;/a>).
The market is deep, liquid and mature, which makes it easier for a datacenter to find a counterparty.&lt;/p>
&lt;h3 id="the-catch-for-a-datacenter-annual-energy--firm-power">The catch for a datacenter: annual energy ≠ firm power&lt;/h3>
&lt;p>Here is the small print that decides the architecture. A cheap solar PPA &lt;strong>offsets energy over
the year&lt;/strong>, but &lt;strong>does not guarantee physical power every hour&lt;/strong>. And an AI datacenter &lt;strong>cannot
stop&lt;/strong> because there is no wind one January night or because the solar curve falls at dusk
(&lt;a href="https://elperiodicodelaenergia.com/la-gran-decision-energetica-de-los-data-centers">El Periódico de la Energía&lt;/a>).
This is the difference between &lt;strong>energy&lt;/strong> (kWh per year, which the solar PPA covers dirt cheap) and &lt;strong>firm
power&lt;/strong> (kW available for all 8,760 hours, which the sun does not provide). The sector sums it up like this: Spain is now
forced to talk about &lt;strong>firm energy&lt;/strong> (&lt;a href="https://revistacloud.com/los-centros-de-datos-obligan-a-espana-a-hablar-de-energia-firme">Revista Cloud&lt;/a>).&lt;/p>
&lt;p>The consequence for the design of the proposal: a solar PPA at 30 €/MWh is the &lt;strong>ideal cost floor
for the sunlight hours&lt;/strong>, but it has to be &lt;strong>combined&lt;/strong> to cover the rest: a &lt;strong>hybrid PPA&lt;/strong>
(solar + wind, which complement each other over time), &lt;strong>baseload&lt;/strong> for the flat part, or &lt;strong>storage&lt;/strong>
(batteries, which RDL 7/2026 also promotes) to move energy from the sunlight hours to the night. The
sensible energy architecture of a Spanish datacenter in 2026 is not &amp;ldquo;a solar PPA&amp;rdquo;, it is &lt;strong>a cheap
solar PPA as the daytime base + firmness for the hours without sun&lt;/strong> (wind, baseload, batteries or the grid
as backup). Anyone who signs only the cheap solar PPA and discovers in production that they have no firm
power in the small hours will have optimised the cost of the energy and ignored that of &lt;strong>availability&lt;/strong>,
which for an inference platform with an SLO is non-negotiable.&lt;/p>
&lt;h3 id="the-context-the-datacenter-boom-in-spain">The context: the datacenter boom in Spain&lt;/h3>
&lt;p>All of this is happening in the middle of a &lt;strong>boom&lt;/strong>: Spain is positioning itself as the epicentre of southern Europe in
datacenters, with investments of billions and installed capacity doubling towards 2026
(&lt;a href="https://www.datacenterdynamics.com/es/features/data-centers-en-espa%C3%B1a-hacia-2026-un-boom-de-90000-millones-en-proyectos/">DCD&lt;/a>).
The appeal combines cheap renewable PPAs, industrial land more accessible than in other European
digital capitals, and EU jurisdiction. The constraint that tempers it is exactly the one in C2: &lt;strong>the cost of
energy is low but firm power and grid capacity are the bottlenecks&lt;/strong>, and
both are managed with the combination of a hybrid PPA, storage and a connection schedule that
does not fall foul of the hoarding charge.&lt;/p>
&lt;hr>
&lt;h2 id="the-sovereign-and-carbon-angle">The sovereign and carbon angle&lt;/h2>
&lt;p>For a sovereign proposal, Spain has a double advantage worth quantifying. First,
&lt;strong>carbon&lt;/strong>: the Spanish grid runs at around &lt;strong>~150–170 gCO₂/kWh&lt;/strong> (a mix of renewables and gas), well
below Germany (~363) though above nuclear France (~20–60). Second,
&lt;strong>growing renewables&lt;/strong> (&amp;gt;40 % of generation), which pull the price and the carbon
down in the sunlight hours. The argument for the proposal: a cluster in Spain, with solar
self-consumption and a renewable PPA, can achieve at the same time a &lt;strong>low and predictable electricity
cost&lt;/strong> and a &lt;strong>competitive carbon per token&lt;/strong>, within EU jurisdiction. The volatility of marginal pricing is
not only a risk: managed well with contracting and scheduling, it is a cost lever that a
hyperscaler in another region does not exploit in the same way.&lt;/p>
&lt;p>Carbon, moreover, is &lt;strong>variable by the hour&lt;/strong>: in peak-solar hours the intensity of the Spanish
grid drops, so &lt;strong>moving shiftable load to those hours reduces both the cost and the
carbon per token at once&lt;/strong>. The same scheduling strategy serves both axes.&lt;/p>
&lt;hr>
&lt;h2 id="guarantees-of-origin-carbon-has-its-market-too">Guarantees of Origin: carbon has its market too&lt;/h2>
&lt;p>One nuance that connects price speculation with carbon reporting: in Spain (and the EU) there
is a market in &lt;strong>Guarantees of Origin (GoO)&lt;/strong>, certificates attesting that a quantity of
energy was produced from a renewable source. A company can &lt;strong>buy GoOs&lt;/strong> to declare that its
consumption is &amp;ldquo;green&amp;rdquo; in its &lt;strong>market-based&lt;/strong> carbon reporting, even though physically
the electricity it received from the grid had the average intensity of the mix. This creates two ways of
accounting for carbon, with different implications:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Method&lt;/th>
&lt;th>What it counts&lt;/th>
&lt;th>How the figure is brought down&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>By location&lt;/strong> (&lt;em>location-based&lt;/em>)&lt;/td>
&lt;td>the real intensity of the Spanish grid that hour&lt;/td>
&lt;td>generate/consume in clean hours; location&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>By market&lt;/strong> (&lt;em>market-based&lt;/em>)&lt;/td>
&lt;td>according to the GoOs/PPAs contracted&lt;/td>
&lt;td>buy certificates or sign a PPA&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Location-based&lt;/strong> accounting rewards consuming when the Spanish grid is clean (solar
hours); &lt;strong>market-based&lt;/strong> allows the green attribute to be &amp;ldquo;bought&amp;rdquo; with GoOs. CSRD reporting normally
requires both. The word of caution: the GoO market is relatively cheap, and buying GoOs without
a real PPA behind them is a way of &lt;strong>dressing up&lt;/strong> the figure without changing the physical electricity
you consume, the cost equivalent of accounting &lt;em>greenwashing&lt;/em>. For an honest sovereign
proposal, the robust route is a &lt;strong>real PPA with a Spanish renewable farm&lt;/strong> (which does change the physical
origin and stabilises the price) plus &lt;strong>location-based&lt;/strong> measurement that rewards scheduling to clean
hours, rather than accumulating certificates.&lt;/p>
&lt;hr>
&lt;h2 id="hourly-intensity-the-red-eléctrica-figure">Hourly intensity: the Red Eléctrica figure&lt;/h2>
&lt;p>Spain publishes the &lt;strong>carbon intensity of the grid hour by hour&lt;/strong> (via Red Eléctrica / esios and
ElectricityMaps), and it varies enormously over the day: on a sunny spring afternoon it can
drop to ~80–100 gCO₂/kWh, and on a cold, windless night, with gas cycles, exceed ~250. That
hourly figure is what makes &lt;strong>carbon-aware scheduling&lt;/strong> possible: moving training,
document ingestion or overnight batch to the hours of lowest intensity reduces the carbon per token
of the shiftable work at no technical cost. It is the same lever as price-based scheduling, since the
cheap hours and the clean ones largely coincide in Spain, because both are set by the excess of
solar and wind. Measuring carbon per token &amp;ldquo;on an annual average&amp;rdquo; wastes this information; measuring it
&lt;strong>hour by hour&lt;/strong> and scheduling accordingly is what turns the figure into a real reduction.&lt;/p>
&lt;hr>
&lt;h2 id="energy-per-token-with-the-spanish-price-step-by-step">Energy per token, with the Spanish price, step by step&lt;/h2>
&lt;p>Closing the circle with a complete calculation for the example node, in Spain:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Energy per token&lt;/strong>: 5,600 W (8×H100) ÷ 2,800 tok/s = &lt;strong>2 J/token&lt;/strong> (board); ×PUE 1.4 =
2.8 J/token effective.&lt;/li>
&lt;li>&lt;strong>Energy per 1M tokens&lt;/strong>: 0.78 kWh (with PUE).&lt;/li>
&lt;li>&lt;strong>Electricity cost per 1M tokens&lt;/strong> by contracting model:
&lt;ul>
&lt;li>Indexed in a solar hour (~0 €/kWh): &lt;strong>~0 €&lt;/strong>.&lt;/li>
&lt;li>Renewable PPA (~0.05 €/kWh stable): &lt;strong>~0.039 €&lt;/strong>.&lt;/li>
&lt;li>Industrial retail (~0.12 €/kWh): &lt;strong>~0.094 €&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Carbon per 1M tokens&lt;/strong>: 0.78 kWh × ~160 gCO₂/kWh = &lt;strong>~125 gCO₂&lt;/strong> (and less in solar
hours).&lt;/li>
&lt;/ol>
&lt;p>The message: the J/token is fixed (your engineering sets it); the &lt;strong>electricity cost per token varies more
than 10× depending on how and when you buy the energy&lt;/strong> in Spain. That is why this article devotes more
space to the market than to the measurement: measuring is 30 % of the problem; &lt;strong>buying well&lt;/strong> is 70 %.&lt;/p>
&lt;hr>
&lt;h2 id="limits-and-traps-data-driven">Limits and traps (data-driven)&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>A misleading annual average price.&lt;/strong> Using an annual average hides the 3× year-on-year volatility
and the 10× intraday range. Model scenarios, not a point.&lt;/li>
&lt;li>&lt;strong>Indexed by default.&lt;/strong> The indexed tariff is cheap on average but leaves you exposed to every
peak and every episode of manipulation. For base load, hedge it.&lt;/li>
&lt;li>&lt;strong>Ignoring the Iberian exception.&lt;/strong> It is a regulatory mechanism with an expiry date; a 36-month TCO
has to consider it changing.&lt;/li>
&lt;li>&lt;strong>Forgetting hourly carbon.&lt;/strong> Carbon and price fall at the same time in solar hours;
scheduling the shiftable work improves both axes.&lt;/li>
&lt;li>&lt;strong>Confusing wholesale with what you pay.&lt;/strong> Industrial retail adds tolls and taxes on top of
the wholesale price; use your contract price, not the pool price.&lt;/li>
&lt;/ol>
&lt;p>With the Spanish price understood, the energy track continues towards measurement tools
in depth (C3) and energy in TCO and regulation (C8). But the lesson of C2 is that, in
Spain, &lt;strong>the energy cost of AI is not decided in the GPU alone: it is decided in how you buy the
electricity in a market that is marginal-priced, volatile and watched for manipulation.&lt;/strong>&lt;/p>
&lt;h2 id="closing">Closing&lt;/h2>
&lt;p>Energy per token is a number that engineering fixes with precision, so many joules per token,
measured in a window aligned with the throughput, and that the Spanish electricity market multiplies
by a factor that changes more than 10× depending on the hour and 3× depending on the year. That second half, the
price one, hardly ever appears in technical AI articles, and it is what decides 30–50 % of the TCO
of a cluster in Spain. The price is formed in a &lt;strong>marginal-priced&lt;/strong> market where cheap renewables
are paid the price of gas, where volatility has tripled the bill in a year, and where
there are &lt;strong>final CNMC fines&lt;/strong>, Iberdrola 25 M€, Naturgy 19.5 M€, Endesa 5.8 M€, that show
that manipulation is not theoretical. For a sovereign inference platform in Spain, the
conclusion the data supports is twofold: measure energy per token rigorously, &lt;strong>and buy the
electricity with your head&lt;/strong> — a PPA or fixed tariff for the base load, solar self-consumption for the sunlight
hours, and scheduling of the shiftable work to the cheap, clean hours. Spain offers abundant sun,
growing renewables and a reasonable average carbon figure; well contracted, its energy is a competitive
advantage, and badly contracted, the biggest risk in the model. The J/token is yours to decide; the euro per
token, the market&amp;rsquo;s, unless you take it out of the market with a contract.&lt;/p>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/mlperf-power-energy-efficiency-benchmark/">MLPerf Power&lt;/a> — the standard benchmark of energy efficiency (energy per query, performance-per-watt) and its limits.&lt;/li>
&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 data this methodology produces is published: how to read them without falling for their biases.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/watt-to-carbon-pue-grid-intensity-gco2-per-token/">From the watt to carbon: PUE, grid intensity and the real cost of a token&lt;/a> — the step after measuring J/token: turning that figure into gCO₂eq and into real electricity cost with PUE and the country&amp;rsquo;s energy mix.&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 levers (quantization, batching, engine, schedulers) effectively reduce the J/token this methodology measures.&lt;/li>
&lt;/ul>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>OMIE · Operador del Mercado Ibérico de Energía — &lt;a href="https://www.omie.es/">https://www.omie.es/&lt;/a>&lt;/li>
&lt;li>OMIE · precio del mercado diario — &lt;a href="https://www.omie.es/es/market-results/daily/daily-market/day-ahead-price">https://www.omie.es/es/market-results/daily/daily-market/day-ahead-price&lt;/a>&lt;/li>
&lt;li>Energía y Sociedad · importancia y precios de OMIE — &lt;a href="https://www.energiaysociedad.es/omie-cual-es-su-importancia-para-el-sistema-electrico-espanol-y-portugues/">https://www.energiaysociedad.es/omie-cual-es-su-importancia-para-el-sistema-electrico-espanol-y-portugues/&lt;/a>&lt;/li>
&lt;li>Nada es Gratis · manipulación del precio en el mercado eléctrico español (multas CNMC) — &lt;a href="https://nadaesgratis.es/jose-luis-ferreira/manipulacion-del-precio-en-el-mercado-electrico-espanol">https://nadaesgratis.es/jose-luis-ferreira/manipulacion-del-precio-en-el-mercado-electrico-espanol&lt;/a>&lt;/li>
&lt;li>Merca2 · el precio de la luz en mayo 2026 (54 €/MWh, ×3 interanual) — &lt;a href="https://www.merca2.es/2026/05/30/precio-luz-mayo-2026-disparo-2386473/">https://www.merca2.es/2026/05/30/precio-luz-mayo-2026-disparo-2386473/&lt;/a>&lt;/li>
&lt;li>Banco de España · el sector eléctrico ante el alza del gas (renovables y precio) — &lt;a href="https://www.bde.es/f/webbe/SES/Secciones/Publicaciones/PublicacionesSeriadas/DocumentosOcasionales/23/Fich/do2316.pdf">https://www.bde.es/f/webbe/SES/Secciones/Publicaciones/PublicacionesSeriadas/DocumentosOcasionales/23/Fich/do2316.pdf&lt;/a>&lt;/li>
&lt;li>El Periódico de la Energía · normativa para liberar capacidad de red y combatir la especulación — &lt;a href="https://elperiodicodelaenergia.com/el-gobierno-ultima-una-normativa-para-liberar-la-capacidad-de-las-redes-electricas-y-combatir-la-especulacion/">https://elperiodicodelaenergia.com/el-gobierno-ultima-una-normativa-para-liberar-la-capacidad-de-las-redes-electricas-y-combatir-la-especulacion/&lt;/a>&lt;/li>
&lt;li>Fieldfisher · Real Decreto-ley 7/2026, paquete regulatorio de renovables — &lt;a href="https://www.fieldfisher.com/es-es/locations/espana/actualidad/nuevo-paquete-regulatorio-energias-renovables">https://www.fieldfisher.com/es-es/locations/espana/actualidad/nuevo-paquete-regulatorio-energias-renovables&lt;/a>&lt;/li>
&lt;li>Bird &amp;amp; Bird · almacenamiento energético en el RDL 7/2026 — &lt;a href="https://www.twobirds.com/es/insights/2026/spain/almacenamiento-energetico-real-decreto-ley-7-2026">https://www.twobirds.com/es/insights/2026/spain/almacenamiento-energetico-real-decreto-ley-7-2026&lt;/a>&lt;/li>
&lt;li>pv-magazine · caída récord de los PPAs fotovoltaicos a 32,5 €/MWh — &lt;a href="https://www.pv-magazine.es/2026/02/04/la-canibalizacion-provoca-una-caida-record-de-los-precios-de-los-ppas-fotovoltaicos-en-espana-hasta-los-325-e-mwh/">https://www.pv-magazine.es/2026/02/04/la-canibalizacion-provoca-una-caida-record-de-los-precios-de-los-ppas-fotovoltaicos-en-espana-hasta-los-325-e-mwh/&lt;/a>&lt;/li>
&lt;li>El Periódico de la Energía · PPAs solares cerca de 30 €/MWh (mitad que Francia) — &lt;a href="https://elperiodicodelaenergia.com/la-canibalizacion-acerca-el-precio-de-los-ppas-solares-a-30-mwh-en-espana-la-mitad-que-en-francia/">https://elperiodicodelaenergia.com/la-canibalizacion-acerca-el-precio-de-los-ppas-solares-a-30-mwh-en-espana-la-mitad-que-en-francia/&lt;/a>&lt;/li>
&lt;li>Energía Estratégica · cierre de la ventana de PPAs solares y el nuevo RD — &lt;a href="https://www.energiaestrategica.com/espana-atraviesa-un-cierre-de-la-ventana-de-ppas-solares-mientras-el-nuevo-real-decreto-busca-aliviar-la-industria/">https://www.energiaestrategica.com/espana-atraviesa-un-cierre-de-la-ventana-de-ppas-solares-mientras-el-nuevo-real-decreto-busca-aliviar-la-industria/&lt;/a>&lt;/li>
&lt;li>El Periódico de la Energía · la gran decisión energética de los data centers (energía firme) — &lt;a href="https://elperiodicodelaenergia.com/la-gran-decision-energetica-de-los-data-centers">https://elperiodicodelaenergia.com/la-gran-decision-energetica-de-los-data-centers&lt;/a>&lt;/li>
&lt;li>Revista Cloud · los centros de datos obligan a España a hablar de energía firme — &lt;a href="https://revistacloud.com/los-centros-de-datos-obligan-a-espana-a-hablar-de-energia-firme">https://revistacloud.com/los-centros-de-datos-obligan-a-espana-a-hablar-de-energia-firme&lt;/a>&lt;/li>
&lt;li>DCD · boom de data centers en España hacia 2026 — &lt;a href="https://www.datacenterdynamics.com/es/features/data-centers-en-espa%C3%B1a-hacia-2026-un-boom-de-90000-millones-en-proyectos/">https://www.datacenterdynamics.com/es/features/data-centers-en-espa%C3%B1a-hacia-2026-un-boom-de-90000-millones-en-proyectos/&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Cost, performance and energy: the three axes of LLM inference and the identity that ties them together</title><link>https://blog.lo0.es/en/posts/cost-performance-energy-three-axes-llm-inference/</link><pubDate>Sat, 13 Jun 2026 03:30:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/cost-performance-energy-three-axes-llm-inference/</guid><description>&lt;blockquote>
&lt;p>Notation: amounts in &lt;strong>euros (N €)&lt;/strong>, decimals with a point. Cost and energy references are
European (France, Germany, Spain), because the aim is to defend a sovereign European
architecture; when a source quotes prices in dollars it is flagged as &amp;ldquo;USD&amp;rdquo;. The dollar
symbol is not used (on this site it is a formula delimiter).&lt;/p>
&lt;/blockquote>
&lt;h2 id="what-this-series-is">What this series is&lt;/h2>
&lt;p>This is the first instalment of a series of &lt;strong>28 data articles&lt;/strong> (not opinion pieces)
about the three dimensions that decide whether a sovereign European LLM platform is
sustainable: &lt;strong>cost (FinOps)&lt;/strong>, &lt;strong>performance (benchmarking)&lt;/strong> and &lt;strong>energy&lt;/strong>. The aim
is to have a body of verifiable figures, with their methodology, to support architecture
decisions with numbers rather than intuition. This first article sets the
frame: what each axis measures, &lt;strong>how they link to one another&lt;/strong>, an end-to-end worked
example with European data and the 2026 references that will be used as a base.&lt;/p>
&lt;p>The quantitative thesis, in one sentence: the three axes &lt;strong>are not independent&lt;/strong>. Throughput
(tokens per second) is the common denominator of cost per token and energy per token, and
energy is, on top of that, between &lt;strong>30 % and 50 %&lt;/strong> of the cost itself. Optimising one moves
the other two. And in Europe, where the cluster sits (France, Germany, Spain) changes
both the electricity cost and the carbon per token at once.&lt;/p>
&lt;hr>
&lt;h2 id="the-three-axes-and-their-metrics">The three axes and their metrics&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Axis&lt;/th>
&lt;th>Question&lt;/th>
&lt;th>Key metrics&lt;/th>
&lt;th>Unit&lt;/th>
&lt;th>Tool family&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Cost (FinOps)&lt;/td>
&lt;td>How much does each unit of work cost?&lt;/td>
&lt;td>cost/1M tokens (CPM), cost/request, €/GPU-hour, utilisation&lt;/td>
&lt;td>€/1M tok, €/h&lt;/td>
&lt;td>OpenCost, Kubecost, CloudZero&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Performance&lt;/td>
&lt;td>How much work per second and at what latency?&lt;/td>
&lt;td>TTFT, TPOT/ITL, throughput, goodput, P50/P99&lt;/td>
&lt;td>tok/s, ms&lt;/td>
&lt;td>GuideLLM, AIPerf, LLMPerf, MLPerf Inference&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Energy&lt;/td>
&lt;td>How many watts per unit of work?&lt;/td>
&lt;td>energy/token, average power, PUE, carbon&lt;/td>
&lt;td>J/tok, Wh, kWh, gCO₂&lt;/td>
&lt;td>Zeus, CodeCarbon, MLPerf Power, Kepler&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Each axis has its own in-depth introductory article in this same batch; here only how they
fit together matters. It is worth breaking each one down a little more before crossing them.&lt;/p>
&lt;h3 id="cost-axis-in-detail">Cost axis in detail&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Metric&lt;/th>
&lt;th>Definition&lt;/th>
&lt;th>Why it matters&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>CPM (cost/1M tokens)&lt;/td>
&lt;td>cluster cost ÷ tokens produced&lt;/td>
&lt;td>the comparable unit on-prem vs cloud&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cost per request&lt;/td>
&lt;td>cost attributed to one complete request&lt;/td>
&lt;td>billing by real usage&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>€/GPU-hour&lt;/td>
&lt;td>hourly cost of a GPU (amortised or rented)&lt;/td>
&lt;td>the basis of any calculation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Utilisation&lt;/td>
&lt;td>fraction of the GPU actually used&lt;/td>
&lt;td>the lever that moves everything else&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fixed vs variable cost&lt;/td>
&lt;td>amortised capex vs energy/operations&lt;/td>
&lt;td>defines the break-even point&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="performance-axis-in-detail">Performance axis in detail&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Metric&lt;/th>
&lt;th>Definition&lt;/th>
&lt;th>Dominant phase&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>TTFT&lt;/td>
&lt;td>latency to the first token&lt;/td>
&lt;td>prefill&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TPOT / ITL&lt;/td>
&lt;td>time between output tokens&lt;/td>
&lt;td>decode&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Throughput&lt;/td>
&lt;td>tokens or requests per second of the system&lt;/td>
&lt;td>both&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Goodput&lt;/td>
&lt;td>throughput that meets the SLO (not the raw figure)&lt;/td>
&lt;td>the honest number&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>P95 / P99&lt;/td>
&lt;td>latency percentiles (not the mean)&lt;/td>
&lt;td>the real experience&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="energy-axis-in-detail">Energy axis in detail&lt;/h3>
&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>Average power&lt;/td>
&lt;td>average instantaneous consumption&lt;/td>
&lt;td>W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Energy per token&lt;/td>
&lt;td>energy per generated token&lt;/td>
&lt;td>J/token&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>PUE&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;hr>
&lt;h2 id="the-identity-that-ties-the-three-axes-together-throughput">The identity that ties the three axes together: throughput&lt;/h2>
&lt;p>The &lt;strong>cost per million tokens (CPM)&lt;/strong> is the cluster&amp;rsquo;s cost divided by what it
produces:&lt;/p>
$$\text{CPM} = \frac{\text{cluster cost per hour}}{\text{throughput (tok/s)} \times 3600 / 10^6}$$
&lt;p>&lt;strong>Energy per token&lt;/strong> has exactly the same form, with power in the
numerator:&lt;/p>
$$\text{energy per token (J)} = \frac{\text{average power (W)}}{\text{throughput (tok/s)}}$$
&lt;p>The two share the &lt;strong>same denominator&lt;/strong>: throughput. Hence the key operational consequence:
&lt;strong>every performance improvement that raises tokens/s lowers both cost per token and
energy per token at the same time&lt;/strong>. These are not three separate optimisations; throughput moves them together.
That is why performance benchmarking (axis 2) is, at bottom, also a FinOps tool and an
energy efficiency tool.&lt;/p>
&lt;p>The CPM↔throughput relationship is direct: the higher the throughput, the lower the CPM. It is the identity on
which the whole cost analysis of the series is built.&lt;/p>
&lt;hr>
&lt;h2 id="worked-example-unit-economics-of-an-8h100-node-in-europe">Worked example: unit economics of an 8×H100 node in Europe&lt;/h2>
&lt;p>To see the identity in action, an end-to-end calculation on an example node
(8×H100 SXM, Llama 3.1 70B FP16 served with vLLM), with European prices. Order-of-magnitude
figures; the methodology is what matters.&lt;/p>
&lt;p>&lt;strong>Starting data:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Value&lt;/th>
&lt;th>Source&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>European cloud rental (Scaleway, per H100)&lt;/td>
&lt;td>2.73 €/h&lt;/td>
&lt;td>&lt;a href="https://www.scaleway.com/en/h100/">Scaleway&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>→ 8×H100 node on-demand&lt;/td>
&lt;td>~21.84 €/h&lt;/td>
&lt;td>8 × 2.73&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Amortised on-prem cost (estimate)&lt;/td>
&lt;td>~10–13 €/h&lt;/td>
&lt;td>capex 24–36 months + opex&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Throughput&lt;/td>
&lt;td>2,800 tok/s&lt;/td>
&lt;td>reference benchmark&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Power per H100 (TDP)&lt;/td>
&lt;td>up to 700 W&lt;/td>
&lt;td>&lt;a href="https://www.nvidia.com/en-us/data-center/h100/">NVIDIA&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Reference PUE&lt;/td>
&lt;td>1.4&lt;/td>
&lt;td>typical of a datacenter&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Cost per million tokens.&lt;/strong> At 2,800 tok/s, hourly throughput is
2,800 × 3,600 / 10⁶ = 10.08 million tokens/hour. Therefore:&lt;/p>
$$\text{CPM (cloud)} = \frac{21{.}84}{10{.}08} \approx 2{.}17 \text{ €/1M tok}$$
&lt;p>With the amortised on-prem cost (~11 €/h) it drops to &lt;strong>~1.09 €/1M tok&lt;/strong>, the difference between
renting from a provider and amortising your own iron.&lt;/p>
&lt;p>&lt;strong>Energy per token.&lt;/strong> The power of the 8 cards is 8 × 700 = 5,600 W (board only).
Over 2,800 tok/s:&lt;/p>
$$\text{energy per token} = \frac{5,600}{2,800} = 2 \text{ J/token (board)}$$
&lt;p>Over a million tokens that is 2 × 10⁶ J = 0.56 kWh (GPU only). Applying PUE 1.4: ~0.78
kWh per million tokens. At French wholesale prices (~0.058 €/kWh) that is ~0.045 € of
electricity per million tokens; in Germany (~0.091 €/kWh), ~0.071 €, some 57 % more, because of
the grid, not the model.&lt;/p>
&lt;p>&lt;strong>The link.&lt;/strong> If a serving optimisation raised throughput from 2,800 to 4,200 tok/s
(+50 %), the CPM would fall to ~1.45 €/1M tok and energy per token to ~1.33 J, both at
once, through the same denominator. That is the identity, with numbers.&lt;/p>
&lt;hr>
&lt;h2 id="energy-is-inside-the-cost">Energy is &lt;em>inside&lt;/em> the cost&lt;/h2>
&lt;p>The second link: energy is not an axis separate from cost, it is &lt;strong>a large component of
it&lt;/strong>. 2026 reference data:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Figure&lt;/th>
&lt;th>Value&lt;/th>
&lt;th>Source&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Electricity as a share of TCO (5 years)&lt;/td>
&lt;td>30–40 % (&amp;gt;50 % at high density 24/7)&lt;/td>
&lt;td>&lt;a href="https://www.spheron.network/blog/ai-inference-power-electricity-cost-2026/">Spheron&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Day-ahead wholesale France (Mar-2026)&lt;/td>
&lt;td>~58 €/MWh (0.058 €/kWh)&lt;/td>
&lt;td>&lt;a href="https://tradingeconomics.com/france/electricity-price">TradingEconomics&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Day-ahead wholesale Spain&lt;/td>
&lt;td>~54 €/MWh (0.054 €/kWh)&lt;/td>
&lt;td>&lt;a href="https://tradingeconomics.com/spain/electricity-price">TradingEconomics&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Day-ahead wholesale Germany&lt;/td>
&lt;td>~91 €/MWh (0.091 €/kWh)&lt;/td>
&lt;td>&lt;a href="https://www.tradingeconomics.com/germany/electricity-price">TradingEconomics&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Electricity cost/token at 80 % util&lt;/td>
&lt;td>¼ of that at 20 % util&lt;/td>
&lt;td>&lt;a href="https://www.spheron.network/blog/ai-inference-power-electricity-cost-2026/">Spheron&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>A methodological warning: the &lt;strong>wholesale&lt;/strong> price (day-ahead) is not what a company pays; &lt;strong>industrial
retail&lt;/strong> adds grid charges and taxes (roughly ×1.5–2). But the relative
ordering holds: &lt;strong>France and Spain, cheap; Germany, expensive.&lt;/strong>&lt;/p>
&lt;p>The third link, utilisation, closes the triangle: power is consumed even when the
GPU is idle, so spreading the fixed cost (energy included) over more tokens (more
throughput, more occupancy) &lt;strong>lowers all three axes at once&lt;/strong>. The electricity cost per token at
80 % utilisation is a quarter of what it is at 20 %.&lt;/p>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 300" role="img" aria-label="The three axes (cost, performance, energy) linked by throughput at the centre; energy is also a component of cost" xmlns="http://www.w3.org/2000/svg">
&lt;style>.bx{fill:none;stroke:currentColor;stroke-width:1.3}.tl{font:600 13px sans-serif;fill:currentColor}.ts{font:11px sans-serif;fill:currentColor}.ar{fill:none;stroke:currentColor;stroke-width:1.2;stroke-dasharray:4 3}&lt;/style>
&lt;rect class="bx" x="300" y="120" width="180" height="60" rx="8"/>
&lt;text x="390" y="146" text-anchor="middle" class="tl">THROUGHPUT&lt;/text>
&lt;text x="390" y="164" text-anchor="middle" class="ts">tokens/s · common denominator&lt;/text>
&lt;rect class="bx" x="40" y="40" width="200" height="64" rx="8"/>
&lt;text x="56" y="63" class="tl">Cost (FinOps)&lt;/text>
&lt;text x="56" y="81" class="ts">CPM = cost/h ÷ throughput&lt;/text>
&lt;text x="56" y="97" class="ts">€/1M tok · utilisation&lt;/text>
&lt;rect class="bx" x="540" y="40" width="200" height="64" rx="8"/>
&lt;text x="556" y="63" class="tl">Performance&lt;/text>
&lt;text x="556" y="81" class="ts">TTFT · TPOT · goodput&lt;/text>
&lt;text x="556" y="97" class="ts">raise tok/s -> lower the others&lt;/text>
&lt;rect class="bx" x="290" y="220" width="200" height="60" rx="8"/>
&lt;text x="306" y="243" class="tl">Energy&lt;/text>
&lt;text x="306" y="261" class="ts">J/tok = W ÷ throughput&lt;/text>
&lt;line class="ar" x1="240" y1="92" x2="300" y2="135"/>
&lt;line class="ar" x1="540" y1="92" x2="480" y2="135"/>
&lt;line class="ar" x1="390" y1="180" x2="390" y2="220"/>
&lt;line class="ar" x1="140" y1="104" x2="320" y2="220"/>
&lt;text x="150" y="170" class="ts">energy = 30-50 % of cost (TCO)&lt;/text>
&lt;text x="40" y="295" class="ts">Improving throughput lowers cost/token and energy/token at once; raising utilisation spreads fixed cost over more tokens.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;hr>
&lt;h2 id="sensitivity-analysis-what-moves-the-cost-per-token">Sensitivity analysis: what moves the cost per token&lt;/h2>
&lt;p>Four levers dominate the CPM, and it is worth knowing their elasticity before defending
any figure:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Lever&lt;/th>
&lt;th>Change&lt;/th>
&lt;th>Effect on CPM&lt;/th>
&lt;th>Mechanism&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Throughput&lt;/td>
&lt;td>+50 % tok/s&lt;/td>
&lt;td>−33 % CPM&lt;/td>
&lt;td>direct denominator&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Utilisation&lt;/td>
&lt;td>20 % → 80 %&lt;/td>
&lt;td>up to −75 % on the electricity portion&lt;/td>
&lt;td>spreads fixed cost&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Location (energy)&lt;/td>
&lt;td>Germany → France&lt;/td>
&lt;td>lowers the electricity portion (~37 % less €/kWh)&lt;/td>
&lt;td>wholesale FR &amp;lt; DE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Amortise vs rent&lt;/td>
&lt;td>21.84 → 11 €/h&lt;/td>
&lt;td>−50 % CPM&lt;/td>
&lt;td>removes the provider&amp;rsquo;s margin&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Quantisation (FP8/INT4)&lt;/td>
&lt;td>+throughput, −VRAM/KV&lt;/td>
&lt;td>lowers CPM and J/token&lt;/td>
&lt;td>same identity&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The reading: the CPM &lt;strong>is not a number, it is a function&lt;/strong> of utilisation, throughput, location
(energy price) and ownership model. Any on-prem vs cloud comparison that does not
fix those assumptions is not comparable, and that is exactly the job of the synthesis article.&lt;/p>
&lt;hr>
&lt;h2 id="simplified-tco-model-on-premise">Simplified TCO model (on-premise)&lt;/h2>
&lt;p>The real on-premise cost is not the GPU alone: it is &lt;strong>amortised capex + opex&lt;/strong>, over a hardware
cycle of 24–36 months. Reference structure of an inference node:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Component&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Typical weight&lt;/th>
&lt;th>Notes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>GPUs&lt;/td>
&lt;td>capex&lt;/td>
&lt;td>the bulk&lt;/td>
&lt;td>amortise over 24–36 months&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Server, network, BMC&lt;/td>
&lt;td>capex&lt;/td>
&lt;td>medium&lt;/td>
&lt;td>NICs, switching, out-of-band management&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Electricity&lt;/td>
&lt;td>opex&lt;/td>
&lt;td>30–50 % of TCO&lt;/td>
&lt;td>depending on country (FR/ES cheap, DE expensive) and PUE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cooling&lt;/td>
&lt;td>opex&lt;/td>
&lt;td>inside the PUE&lt;/td>
&lt;td>PUE 1.2–1.6 typical&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Maintenance and support&lt;/td>
&lt;td>opex&lt;/td>
&lt;td>medium&lt;/td>
&lt;td>spares, contracts, RMA&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Staff and operations&lt;/td>
&lt;td>opex&lt;/td>
&lt;td>variable&lt;/td>
&lt;td>the hidden cost that cloud rental includes&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The difference between cloud rental (21.84 €/h in the example) and the real amortised cost
(~10–13 €/h) is this breakdown: the provider charges a margin for absorbing capex,
cooling and operations. The break-even point appears when sustained volume
exceeds &lt;strong>~2M tokens/day&lt;/strong>, with typical amortisation in &lt;strong>6–12 months&lt;/strong>
(&lt;a href="https://www.spheron.network/blog/ai-inference-cost-economics-2026/">Spheron&lt;/a>). Below
that threshold, renting usually wins; above it, amortising. Article A8 develops the
full model and synthesis S3 connects it with sizing.&lt;/p>
&lt;hr>
&lt;h2 id="reference-the-price-of-a-gpu-hour-in-european-sovereign-cloud">Reference: the price of a GPU-hour in European sovereign cloud&lt;/h2>
&lt;p>The other side of the on-prem comparison is the price of renting the GPU. For a
sovereign European platform, what matters is not AWS/GCP/Azure (subject to the &lt;strong>US CLOUD
Act&lt;/strong>), but the European providers:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Provider&lt;/th>
&lt;th>H100 (€/hour)&lt;/th>
&lt;th>Location&lt;/th>
&lt;th>Sovereignty&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Scaleway&lt;/td>
&lt;td>from 2.73&lt;/td>
&lt;td>Paris, Warsaw&lt;/td>
&lt;td>EU jurisdiction, exempt from US CLOUD Act&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OVHcloud&lt;/td>
&lt;td>+40–45 % vs Scaleway&lt;/td>
&lt;td>France, Germany&lt;/td>
&lt;td>EU jurisdiction, exempt from US CLOUD Act&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hyperscalers (reference)&lt;/td>
&lt;td>3–7 USD&lt;/td>
&lt;td>global&lt;/td>
&lt;td>subject to US CLOUD Act&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The data: Scaleway offers the H100 from &lt;strong>2.73 €/h&lt;/strong> in European datacenters (Paris, Warsaw),
with models and data under EU jurisdiction, immune to extraterritorial regulation; OVHcloud
serves it from France and Germany, ~40–45 % more expensive than Scaleway as of March 2026. Both are
&lt;strong>exempt from the US CLOUD Act&lt;/strong>, the foundational sovereignty requirement for data subject to
GDPR (&lt;a href="https://www.scaleway.com/en/h100/">Scaleway&lt;/a>, &lt;a href="https://deploybase.ai/articles/ovhcloud-gpu-pricing">DeployBase&lt;/a>).&lt;/p>
&lt;p>The implication for the proposal: the comparison is not only cost, it is &lt;strong>cost + sovereignty&lt;/strong>. An
on-prem cluster of your own or a European cloud keep the data under EU jurisdiction; a
US hyperscaler does not, however cheap the GPU-hour comes out. That is the leg that the
cost axis on its own does not capture, and that synthesis S2 quantifies.&lt;/p>
&lt;hr>
&lt;h2 id="energy-and-carbon-reference-france-germany-spain">Energy and carbon reference: France, Germany, Spain&lt;/h2>
&lt;p>Here the choice of European country changes both the electricity cost and the carbon per
token. It is the most important table for a sovereign proposal:&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>France&lt;/td>
&lt;td>~58&lt;/td>
&lt;td>~20–60&lt;/td>
&lt;td>nuclear: cheap and very clean&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Spain&lt;/td>
&lt;td>~54&lt;/td>
&lt;td>~150–170&lt;/td>
&lt;td>renewables + gas: cheap, medium carbon&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Germany&lt;/td>
&lt;td>~91&lt;/td>
&lt;td>~363 (2024 average)&lt;/td>
&lt;td>coal/gas + renewables: expensive and dirty&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Sources: day-ahead wholesale prices (&lt;a href="https://tradingeconomics.com/france/electricity-price">TradingEconomics&lt;/a>),
German carbon ~363 gCO₂/kWh (2024 average, &lt;a href="https://en.wikipedia.org/wiki/Electricity_sector_in_Germany">Statista via 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). The PUE multiplies all of that energy: at 1.4, for every kWh of
GPU the datacenter spends 1.4 kWh with cooling included.&lt;/p>
&lt;p>The calculation, on the example node (0.78 kWh per million tokens, with PUE): in
France (~40 gCO₂/kWh) it is &lt;strong>~31 gCO₂ per million tokens&lt;/strong>; in Germany (~363
gCO₂/kWh), &lt;strong>~283 gCO₂ per million&lt;/strong>, a factor of &lt;strong>~9×&lt;/strong>. That is, the same load
served in France emits of the order of &lt;strong>9× less carbon per token&lt;/strong> than in Germany, and
costs ~37 % less in electricity, &lt;strong>without touching a single line of the stack&lt;/strong>, purely because of the
country&amp;rsquo;s grid. &lt;strong>Siting the cluster in France
or Spain is at once a cost lever, a carbon lever and a compliance lever.&lt;/strong> Hourly grid
intensity is obtained from ElectricityMaps, the reference source for these
calculations.&lt;/p>
&lt;p>Scale context: global datacenters consumed &lt;strong>~460 TWh in 2025&lt;/strong> (≈1.8 % of the world&amp;rsquo;s
electricity), and the IEA projects passing &lt;strong>800 TWh in 2028&lt;/strong>, which is why energy
efficiency per token stops being a detail and becomes a design constraint,
and why carbon enters the European regulatory equation.&lt;/p>
&lt;hr>
&lt;h2 id="sovereignty-and-regulation-the-axis-that-does-not-appear-in-the-cpm">Sovereignty and regulation: the axis that does not appear in the CPM&lt;/h2>
&lt;p>For a European platform there is a fourth factor that the three numerical axes &lt;strong>do not
capture&lt;/strong>, and that can invalidate the lowest cost figure: jurisdiction. Three
fronts that turn &amp;ldquo;the cheapest GPU-hour&amp;rdquo; into &amp;ldquo;the cheapest GPU-hour &lt;em>that complies&lt;/em>&amp;rdquo;:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Front&lt;/th>
&lt;th>What it requires&lt;/th>
&lt;th>Architectural implication&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>GDPR + US CLOUD Act&lt;/td>
&lt;td>personal data under a jurisdiction accessible to US authorities is exposed&lt;/td>
&lt;td>European cloud (Scaleway/OVHcloud) or on-prem keep the data in the EU&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>EU AI Act&lt;/td>
&lt;td>obligations for high-risk systems (traceability, control, documentation)&lt;/td>
&lt;td>on-prem control makes auditability and compliance easier&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CSRD / emissions reporting&lt;/td>
&lt;td>reporting the carbon footprint (scope 2)&lt;/td>
&lt;td>a low-carbon grid (France) improves the reported figure&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The key point for the proposal: a US hyperscaler can offer a competitive
GPU-hour, but it &lt;strong>puts the data under the US CLOUD Act&lt;/strong>, which for data subject to GDPR
is a compliance risk, not a saving. That is why this series&amp;rsquo; comparison is not made
in USD against US providers: it is made in euros, against options that keep
&lt;strong>data sovereignty&lt;/strong>, on-prem of your own or European cloud. Cost, energy and
carbon are measurable axes; sovereignty is the constraint that decides &lt;strong>which options even
enter the table&lt;/strong>. This links with &lt;a href="https://blog.lo0.es/en/posts/eu-ai-act-technical-dossier-on-premise-llm-architecture/">the mapping of the EU AI Act onto the on-premise
architecture&lt;/a> and with &lt;a href="https://blog.lo0.es/en/posts/technical-controls-ens-iso-42001-eu-ai-act-cross-mapping/">the technical
controls ENS × ISO 42001 × EU AI Act&lt;/a>.&lt;/p>
&lt;p>The operational conclusion: &lt;strong>France and Spain not only come out cheaper and cleaner than
Germany; being EU jurisdiction, they meet the sovereignty constraint that a US
hyperscaler does not meet at any price.&lt;/strong> Three advantages that reinforce each other, and that the
proposal can defend with the same table.&lt;/p>
&lt;hr>
&lt;h2 id="methodology-how-to-read-and-not-fool-yourself-with-these-figures">Methodology: how to read (and not fool yourself with) these figures&lt;/h2>
&lt;p>Five warnings that apply to all the data in this series:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Board vs node.&lt;/strong> The GPU&amp;rsquo;s power (700 W per H100) is the floor; the complete
node (CPU, NICs, power supplies, fans) consumes more. Always compare the same boundary.&lt;/li>
&lt;li>&lt;strong>Wholesale vs retail.&lt;/strong> The day-ahead price is not what the company pays; industrial
retail adds grid charges and taxes. Use whichever matches your contract.&lt;/li>
&lt;li>&lt;strong>Measured vs estimated.&lt;/strong> A wattmeter figure and an &lt;code>nvidia-smi&lt;/code> estimate are not
the same thing; the difference is quantified in the energy articles.&lt;/li>
&lt;li>&lt;strong>Amortisation assumptions.&lt;/strong> The on-prem cost/hour depends on the hardware cycle (24 vs
36 months) and on the assumed utilisation; changing those assumptions moves the CPM more than
any serving optimisation.&lt;/li>
&lt;li>&lt;strong>Comparability.&lt;/strong> Two CPM or J/token figures are only comparable if model,
precision, context length, load &lt;strong>and country&lt;/strong> match. Most public
comparisons (and in USD) do not fix those assumptions, which is why the series reproduces the ones that matter
with its own harness and European data.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="the-combined-scorecard">The combined scorecard&lt;/h2>
&lt;p>The destination of the series is a single board where each model/configuration/location is
scored on all the axes at once, to decide on a &lt;strong>Pareto frontier&lt;/strong> rather than on a
single number. An &lt;strong>illustrative&lt;/strong> example (order-of-magnitude figures) on the same
8×H100 node:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Candidate&lt;/th>
&lt;th>CPM (€/1M)&lt;/th>
&lt;th>Goodput (tok/s)&lt;/th>
&lt;th>Energy (J/tok)&lt;/th>
&lt;th>Carbon (gCO₂/1M)&lt;/th>
&lt;th>Sovereignty&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>A · 70B FP16, on-prem France&lt;/td>
&lt;td>~1.09&lt;/td>
&lt;td>~2,800&lt;/td>
&lt;td>~2.0&lt;/td>
&lt;td>low (grid ~40 gCO₂/kWh)&lt;/td>
&lt;td>EU&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>B · 70B FP8, on-prem France&lt;/td>
&lt;td>~0.75&lt;/td>
&lt;td>~4,000&lt;/td>
&lt;td>~1.4&lt;/td>
&lt;td>lower&lt;/td>
&lt;td>EU&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>C · Scaleway on-demand&lt;/td>
&lt;td>~2.17&lt;/td>
&lt;td>~2,800&lt;/td>
&lt;td>n/a&lt;/td>
&lt;td>low (FR)&lt;/td>
&lt;td>EU&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>D · US hyperscaler&lt;/td>
&lt;td>~3.0&lt;/td>
&lt;td>~2,800&lt;/td>
&lt;td>n/a&lt;/td>
&lt;td>depends on region&lt;/td>
&lt;td>not EU&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The reading: &lt;strong>B dominates A&lt;/strong> on the three intrinsic axes thanks to FP8. C (European cloud) is
more expensive per token but shifts capex and operations, while keeping sovereignty. D
(hyperscaler) may be competitive on cost but &lt;strong>loses sovereignty&lt;/strong>, an axis that for
GDPR data is not negotiable. No isolated number decides: the choice comes from &lt;strong>seeing
the whole row&lt;/strong>.&lt;/p>
&lt;p>The trap the board avoids: &lt;strong>optimising a single axis&lt;/strong>. Each cell will be filled in by an
article in the series with measured data.&lt;/p>
&lt;hr>
&lt;h2 id="where-each-axis-is-measured-from-design-to-production">Where each axis is measured: from design to production&lt;/h2>
&lt;p>Each axis is measured at three different moments, with different tools and increasing
precision. Confusing them is a common source of figures that do not add up:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Axis&lt;/th>
&lt;th>Design (estimate)&lt;/th>
&lt;th>Benchmark (controlled)&lt;/th>
&lt;th>Production (continuous)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Cost&lt;/td>
&lt;td>datasheet, GPU-hour price&lt;/td>
&lt;td>CPM measured over synthetic load&lt;/td>
&lt;td>OpenCost/Kubecost per team and token&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Performance&lt;/td>
&lt;td>theoretical throughput (roofline)&lt;/td>
&lt;td>GuideLLM/AIPerf with SLO&lt;/td>
&lt;td>OTel/Langfuse over real traffic&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Energy&lt;/td>
&lt;td>TDP × hours&lt;/td>
&lt;td>Zeus/MLPerf Power on the bench&lt;/td>
&lt;td>Kepler/DCGM per pod in the cluster&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The rule: a design figure serves for sizing, but not for defending a
proposal; for that you need a reproducible benchmark figure, and to operate, a
continuous production one. When someone disputes a number in the proposal, the answer is not
&amp;ldquo;a blog says so&amp;rdquo;, but &amp;ldquo;here is the bench, here is the methodology, reproduce it&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="glossary-of-units-and-conversions">Glossary of units and conversions&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Quantity&lt;/th>
&lt;th>Unit&lt;/th>
&lt;th>Conversion / reference&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Energy&lt;/td>
&lt;td>joule (J), watt-hour (Wh)&lt;/td>
&lt;td>1 Wh = 3,600 J; 1 kWh = 3.6 MJ = 3,600,000 J&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Power&lt;/td>
&lt;td>watt (W)&lt;/td>
&lt;td>1 W = 1 J/s; H100 ≈ 700 W TDP&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Energy per token&lt;/td>
&lt;td>J/token&lt;/td>
&lt;td>= average power (W) ÷ throughput (tok/s)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Throughput&lt;/td>
&lt;td>tok/s&lt;/td>
&lt;td>tokens generated per second by the system&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cost per token&lt;/td>
&lt;td>€/1M tok (CPM)&lt;/td>
&lt;td>= cost/hour ÷ (tok/s × 3,600 / 10⁶)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Latency&lt;/td>
&lt;td>ms&lt;/td>
&lt;td>TTFT (first token), TPOT/ITL (between tokens)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>PUE&lt;/td>
&lt;td>ratio (≥1)&lt;/td>
&lt;td>total DC energy ÷ compute energy&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Carbon&lt;/td>
&lt;td>gCO₂eq&lt;/td>
&lt;td>= energy (kWh) × PUE × grid intensity (gCO₂/kWh)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>A useful conversion to keep in your head: at a constant 700 W, an H100 consumes ~0.7 kWh per hour, ~16.8
kWh a day and ~6,130 kWh a year (board only, no PUE). Multiplied by the PUE and your country&amp;rsquo;s
energy price (FR ~0.058, ES ~0.054, DE ~0.091 €/kWh wholesale), that number is the basis
of the electricity portion of the TCO.&lt;/p>
&lt;hr>
&lt;h2 id="how-the-rest-of-the-series-fits-together">How the rest of the series fits together&lt;/h2>
&lt;p>The 28 articles group into four tracks; this is the map:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Track&lt;/th>
&lt;th>What it contributes&lt;/th>
&lt;th>Closes with&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>FinOps (8)&lt;/td>
&lt;td>measuring and allocating cost, TCO model&lt;/td>
&lt;td>cost/token comparable on-prem vs European cloud&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LLM benchmarking (8)&lt;/td>
&lt;td>measuring performance reproducibly&lt;/td>
&lt;td>Pareto frontier of engines&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Energy (8)&lt;/td>
&lt;td>measuring watts and carbon per token&lt;/td>
&lt;td>energy in the TCO and in European regulation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Synthesis (4)&lt;/td>
&lt;td>crossing the three axes&lt;/td>
&lt;td>scorecard, on-prem vs cloud, sizing, harness&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The three articles that follow this one in the batch introduce each axis in depth:
their frameworks and the state of the art. From there, each article adds a layer of data
to the final scorecard.&lt;/p>
&lt;p>The thread running through all 28 instalments is the one in this article: &lt;strong>cost, performance and energy
are a single problem with three faces, tied together by throughput and by the energy that lives
inside the cost, and in Europe, by the country where the cluster sits&lt;/strong>. Anyone who optimises one
face while ignoring the others will end up with a pretty number and a platform that does not hold up.
The work of the series is to produce the figures, measured, dated, European and reproducible,
that allow a sovereign architecture to be defended before any committee with the only answer
that closes a technical debate: the data and the bench to reproduce 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-serving-engines-pareto-frontier-comparison/">Comparison of serving engines (vLLM/SGLang/TRT-LLM/Dynamo)&lt;/a> — the synthesis of the performance axis: which engine wins at each point of the goodput-latency frontier with measured data.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-quality-benchmarks-contamination-trap-oss-tools/">LLM quality benchmarks: MMLU, MT-Bench, HELM and the leaderboards that matter&lt;/a> — the quality dimension that complements performance: how public leaderboards let you calibrate the right model for each SLO.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-energy-leaderboards-wh-per-token/">LLM energy efficiency leaderboards&lt;/a> — the synthesis of the energy axis: the J/token rankings and how to read them without being fooled by the benchmark&amp;rsquo;s setup.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/cloud-gpu-on-demand-reserved-spot-neoclouds-2026-prices/">Cloud GPU: comparison of prices, commitment and sovereign neoclouds&lt;/a> — the cost axis piece for cloud or hybrid architectures: on-demand, spot and reserved prices from European providers in 2026.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/full-tco-on-premise-gpu-cluster-capex-gpu-hour-break-even/">TCO of the on-premise GPU cluster: amortisation, energy and infrastructure&lt;/a> — the cost axis piece for your own architectures: the real €/GPU-hour with CAPEX, energy and operations broken down.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/measurement-bias-reproducibility-llm-benchmarks/">Measurement bias and reproducibility in LLM benchmarks&lt;/a> — the methodological traps that make two benchmarks of the same engine give incompatible results: the basis for trusting this series&amp;rsquo; data.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/watt-to-carbon-pue-grid-intensity-gco2-per-token/">From the watt to carbon: PUE, grid intensity and the real cost of a token&lt;/a> — how to convert the GPU&amp;rsquo;s watts into gCO₂eq and into electricity euros, closing the loop between the energy axis and the cost axis.&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> — the optimisations that move all three axes at once: quantisation, batching and engine as levers that reduce J/token, €/token and improve goodput simultaneously.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/reproducible-harness-cost-performance-energy-experiment/">The reproducible harness for measuring cost, performance and energy&lt;/a> — the test bench that makes this article&amp;rsquo;s methodology concrete: how to produce the data for the three axes with a single reproducible experiment.&lt;/li>
&lt;/ul>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>Scaleway · H100 GPU instance (€/h price, EU sovereignty) — &lt;a href="https://www.scaleway.com/en/h100/">https://www.scaleway.com/en/h100/&lt;/a>&lt;/li>
&lt;li>DeployBase · OVHcloud GPU Pricing (European sovereignty) — &lt;a href="https://deploybase.ai/articles/ovhcloud-gpu-pricing">https://deploybase.ai/articles/ovhcloud-gpu-pricing&lt;/a>&lt;/li>
&lt;li>TradingEconomics · electricity price France / Germany / Spain — &lt;a href="https://tradingeconomics.com/france/electricity-price">https://tradingeconomics.com/france/electricity-price&lt;/a>&lt;/li>
&lt;li>EEA · emission intensity of electricity in Europe — &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 (carbon ~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;li>Spheron · AI Inference Power &amp;amp; Cost Economics (2026) — &lt;a href="https://www.spheron.network/blog/ai-inference-cost-economics-2026/">https://www.spheron.network/blog/ai-inference-cost-economics-2026/&lt;/a>&lt;/li>
&lt;li>NVIDIA · H100 (TDP/specs) — &lt;a href="https://www.nvidia.com/en-us/data-center/h100/">https://www.nvidia.com/en-us/data-center/h100/&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>