WattOps Start free
← Blog

nvidia-smi power draw vs real GPU energy

Guide · Last updated 20 October 2026 · 2 min read

On this pageWhat nvidia-smi showsBlind spot 1: power readings miss what happens between themBlind spot 2: utilisation is not efficiencyBlind spot 3: no idle baseline, no comparisonDoing it with joulesNext

nvidia-smi is the first tool most people use to see what a GPU is doing. It is good for a glance. For measuring how much energy a job used, it has three blind spots.

What nvidia-smi shows

nvidia-smi --query-gpu=power.draw,utilization.gpu,clocks.sm --format=csv -l 1

This prints the power, utilisation and clock once a second. To get energy from it, you would add up power × time between readings. That is where the trouble starts.

Blind spot 1: power readings miss what happens between them

Energy is power over time. A reading every second (or every 100 ms) tells you the power at that moment, or averaged over a short window, not what happened in between. Short kernels, bursts and the gaps between them are blurred or missed. Researchers have also shown that on some data-centre GPUs the power reading only samples part of each interval.

Better: NVIDIA GPUs from Volta onwards keep a running energy counter in the driver (NVML's total energy consumption). Read it at the start and the end of a job, and the difference is the energy, with nothing missed in between.

Blind spot 2: utilisation is not efficiency

utilization.gpu is the share of time at least one kernel was running. It says nothing about how fast the kernel ran. A GPU at its power cap or too hot slows its clock and can still show 90%+ busy. The job takes longer and uses more energy per result, while utilisation looks healthy.

Better: look at the clock as a share of the maximum and the throttle reasons (power cap, thermal) next to utilisation, and report energy per completed result.

Blind spot 3: no idle baseline, no comparison

A single reading tells you nothing about how much of the power was your job and how much was the GPU sitting there. And comparing two runs done one after the other mixes in temperature and clock drift.

Better: measure idle first and subtract it; alternate the two versions (A B A B) and compare medians.

Doing it with joules

joules reads the energy counter, records clocks, temperature and throttle reasons, and does the idle and the alternation for you:

pip install landauer-gap
joules run --subtract-idle 5 -- python infer.py
joules compare "python infer.py --fp16" "python infer.py --fp32"

For a fleet, joules agent serves the counters to Prometheus, and WattOps shows idle and throttled GPUs live.

Next