Your LLM Isn’t Slow — Your Infrastructure Is
Why compute, memory, and GPU scheduling decide AI performance more than the model you picked
Your LLM Isn’t Slow — Your Infrastructure Is

Why compute, memory, and GPU scheduling decide AI performance more than the model you picked
Every team I’ve watched deploy a self-hosted LLM goes through the same five stages of grief. First they blame the model. Then they blame the prompt. Then they swap GPUs. Then they swap GPUs again. Eventually, if they’re lucky, someone notices the real problem was never the model at all — it was everything sitting underneath it.
That’s not a hot take. It’s the pattern that keeps repeating across enterprise AI deployments, and it’s worth unpacking properly, because “just use a bigger GPU” is quietly becoming the “just add more RAM” of the LLM era — a fix that sometimes helps, usually doesn’t, and almost never addresses the actual bottleneck.
The model is rarely the problem
When an LLM feels sluggish or expensive to run, the instinct is to interrogate the model — wrong checkpoint, bad quantization, needs fine-tuning. Sometimes that’s the answer. Far more often, the model is behaving exactly as designed, and the infrastructure around it was never built for the traffic actually hitting it.
Here’s the part that trips up teams coming from traditional backend work: normal web infrastructure scales predictably. Add a cache, shard a database, spin up another instance — performance improves roughly in a straight line. LLM inference doesn’t play by those rules. GPU memory is finite and expensive, attention scales non-linearly with context length, and throughput is brutally sensitive to how requests get batched. Treating an inference cluster like a stateless web fleet is how “it worked in the demo” turns into “it’s on fire in production.”
Four layers, one bottleneck
Tokens-per-second gets treated like a property of the model. It isn’t. It’s the output of four layers working (or fighting) together.
Compute. A GPU running at 25% utilization still bills you for 100%. Idle compute time — not raw GPU horsepower — is the biggest source of wasted spend in most self-hosted deployments.
Memory. This is where deployments quietly die. Model weights need GPU memory, sure, but so does the KV-cache — the running memory of every token the model has already attended to. As context windows stretch past 100k tokens, that cache routinely outgrows the model weights themselves. Sizing it is math, not vibes, and getting it wrong means either paying for headroom nobody uses or watching requests fail under real load.
Networking. The moment a model needs more than one GPU, interconnect speed stops being a footnote. Tensor and pipeline parallelism need low-latency, high-bandwidth links between GPUs — which is exactly why NVLink and InfiniBand exist instead of everyone just using standard Ethernet. Run multi-GPU inference over commodity networking and the network becomes the bottleneck long before the compute does, and it shows up looking like a “model problem.”
Storage. The quiet one. A checkpoint that has to be pulled from cold storage every time a node autoscales can turn a “near-instant” scale-out into a multi-minute cold start. If your workload is bursty, your storage needs to be designed for fast loading, not cheap archiving.
GPU utilization is the metric that actually matters
Enterprises love counting GPUs the way they count CPUs — more units, more capacity. Inference workloads don’t cooperate with that logic. Batching strategy usually matters more than hardware count.
Continuous batching — dynamically grouping incoming requests into shared forward passes instead of processing them one-by-one — is one of the highest-leverage changes you can make to GPU utilization. Static batching, by comparison, either waits around for a batch to fill or leaves the GPU idle between requests. Either way, you’re paying full price for partial throughput.
There’s also a fairness problem hiding here: a five-token chat message and a 50,000-token document don’t have remotely similar resource footprints, but a naive first-in-first-out scheduler treats them identically. The result is head-of-line blocking — big jobs quietly starving small ones of GPU time while nobody notices until latency complaints start rolling in.
Latency and throughput are different problems
This one trips up a lot of smart engineers: latency and throughput are not the same axis, and optimizing hard for one usually costs you the other.
Latency is what one user feels — request in, response out. Throughput is a system-wide number — total tokens processed per second across everyone. Configure for maximum throughput (big batches, longer queue windows) and individual latency creeps up, because each request waits for its batch to fill. Configure for minimum latency (small batches, instant dispatch) and you lose the utilization gains batching was giving you, which drives up cost per token.
There’s no universal right answer — it depends entirely on the workload. A customer-facing chatbot needs low, predictable time-to-first-token even at the cost of some throughput. A backend pipeline chewing through documents overnight can absorb higher per-request latency in exchange for much better throughput and cost. Apply one infrastructure profile to both, and you’re overpaying for latency nobody asked for in one place while short-changing it in the other.
Where deployments actually break
The recurring failure patterns aren’t exotic: memory fragmentation from variable-length sequences quietly shrinking usable GPU memory, interconnect saturation after a team scales from single-GPU prototype to multi-node production without redesigning the network, naive schedulers leaving GPUs idle or thrashing, and storage-driven cold starts undermining the whole point of autoscaling. None of these show up on a dashboard built for tracking CPU and disk in the traditional sense — which is exactly why generic cloud monitoring tools miss the signals that predict AI performance problems before they hit users.
The takeaway
LLM performance isn’t a property of the model — it’s an emergent property of everything around it. Compute, memory, networking, and storage each impose their own limits, and how they interact through scheduling and batching decides whether a deployment feels instant or feels broken.
If you want a deeper, more technical breakdown of this — including the actual math behind KV-cache sizing and where enterprise deployments lose the most money — the team at Infratailors AI put together a genuinely thorough piece on exactly this problem: Why AI Infrastructure Determines LLM Performance. Worth the read if you’re past the “just add more GPUs” phase and actually trying to fix this properly.
메타데이터
- post_id
- 9e2bb554ee76
- slug
- your-llm-isnt-slow-your-infrastructure-is-9e2bb554ee76
- url
- https://medium.com/@mats.brorsson/your-llm-isnt-slow-your-infrastructure-is-9e2bb554ee76
- canonical_url
- https://medium.com/@mats.brorsson/your-llm-isnt-slow-your-infrastructure-is-9e2bb554ee76
- author_url
- https://medium.com/@mats.brorsson
- status
- ok
- fetched_at
- 2026-08-28 21:20:03