惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 【当耐特】
云风的 BLOG
云风的 BLOG
罗磊的独立博客
C
Check Point Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Blog — PlanetScale
Blog — PlanetScale
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
Google DeepMind News
Google DeepMind News
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Recent Announcements
Recent Announcements
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园_首页
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理
爱范儿
爱范儿
I
InfoQ
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
B
Blog RSS Feed

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Your AI Cluster Is Idle 95% of the Time
NTCTech · 2026-04-28 · via DEV Community

NTCTech

Your GPU utilization dashboard reads 40%. The cluster is healthy. The GPUs are loaded.

Except they're not working.

That 40% is a peak average across a monitoring window. It doesn't show the forty minutes after the spike when the inference queue drained and the cluster sat fully provisioned against a trickle of requests two nodes could have handled.

The cluster isn't underutilized. It's mispriced against actual demand.

That's a different problem with a different root cause — and the mistake that created it didn't happen in your scheduler. It happened at design time.


Why GPU Utilization Numbers Lie

Most monitoring platforms conflate two things with almost nothing in common: memory residency and compute activity.

A GPU can be fully loaded — model weights resident, tensors staged, inference engine warm — and simultaneously producing zero output. The Kubernetes GPU resource model treats GPU allocation as binary: assigned or not. There's no native distinction between memory-resident and compute-active states.

The hardware is occupied. No work is being done.

Loaded ≠ Active.

A model resident in VRAM is not a GPU doing work. It's a GPU holding a reservation. Most teams treat model-loaded status as GPU-in-use status and provision accordingly. That single assumption is responsible for more mispriced AI capacity than any scheduling inefficiency or orchestration gap.


The Three GPU Utilization Idle Modes

The Three GPU utilization Idle Modes — Batch Idle, Inference Idle, Provisioning Idle architecture diagram
Not all idle compute is the same problem. Before you can fix the architecture, you need to name which mode you're in.

Batch Idle — The gap between training runs. The cluster stays hot between jobs because cold startup costs are high. That gap, multiplied across a training schedule, is pure idle compute priced at full cluster cost.

Inference Idle — The model is loaded. The inference engine is warm. Requests are arriving — just not at the rate the cluster was sized for. GPU utilization metrics show the GPUs as occupied. The memory utilization is real. The compute utilization is not.

Provisioning Idle — The earliest failure and the most expensive one over time. The cluster was sized for a workload that hasn't arrived yet. Peak inference demand for Q3. The large model run that's six weeks out. The hardware is live, the cost is running, and the demand it was priced against exists only in a planning document.

All three modes share one root cause: the demand curve was never modeled correctly.


This Was a Forecasting Failure

AI GPU provisioning forecasting failure — demand curve never modeled architecture diagram
The framing that gets used for this problem is utilization. The fix must be better scheduling, better bin-packing, better autoscaling. That framing is wrong.

Low utilization is an output. The input was a provisioning decision made without adequate demand modeling.

Here's what the forecasting actually missed:

  • The demand curve was never modeled. Teams provisioned for theoretical peak without modeling actual request distribution across a typical operating window. Peak is real. It is also rare.
  • Concurrency was assumed, not measured. Most provisioning decisions are made against a single-request mental model — how fast can the cluster serve one request — rather than against a concurrent request distribution.
  • Residency was mistaken for throughput. A GPU holding a 70B parameter model in VRAM is not a GPU running at capacity. It's a GPU with a very expensive reservation.
  • Runtime limits were never set. Without execution budgets, the cluster expands to fill whatever headroom exists — and headroom was built in generously because the demand model was peak-anchored. Most teams never modeled the demand curve. They sized for theoretical peak, provisioned for future concurrency, and treated loaded memory as active work.

Did you model request concurrency before you provisioned — or did you just size for the busiest hour you could imagine?


What the Math Actually Looks Like

GPU cluster mispriced capacity six-figure forecasting error math example
An 8× A100 cluster runs approximately $38,000/month in total cost of ownership. At 5% sustained utilization:

Monthly cluster cost:     $38,000
Sustained utilization:        5%
Productive compute/month:  $1,900
Idle compute/month:       $36,100

Annual forecasting error: $433,200

Enter fullscreen mode Exit fullscreen mode

This is not a slightly inefficient cluster. It's a six-figure architecture constraint that compounds every month the provisioning assumption goes uncorrected.


This Is an Architecture Problem, Not a Scheduling Problem

The standard response to low GPU utilization is a scheduling intervention: deploy Volcano, tune KEDA, implement DCGM-based autoscaling.

These are real tools. They solve real problems. They do not fix this one.

Schedulers optimize execution of work that has been correctly provisioned for. What they cannot do is retroactively correct a demand model that was wrong at design time. If the cluster was provisioned for 10× the actual sustained request rate, a better scheduler produces a more efficiently idle cluster.

Schedulers can distribute work. They cannot fix demand you modeled incorrectly.

That fix happens before the cluster exists. It happens at design time, against a demand curve someone actually drew.


Architect's Verdict

The gpu utilization problem is not a utilization problem. It's a forecasting problem that manifests as gpu utilization data, gets diagnosed as a scheduling problem, and gets treated with tooling that addresses the symptom while the root cause compounds every billing cycle.

The central mistake is a category error: treating memory residency as compute activity. Every GPU idle mode — batch, inference, provisioning — traces back to a demand curve that was never drawn or was drawn incorrectly against theoretical maximums that rarely materialize in production.

The teams that solve this aren't running more sophisticated schedulers. They're provisioning against actual request distributions, modeling concurrency from measurement rather than assumption, and treating loaded memory as exactly what it is: an expensive placeholder.

Fix the demand model first. Everything else is optimization on top of a correctly sized foundation.


Originally published at rack2cloud.com