Nameplate Analytics LLC Book a snapshot
Measurement record · 2026-09-04

The metric everyone plans capacity with, tested against the die.

We put a Tesla T4 under two controlled workloads and sampled six DCGM fields at one hertz. One workload was designed to look busy and do nothing. The other was designed to genuinely saturate the chip. The standard utilization field could not tell them apart.

01 · The record

Two workloads, 242 samples, one axis.

Capture Tesla T4 · g4dn.xlarge driver 595.91.07 1 Hz 242 samples
Drawn to one scale with no truncated axis. In the top group the amber bar is what your dashboard shows and the two bars below it are what the silicon did. The SMACT bar is a hairline because 0.2 percent of this axis is a hairline. The bottom group is the control: when the chip really is working, all three readings agree. That agreement is how you know the instrument was sound and the top group is not an artifact of the setup.
Workload GPUTLreported utilization SMACTmultiprocessors active TENSOtensor pipe active
Tiny repeated opA 64-element add launched in a tight loop. Something is resident on the device in almost every sample window. 20.0% 0.2% 0.0%
fp16 matmul4096 by 4096 half-precision GEMM, the workload a T4's tensor cores exist for. 100.0% 98.1% 87.8%
dcgmi dmon -e 203,1001,1002,1003,1004,1005 -d 1000

Field 203 is DCGM_FI_DEV_GPU_UTIL. The rest are the profiling fields: GRACT, SMACT, SMOCC, TENSO, DRAMA. The same run also recorded graphics engine activity, warp occupancy and memory bandwidth. All six fields for all 242 samples, including the idle baseline and the gap between phases, are published unedited. Nothing on this page is averaged over a window you cannot inspect. The Terraform, the sampling scripts and both workloads are on GitHub, so you can rebuild the instance and take the reading yourself for about a dollar.

02 · Why it happens

The field answers a different question than the one it gets asked.

DCGM_FI_DEV_GPU_UTIL reports one thing: was any kernel resident on the device during the sample window. It says nothing about how much of the device that kernel used.

A Tesla T4 has forty streaming multiprocessors. A 64-element add occupies one of them. Launched in a tight loop it keeps something resident nearly every sample window, so the field reports a healthy-looking number while thirty-nine fortieths of the chip idles and the tensor cores never fire at all.

This is not a misconfiguration and it is not unique to any vendor's dashboard. The field is doing exactly what it documents. The problem is that it sits on the GPU utilization panel of nearly every default Grafana board, so it becomes the number in the capacity plan, the number in the quarterly review, and the number cited the last time somebody approved a fleet expansion.

What we deploy instead

The profiling fields, exported per workload and joined to pod identity:

  • SMACT — the fraction of streaming multiprocessors with work resident. The honest denominator.
  • SMOCC — warp occupancy within those multiprocessors. Distinguishes busy from saturated.
  • TENSO — tensor pipe activity. Zero here on a GPU you bought for tensor throughput is a finding on its own.
  • DRAMA — memory bandwidth utilization, which separates compute-bound from memory-bound before anyone right-sizes the wrong axis.

These are not exotic. They ship in the DCGM exporter and cost nothing to turn on. The reason most clusters do not have them is that nobody was asked the question that requires them.

03 · The join

Telemetry alone is a graph. Joined to the bill, it is a number your CFO can act on.

Hardware telemetry tells you a GPU did nothing. It does not tell you what that cost. For that, the billing side has to be right first, and the billing side has two traps that catch almost everyone.

Amortization

Commitment-covered resources report $0 unblended cost. A reserved or Savings-Plan-covered GPU node shows as free in a naive cost ranking, so the single most expensive machine in your fleet vanishes from the top of the list. Every figure we produce is amortized: the commitment is spread across the resources that actually consumed it.

Attribution

A CUR 2.0 export at hourly granularity with resource IDs, normalized across the legacy and 2.0 schemas, then joined to the cluster through provider IDs so a line item becomes a node, a node becomes a namespace, and a namespace becomes a team. Whatever will not join is reported as unattributed rather than quietly distributed, because unattributed spend is itself one of the findings.

The tooling

The analysis runs through gpuaudit, a purpose-built CLI rather than a spreadsheet with your name typed into the header. It reads Parquet and CSV, legacy CUR and CUR 2.0, a single file or a whole partitioned export prefix, with the format and dialect detected rather than configured. Map columns are read as maps, which is the detail most often got wrong and the one that fails silently: get it wrong and every tag reads as null, which quietly converts proven findings into likely ones.

Eight detectors run against billing data alone, spanning all three confidence ratings, and two more run when cluster data is supplied. Each returns a finding with its rating attached, or returns nothing rather than inventing a small number. The output is a client-ready document and a machine-readable findings file, so your engineers can check the arithmetic themselves.

Cluster allocation

The allocation module reads GPU capacity and pod requests through kubectl or the Python client, maps each node to its EC2 instance through spec.providerID, and joins that to per-resource amortized cost. It ships the exact read-only RBAC you would grant, in a minimal and a standard version, plus a standalone shell script your team can run themselves without installing anything.

This is what makes the free call's most persuasive number real: how many provisioned GPUs have no pod requesting one. If a node advertises eight and nothing asks for any, utilization is zero by definition and no telemetry argument can rescue it.

04 · Limits

What this measurement does not prove.

One GPU model, two workloads chosen to bracket the range, one machine. A T4 is not an H100 and the ratio on your hardware will be different. These are synthetic phases from a controlled run, not a production trace.

What the run establishes is narrow and worth stating narrowly: the metric almost everyone plans capacity with can be wrong by two orders of magnitude, and it fails silently. It does not establish that yours is wrong, by how much, or on which workloads. Nobody can tell you that from the outside, and anyone who offers to is selling you a number they made up.

The only way to get your number is to instrument your cluster and read it. That is what the first call is for, and it is free.