A GPU utilisation dashboard that stays green while p99 latency drifts past your SLA is not monitoring the thing that matters. It is monitoring the machine, not the model, and the two answer different questions. When teams treat inference monitoring as an infrastructure afterthought — a utilisation graph bolted on after deployment — they lose the ability to say why a request got slow. They only know that it did. That gap is where optimisation work quietly erodes and where the next reflexive GPU purchase order gets signed. The core claim of this article is narrow and deliberate: model-aware monitoring for GPU inference must track latency percentiles, batch efficiency, host-device transfer, and prediction drift together, because a regression in any one of them looks identical on a utilisation chart. A dashboard that shows 85% GPU utilisation tells you the hardware is busy. It does not tell you whether it is busy doing useful work at the batch size and precision you tuned for, or busy stalling on PCIe transfers while requests pile up in a queue. Why a utilisation dashboard is not model monitoring Start with the misconception, because it is common and it is comfortable. Infrastructure monitoring — the kind you get from nvidia-smi, DCGM exporters, or a generic cloud console — reports device-level counters: GPU utilisation percentage, memory occupancy, power draw, temperature. These are real signals, and you want them. But they describe the executor, not the inference. Here is the failure mode we see repeatedly. A model is optimised, latency drops, cost-per-inference improves, everyone moves on. Three weeks later, traffic composition shifts: requests get longer, the effective batch size the server assembles falls, and per-request latency creeps up. The GPU utilisation chart barely moves — the device is still busy, just doing less useful work per unit of time. Nobody notices until a customer complains or the quarterly capacity review flags rising latency. By then the instinct is to add GPUs, which papers over a batching regression at recurring cost. Model monitoring closes that gap by instrumenting the inference pipeline the same way you profiled it in the first place. If you measured latency percentiles and batch efficiency to tune the path, those same measurements have to become live guardrails afterward. Otherwise you are flying on a single averaged number, and averages hide exactly the tail behaviour your SLA is written against. This is the same distinction we draw in ML model metrics that explain GPU bottlenecks versus metrics that mislead: the counter that is easy to collect is rarely the one that explains the regression. Which metrics actually matter for monitoring GPU inference? Four signal families carry most of the diagnostic weight for a GPU inference service. Each answers a different question, and the reason to collect all four is that a problem in one is indistinguishable from a problem in another if you only watch a subset. Signal family What it measures What a regression here means Why utilisation misses it Latency percentiles (p50 / p95 / p99) End-to-end and per-stage request time at the tail SLA is at risk for the slowest requests, not the median An average latency can look fine while p99 doubles Batch efficiency Achieved batch size vs. the size you tuned for; queue wait The server is under-filling batches; throughput per GPU-second is falling Device stays “busy” processing small batches Host-device transfer PCIe/NVLink time, copy-vs-compute overlap Bottleneck moved to data movement, not compute Compute utilisation drops but memory copy time is invisible on the compute counter Prediction drift Distribution shift in inputs and outputs vs. baseline The model is seeing traffic it was not tuned or trained for Purely a data property — no hardware counter reflects it The claim-class here matters. The value of tracking these four together is an observed pattern across inference-optimisation engagements, not a benchmarked constant — the exact mix that dominates depends on model architecture and serving stack. A transformer decode path with a large KV cache tends to be memory-bound, so transfer and batch efficiency dominate; a small convolutional detector may be compute-bound and latency-percentile-driven. YOLO-style detectors, for instance, behave very differently under batching than autoregressive models, a point we develop in how YOLO inference on GPU works and what batching really changes. How is model monitoring different from generic GPU infrastructure monitoring? The cleanest way to state the difference is by the question each one can answer. Infrastructure monitoring answers “is the hardware healthy and busy?” Model monitoring answers “is the inference service meeting its latency and correctness targets, and if not, which stage broke?” Concretely, infrastructure tooling — Prometheus scraping DCGM, cloud provider metrics, nvidia-smi — lives below the serving framework and cannot see request semantics. It does not know what a request is, how many were batched together, or whether the output distribution shifted. Model monitoring lives inside or alongside the serving layer: NVIDIA Triton Inference Server exposes per-model latency and batch-size histograms; a drift detector like Evidently or a tracking layer such as MLflow or Weights & Biases records prediction distributions over time. The two layers are complementary. You need the device counters to rule out a genuine hardware or thermal fault; you need the model-aware layer to attribute everything else. That layering is also why monitoring is an MLOps concern, not just a dashboards concern — the pipeline that emits these signals has to be part of the deployment itself. We treat that as an architecture question in MLOps architecture for GPU clusters and how it works in practice. How do monitoring signals attribute a latency regression? Attribution is the whole point. A single latency number going up is an alarm; it is not a diagnosis. The four signal families, read together, form a decision path that moves the finger of blame to a specific stage. Use this rubric when p95 or p99 latency crosses its baseline: Check batch efficiency first. If achieved batch size has fallen and queue wait has risen, the server is under-filling batches — traffic shape changed, or a batching-window parameter is now mistuned. The fix is serving configuration, not hardware. If batch size is stable, check host-device transfer. Rising PCIe/NVLink copy time with falling compute utilisation means the bottleneck moved to data movement. Look at input preprocessing, tensor placement, and copy-compute overlap. If transfer is stable, check compute-stage timing. If the kernel or forward-pass time itself grew, something changed in the compute path — a model version, a precision change, a kernel that stopped fusing. In parallel, check prediction drift. If input or output distributions have shifted, the model may be doing more work (longer sequences, harder inputs) or producing degraded outputs even when timing looks fine. Drift can raise latency indirectly and can also mean the model is wrong while fast. The discipline is that you never skip to step 3 — “the model got slower” — without ruling out batching and transport, because those are the two most common and most reversible causes. This is the same layered reasoning that turns a one-time profile into a durable practice. How does monitoring protect the cost-per-inference and SLA gains from optimisation? Inference optimisation is not a one-time win. The latency and cost-per-inference gains you achieve at deployment degrade as traffic patterns, batch sizes, and model versions shift. Monitoring is what keeps those gains from eroding silently. The mechanism is a live baseline. When you finish an optimisation pass, you have a before/after picture: p95/p99 latency, cost-per-inference, and utilisation at a target rate. Monitoring turns that picture into a continuous guardrail — the same numbers, checked against the baseline in real time. A regression then surfaces in hours instead of at the next capacity review. The measurable outcome is avoided over-provisioning: you catch a drift or batching regression before it triggers reactive GPU procurement. That before/after baseline is exactly the deliverable a [GPU Performance Audit](GPU engineering) produces. Model monitoring tooling operationalises that audit: it takes the one-time latency and utilisation measurements and turns them into the ongoing guardrails that make the audit’s gains defensible over time. Without it, the audit is a snapshot; with it, the snapshot becomes a control loop. For teams working the broader cost question, our GPU engineering practice treats monitoring and audit as two halves of the same discipline. When should a monitoring alert push you to re-optimise versus scale out? This is the decision that monitoring exists to inform, and getting it wrong is expensive in both directions. Scaling out when the real problem is a batching regression buys temporary relief at permanent cost. Re-optimising when you are genuinely at capacity delays a purchase you actually need. The rule of thumb from what we observe in practice: if the regression is attributable to batch efficiency, transfer, or a model/precision change, re-optimise the inference path first. Adding GPUs to a service that is under-filling its batches just adds more under-filled batches. Scale out only when the path is running at its tuned efficiency and demand genuinely exceeds what the current fleet can serve within SLA. Monitoring is what lets you tell those two situations apart — utilisation alone cannot, because a well-tuned saturated GPU and a poorly-batched idle one can report similar-looking numbers. FAQ What does working with ml model monitoring tools involve in practice? Model monitoring instruments the inference pipeline the same way you profile it — capturing latency percentiles, batch efficiency, host-device transfer time, and prediction drift as live signals, usually from inside the serving layer (Triton, MLflow, a drift detector) rather than from device counters alone. In practice it means every deployed model carries a continuous read of whether it is meeting its latency and correctness targets, not just whether the GPU is busy. Which metrics actually matter for monitoring GPU inference — latency percentiles, utilisation, batch efficiency, or prediction drift? All four, and the reason is that a regression in one is indistinguishable from the others on a utilisation chart. Latency percentiles (especially p95/p99) tell you whether the SLA tail is holding; batch efficiency tells you whether throughput per GPU-second is falling; host-device transfer tells you whether the bottleneck moved to data movement; prediction drift tells you whether the model is seeing traffic it was not tuned for. Utilisation is a supporting signal, not the headline. How is model monitoring different from generic GPU infrastructure monitoring? Infrastructure monitoring answers “is the hardware healthy and busy?” and lives below the serving framework, blind to request semantics. Model monitoring answers “is the service meeting its latency and correctness targets, and if not, which stage broke?” and lives inside or alongside the serving layer. The two are complementary: device counters rule out hardware faults, and the model-aware layer attributes everything else. How do monitoring signals help attribute a latency regression to compute, memory, batching, or transport? By reading the four signal families as a decision path. Check batch efficiency first (under-filled batches point to serving config), then host-device transfer (rising copy time with falling compute means a data-movement bottleneck), then compute-stage timing (a grown forward pass points to a model or precision change), and check drift in parallel. The discipline is never to conclude “the model got slower” without first ruling out the more common and more reversible batching and transport causes. How does monitoring protect the cost-per-inference and SLA gains from an inference optimisation effort? It turns the optimisation’s before/after baseline into a live guardrail — the same p95/p99 latency, cost-per-inference, and utilisation targets checked continuously against the baseline. A regression then surfaces in hours rather than at the next quarterly capacity review, and the measurable outcome is avoided over-provisioning: catching a drift or batching regression before it triggers reactive GPU procurement. What baseline should monitoring compare against, and how does that relate to a GPU performance audit? The baseline is the before/after picture a GPU Performance Audit produces — measured p95/p99 latency, cost-per-inference, and utilisation at a target rate after an optimisation pass. Monitoring operationalises that audit by turning its one-time measurements into continuous guardrails, converting a snapshot into a control loop. When does a monitoring alert indicate you should re-optimise the inference path versus scale out to more GPUs? Re-optimise first when the regression is attributable to batch efficiency, host-device transfer, or a model/precision change — adding GPUs to an under-batched service just adds more under-filled batches. Scale out only when the path is already running at its tuned efficiency and demand genuinely exceeds what the current fleet can serve within SLA. Monitoring is what lets you distinguish a saturated well-tuned GPU from a poorly-batched idle one, which utilisation alone cannot. The harder question is not which tool to install but where the bottleneck will move next — because serving latency is also the gap that reopens between prototype and production, which is why keeping it closed is a monitoring problem long after it stopped being a tuning one.