BitBootcampBitBootcamp ← all explainers 🔄 Review ⚙ Settings

Drill 105 — The Idle GPU Fleet

Theme: Cost & FinOps · Format: 20-min drill · Difficulty: core

The story

A bank's model-platform team runs a training cluster for its fraud and credit-risk models: sixty-four GPUs (Graphics Processing Units) across eight nodes, bought on a one-year reservation because reserved capacity is cheaper than on-demand and the models are business-critical. The team sized the fleet for the worst case they could imagine — the quarterly model refresh, when every risk model retrains at once ahead of the regulatory stress test, and the cluster briefly runs near ninety percent. Provisioning for the peak was the responsible call. Reserving it was the frugal call.

Then the peak passes. For the ten or eleven weeks between refreshes, the cluster does almost nothing — a notebook here, an ad-hoc experiment there, one nightly job that finishes by 2 a.m. The nodes stay up, because tearing a reserved cluster down and standing it back up is friction nobody has time for, and because "we'll need it for the next refresh anyway." The GPUs are online, healthy, patched, and — measured over any given week — about eight percent busy. Ninety-two percent of the silicon the bank is paying full price for is spinning idle.

Nothing is broken. Every dashboard is green: nodes healthy, jobs succeeding, latency fine. There is no utilization number on any dashboard the team looks at, and no line in the reservation contract that cares whether a GPU did work or waited. The cost lands on the platform account as one flat monthly reservation charge — the same number whether the fleet ran hot or ran empty — so it never moves, and a number that never moves is a number nobody watches. When the finance partner finally asks "what are we getting for the GPU line," it takes the team a day to even produce a utilization figure, because no one owns it.

⏸ Stop here and ask the room: the cluster is healthy, the reservation was the cheap option, and provisioning for the peak was correct. So why is this a six-figure mistake every single month?

Run it — facilitator script

Timing for a 20-minute session: 2 min story · 10 min staged questions · 3 min reveal · 5 min transfer.

Read the story aloud, pause on the stop line, and make the room name the number they'd need before they can even argue about it.

What is the SLI (Service Level Indicator) for this fleet, and why does its absence matter more than any single decision here?

Who should own the utilization number, and what does "owning" it concretely require?

The quarterly peak is real. How do you serve it without paying for it fifty-two weeks a year?

The reveal

The reservation runs about a hundred and sixty-five thousand dollars a month. At 8% utilization, roughly a hundred and fifty thousand of that — every month, quietly, for as long as the reservation runs — buys idle silicon. Reworked: reserve a small steady-state floor, autoscale interactive nodes to zero when the queues drain, and move the quarterly refresh onto spot capacity, and the fleet delivers the same peak throughput for a fraction of the bill. The stress test still runs at ninety percent when it needs to. The difference is that the bank stops paying peak prices for the eleven weeks a quarter the peak isn't happening. Nothing about the models changed — only the shape of the spend.

Why this happens — the mechanics

Reserved capacity converts a variable cost into a fixed one, and a fixed cost is a flat line on the bill. That flatness is the trap: latency has a distribution, error rate has a distribution, and both wander enough that a human notices when they drift — but a reservation charge is a constant, and constants don't trigger the pattern-matching that operations teams run on their graphs. The signal that would move — utilization — is never computed, because the provider bills you for the reservation, not for the work, and the reservation is what shows up in cost tooling. You have to go out of your way to divide busy-hours by paid-hours; nobody's default dashboard does it for you.

Underneath that is the same ownership seam that runs through every drill in this theme: a cost that no one owns is a cost no one optimizes. Provisioning for the peak was a capacity decision made once, correctly, at reservation time — and then never revisited, because revisiting it is nobody's job and the flat bill gives no one a reason to. FinOps (Financial Operations — the practice of making engineering teams accountable for the unit economics of what they build) calls this the difference between a purchase and a standing commitment: the purchase felt frugal, but with no utilization SLI and no named owner, the frugal purchase became a standing subsidy for idle hardware.

And the deepest asymmetry is the theme's signature one: an idle GPU is doing everything right. Perfect uptime, zero errors, healthy temperature, jobs succeeding. Operational monitoring is built to catch things going wrong, and waste is not a failure — it is the system working flawlessly at the wrong scale. Utilization is the only signal an over-provisioned fleet emits, and if that signal isn't measured, alarmed, and owned, the fleet can waste a hundred and fifty thousand dollars a month with a completely green dashboard.

Diagrams

Problem — how the failure unfolds (slow burn):

timeline
    title A fleet that mostly waits
    section Provision
        Reserve 64 GPUs : Sized for the quarterly peak : One-year commitment, cheaper than on-demand
    section Steady state
        Peak passes : Cluster stays warm, never scales down (silent)
    section Weeks of drift
        Runs at 8 percent utilization : Idle silicon at full price (silent)
        No utilization SLI, no owner : Flat bill never moves (silent)
    section Quarter close
        Finance asks what we get : Six figures a month buys idle GPUs

Solution — where the guardrails go:

flowchart TD
    A["Reserved GPU fleet<br/>runs at 8% utilized"] --> B["Utilization SLI:<br/>busy GPU-hours over<br/>hours paid for"]
    B -.-> AL["Alarm: util under 40%<br/>for 7 days pages<br/>the named owner"]
    A --> C["Autoscaler drains<br/>idle nodes to zero"]
    A --> D["Quarterly refresh runs<br/>on spot capacity"]
    A --> E["Showback bills $/GPU-hour<br/>to the model team"]
    E -.-> AL
    AL --> H["Owner right-sizes<br/>the reserved floor"]

What good looks like

The lesson

A flat reservation charge is the least informative signal on your bill — identical whether the hardware worked or waited — so buying reserved capacity without a utilization SLI and a named owner turns a frugal purchase into a standing subsidy for idle silicon. Measure utilization, alarm it, attribute it to a team, and meet peak-shaped demand with elastic and spot capacity instead of a permanent reservation sized for the peak.

Named concepts: utilization SLI, scale-to-zero autoscaling, spot/preemptible capacity, showback and chargeback.

Real-world echoes

Transfer

Pull the utilization number for your most expensive reserved fleet — GPU, or any always-on capacity — right now. If it takes more than five minutes to produce, that's the finding: you're paying a flat rate for a fleet whose utilization nobody measures or owns. What is it, and who is accountable to a target?

Make it a ticket: Stand up a fleet-utilization SLI (7-day rolling busy-hours ÷ paid-hours) on your priciest reserved capacity, put it on the platform dashboard next to latency, alarm it at under 40% for seven days to a named owner, and re-derive the reserved floor from the actual utilization histogram before the next renewal.

Related