Click any words you think contain an error. Click again to unmark.
Decode is bandwidth-bound, so a GPU upgrade that doubles FLOPs while keeping HBM bandwidth flat barely changes TPOT. Per-step time floor = weight bytes / HBM bandwidth (~70ms for 70B bf16 on A100).
Picture a water hose filling a bucket. You can buy a much bigger bucket, but if the hose is the same size, the bucket fills at the same rate. The hose is HBM bandwidth, the bucket is compute. Decode keeps demanding the same big drink of data on every token; doubling the bucket size does not make the water arrive faster. To speed things up you need a bigger hose, like the H100 or B200, or you need to ask for less water, like switching to a smaller-bytes model with FP8 weights.
Concept explanation~2 min read
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
Concept explanation~2 min read
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
A team about to spend on the wrong GPU is one of the most common production-LLM failure modes, and the scenario in the question captures the pattern almost verbatim. TPOT is too high, the budget is allocated for a hardware upgrade, the candidate SKUs are evaluated on peak TFLOPs, and the team picks the one with the biggest compute number. The arithmetic to expose the mistake takes thirty seconds, and it is worth being able to run it cold.
The specific proposal: from A100 (2 TB/s HBM, ~312 bf16 TFLOPs) to an unnamed SKU with double the FLOPs but the same 2 TB/s of HBM bandwidth, with a predicted TPOT cut from 80 ms to 40 ms. The prediction depends on a hidden assumption that the matmul is the slow part of a decode step. It is not. On a 70B bf16 model at batch 1, the matmul finishes in a small fraction of the time spent moving weights from HBM, so cutting matmul time in half saves a small fraction of a small fraction of TPOT.
This walkthrough builds the floor calculation from scratch, applies it to the candidate GPUs, and contrasts the hardware-upgrade path with the bytes-reduction path (FP8, GQA, MLA) that can solve the SLA problem without buying anything. By the end you should be able to challenge any decode-TPOT GPU proposal by reaching for the floor formula and the candidate-GPU bandwidth specs.
The TPOT floor formula
A single decode step on a transformer LLM at batch 1 does roughly this. For each layer, read the layer's weight tensors from HBM into the streaming-multiprocessor caches, read the layer's KV cache entries, perform a matrix-vector multiplication for the QKV projections plus attention plus the MLP, write a small activation back. The cycle repeats per layer, then the sampler produces the next token, then a new KV entry is appended per layer.
The time per step is the sum of memory time and compute time, with overlap. In the bandwidth-bound regime (decode at batch 1 on a large model), memory time dominates and sets the floor. Memory time is bytes-read divided by HBM bandwidth. Bytes-read is the sum of weight bytes plus KV-cache bytes plus a small term for activations.
For a 70B model in bf16: weight bytes are about 70 billion parameters times 2 bytes equals 140 GB. KV cache at a 4k context with standard MHA is on the order of 4-8 GB. So per-step memory traffic is around 150 GB. The 50 ms SLA divided by this gives a required bandwidth of 3 TB/s; the A100 at 2 TB/s misses by a factor of 1.5.
The corresponding compute time on A100 at 312 TFLOPs bf16 is roughly: per-step FLOPs (about 2x parameter count for matmul, so ~140 GFLOPs) divided by peak TFLOPs gives 140e9 / 312e12 = 0.45 ms. That is the matmul time, with no overlap factor: less than 1 ms against a memory time of 70 ms. The compute units are doing nothing for about 99 percent of each step.
Now the proposal: double the compute. New compute time is 0.225 ms. New memory time is still 70 ms. Total per-step time is still ~70 ms. The 'double FLOPs' upgrade saved about 0.2 ms of an 80 ms step. Realized TPOT moves from 80 ms to 79.8 ms. The predicted 40 ms is off by a factor of about 200.
Situations where this technique stops working.
2–4 min · Everything important, quickly.
Real products, models, and research that use this idea.
- NVIDIA H200 release in late 2024 was pitched primarily on 1.4x HBM bandwidth (4.8 TB/s vs H100's 3.35) for inference, with FLOPs unchanged from H100.
- B200 in 2025 doubled bandwidth again to ~8 TB/s with FP4 tensor cores; FP4 weight reads on B200 deliver TPOT floors below 10ms even on 70B models.
What an interviewer would ask next. Try answering before peeking at the approach.
QAt what batch size does a 70B model on H100 cross from bandwidth-bound to compute-bound during decode?
Compute arithmetic intensity at batch B: each loaded weight is reused across B requests, so intensity grows linearly with B. H100 balance is ~200 FLOPs/byte. At batch 1 the intensity is ~1; the crossover is around batch 200, often observed empirically around 128-256 depending on context length. Past that, FLOPs matter.
Red flags & common mistakes
The phrases that signal junior thinking. Click to expand.
Red flags & common mistakes
The phrases that signal junior thinking. Click to expand.
Buying more compute to fix a decode TPOT problem. Decode is bandwidth-bound at batch 1, so additional TFLOPs sit idle waiting for HBM. The right upgrade adds bandwidth (H100/H200/B200) or shrinks bytes per step (FP8, GQA, MLA).
60 second bullets to scan on the way to the call.
How to compute the per-step TPOT floor from weight bytes and HBM bandwidth
HBM bandwidth specs for A100, H100, H200, B200 in 2026
Primary sources. Browse if you want the original framing.
Same topic, related formats. Practice these next.