<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Wh-Por-Token on lo0 — Tech Blog</title><link>https://blog.lo0.es/en/tags/wh-por-token/</link><description>Recent content in Wh-Por-Token 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/wh-por-token/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>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></channel></rss>