How to Reduce Kubernetes GPU Costs (2026 Guide)

Most Kubernetes GPU fleets waste 60–70% of their spend on cards that are allocated, powered, billed — and idle. This is the practical playbook for getting that back, in the order that pays off fastest.

💡 Want your fleet's number first? The free GPU Idle-Cost Calculator shows how much you're wasting per year and what you'd reclaim by raising utilization. Two minutes, no signup.

Why utilization is the only number that matters

A GPU costs the same whether it runs at 100% or sits at 0% — you pay for the allocation, not the work. So utilization is a direct multiplier on real cost. A fleet averaging 30% utilization pays roughly 3.3× per useful GPU-hour versus one kept busy. On a rack of H100s that's five figures a month evaporating quietly. Every optimization below is really just a way to push that utilization number up.

1. Measure per-GPU utilization (you can't cut what you can't see)

Before anything else, get per-card, per-pod visibility: DCGM exporter → Prometheus → Grafana. The metric that matters isn't average GPU busy-ness — it's allocated-but-idle: GPUs holding a reservation while doing nothing. That's where the leak is, and standard cluster monitoring won't show it. Also watch XID/ECC errors and thermal throttling, which quietly waste compute you're paying for.

2. Share GPUs with time-slicing (the biggest quick win)

Dev notebooks, CI, and light inference rarely need a whole GPU — but the scheduler hands them one anyway. Time-slicing (via the NVIDIA GPU Operator) advertises one physical GPU as N schedulable units, so many pods share a card. For interruption-tolerant, fractional workloads this is often a 2–4× density win overnight. The tradeoff: no hard memory isolation between pods — use it for dev/bursty/light inference, not for isolated production tenants.

3. Partition with MIG (isolation for production)

When you need real isolation, MIG (Multi-Instance GPU) hard-partitions an A100/H100 into up to seven independent slices, each with its own memory and compute. A single 80GB card becomes seven GPUs, so small models stop wasting whole cards. Profile names are GPU-specific — list them with nvidia-smi mig -lgip.

4. Cap hoarding with quotas

Nothing wastes GPUs like a team that grabs eight and uses two. A per-namespace ResourceQuota on nvidia.com/gpu plus a LimitRange default stops silent hoarding and forces teams to right-size.

5. Run interruptible work on spot nodes

Batch inference, checkpointed training, and CI are interruption-tolerant — perfect for spot/preemptible GPU nodes at 60–90% off on-demand. The pattern that makes it safe: a spot-only node pool, a low PriorityClass for interruptible work, consolidation enabled, and in-app checkpointing so a reclaim costs progress, not a restart from zero.

6. Reclaim idle allocations automatically

The last 30% is the allocated-but-idle GPUs nobody notices — the stuck notebook, the finished job that never released. Don't rely on someone spotting them: run a job that reads your DCGM utilization metric, flags GPUs under ~5% for hours, and (opt-in) reclaims them. Track reclaimed idle-GPU-hours × your $/GPU-hr as hard savings — that number is how the whole effort pays for itself.

How much can you actually save?

LeverTypical effect
Time-slicing dev/CI/light-inference2–4× density on those workloads
MIG on small production modelsup to 7× on under-utilized cards
Spot for interruptible work60–90% off that compute
Idle reclamationrecover the leaked 30–70%

Getting a fleet from ~30% to ~70% average utilization typically cuts the GPU bill 30–60% for the same useful work. Run your fleet's numbers here.

Copy-paste Kubernetes packs that implement everything above — schema-validated, ~15 minutes to deploy:
GPU Monitoring Pack (see the idle 70%)  ·  GPU Cost-Optimization Pack (time-slicing · MIG · spot · idle-reaper)
Get the next field note. Practical, occasional notes on GPU/K8s cost + AI-agent infrastructure — the traps and the numbers. No spam.