← all posts
// economics · hardware-roi

AI hardware ROI for a shared team GPU server: five-year total cost of ownership

A GPU server that answers interactive requests can never run at one hundred percent utilization: leave zero headroom and every request behind the first one waits. That fact should shape the cost model before anyone opens a spreadsheet.

Scope: a multi-user Linux host, one or more GPUs, memory, redundant storage, networking, monitoring, and support ownership, running coding assistants, RAG, extraction, evaluation, and overnight jobs for several engineers. Weigh it against commercial APIs and rented inference at equal traffic; a wrong-shaped subscription shows here. Price one accepted task at your required p95 latency, not tokens or GPU-hours.

the invoice is the smallest part of the number

TCO is capex plus energy, support, maintenance, downtime, and financing, minus resale value. Run low, base, and high cash-flow cases instead of one five-year average: averages hide the failure mode that matters. Split fixed from variable: accelerator, host, installation, and reserved capacity are fixed once signed, electricity and data transfer scale with work. Price the full bill of materials, not just the card, minus whatever you'd have bought anyway. Weight for quality too: a cheaper model needing retries owes that correction time to the number, and a narrow local specialist shouldn't be priced against a maxed-out frontier API, the logic behind routing local before escalating.

idle hours still show up on the power bill

The bigger risk: queues nobody sized for, idle capacity, operational labor, outages, and demand outgrowing the box. Build low, base, and high demand curves, include the daily peak: a machine busy all afternoon differs from one idling midnight to eight, and batch work should fill quiet hours only if needed. Meter idle states. Sleep isn't resident-idle. Track queueing and abandoned requests. For an edge fleet, multiply update, replacement, backup, and travel time by node count; labor beats electricity there. Log the same fields for local, rented, and API candidates:

  • accepted tasks, failures needing human fixing
  • token mix, queue, first-token, completion time, p95
  • hours active, idle-but-resident, asleep, unavailable
  • energy draw plus a cooling share

The recurring mistake: assuming five years of perfect uptime and an optimistic resale figure. Keep assumptions in a small table, sourced and dated. Decimal precision on a guess is still a guess.

where the break-even line actually sits

Payback month: when cumulative discounted benefit passes cumulative cost. ROI: net discounted benefit over discounted cost. Both need conservative useful-life and residual-value assumptions: hardware can work fine yet be economically obsolete once a model outgrows it. Productivity savings need a realization factor: ten minutes saved isn't ten minutes of revenue. Count it only when it avoids a hire, cuts spend, or shortens a binding queue, and run the model once at zero. Price renting too, if you count storage, transfer, minimum billing, and forgotten instances. State the break-even boundary in operational terms: tasks per month, GPU-hours, max API cost per task, minimum useful life. That kind of boundary survives revisiting; a narrative recommendation doesn't. Set a retest date: volume shifts, a model changes the quality gate, prices move, or a part ages out of support.

ROI isn't a property stamped onto a GPU; it's a relationship between one workload, one alternative, and dated assumptions that go stale. Run a short rental benchmark against a real week of your own traffic before you commit, and see if the boundary survives it.

#hardware-roi#cost#self-hosting