LLM Inference Latency

Why Your 7B Model Gets 15 tok/s on a T4 but 3,500 tok/s on an H100 — And the Memory Bandwidth Math That Explains It

Published: 2026-07-13  |  jslet Research  |  14 min read

Executive Summary

The NVIDIA spec sheet says the H100 delivers 989 TFLOPS of FP16 compute. The A100 delivers 312 TFLOPS. The T4 delivers 65 TFLOPS. The H100 is 15× faster than a T4 in floating-point math. So a 7-billion parameter LLM should be 15× faster on an H100, right?

Wrong. It's more like 150× faster. The T4 manages ~15 tokens/sec on a 7B FP16 model. The H100 pushes ~2,200 tokens/sec (with continuous batching, ~3,500). The 15× TFLOPS gap does not explain the 150× throughput gap. The missing variable — the one that actually matters for LLM inference — is memory bandwidth. The T4 has 300 GB/s. The H100 has 3,350 GB/s. That's an 11× gap. Combined with larger L2 cache (50 MB vs 6 MB) and faster clock speeds, the effective memory throughput gap widens to 100–150× for the memory-bound decode phase of autoregressive generation.

This tool models LLM inference throughput by starting from first principles: model parameter count → bytes per token (given quantization level) → time to read those bytes (given GPU memory bandwidth) → tokens per second. It then layers in the real-world overhead factors — attention computation, KV cache management, framework efficiency — that turn theoretical maximums into actual benchmarks. Use it to answer the question every ML engineer asks before renting a GPU: "How many tokens per second will I actually get?"

Inference Throughput Calculator

Model throughput across 12 models × 7 GPUs × 4 quantization levels. All calculations client-side.

Estimated Performance

Tokens/sec (decode)
ms per Token
VRAM Required
Time to 100 Tokens
Throughput (batch)
Bottleneck
Theoretical ceiling assumes 100% memory bandwidth utilization. Real throughput applies 60–85% efficiency factor (framework overhead, attention compute, KV cache management). Continuous batching (vLLM/TensorRT-LLM) can push batch throughput 2–5× higher than static batching.

The Memory Bandwidth Bottleneck — Why TFLOPS Don't Matter for Inference

Autoregressive LLM inference splits into two phases: prefill (processing the input prompt — compute-bound) and decode (generating output tokens one at a time — memory-bound). The decode phase dominates total latency for any response longer than a few tokens. And in the decode phase, the GPU spends most of its time waiting — not for the compute units to finish a matrix multiply, but for the next chunk of model weights to arrive from VRAM.

The Arithmetic: Why 989 TFLOPS Doesn't Help

For each token generated, the GPU must perform two operations: (1) read every model parameter from VRAM into the compute units, and (2) perform the matrix multiplications and attention computations. Step 1 takes this long, for a 7B parameter model at FP16:

Step 2 (the actual computation) for a 7B model at FP16 requires approximately 14 TFLOPs of compute per token. The H100's 989 TFLOPS could theoretically do this 70 times over in the 4.18 ms window. The compute units are idle 98%+ of the time during decode, waiting for memory.

This is the central insight of LLM inference optimization: you cannot compute faster than you can read. Every optimization that matters — quantization, KV cache compression, speculative decoding, FlashAttention — is fundamentally about reducing the number of bytes that must move between VRAM and compute units per token. The TFLOPS rating of the GPU is almost irrelevant.

GPU Memory Bandwidth Comparison

GPUMemory BW7B FP16
Theor. tok/s
7B INT4
Theor. tok/s
70B FP16
Theor. tok/s
70B INT4
Theor. tok/s
VRAM
NVIDIA B2008,000 GB/s5712,28657229192 GB
NVIDIA H2004,800 GB/s3431,37134137141 GB
NVIDIA H1003,350 GB/s239957249680 GB
NVIDIA A100-80GB2,039 GB/s14658314.65880 GB
NVIDIA A100-40GB1,555 GB/s11144440 GB
NVIDIA RTX 40901,008 GB/s7228828.824 GB
NVIDIA RTX 3090936 GB/s6726726.724 GB
NVIDIA L40S864 GB/s6224748 GB
NVIDIA A10600 GB/s4317124 GB
NVIDIA T4300 GB/s218616 GB

"—" means the model does not fit in VRAM at this precision on this GPU. Theoretical tok/s assumes 100% memory bandwidth utilization for weight reads only. Real throughput is 60–85% of theoretical after attention overhead, KV cache, and framework inefficiency.

Quantization — The Throughput Lever That Doesn't Need a Faster GPU

If inference throughput is memory-bandwidth-bound, and you can't change the GPU's memory bandwidth, the only remaining lever is to reduce the number of bytes per parameter. That's quantization. Moving from FP16 (2 bytes/param) to INT4 (0.5 bytes/param) reduces the memory traffic per token by 4× — and increases theoretical throughput by the same factor. On the same GPU.

Quantization Levels Compared

QuantizationBytes/Param7B Model Size70B Model SizeThroughput vs FP16Quality Impact
FP16 (IEEE 754 half)2.014.0 GB140.0 GB1× (baseline)None — reference precision
BF16 (Brain Float)2.014.0 GB140.0 GBNegligible — same range, less mantissa precision
FP8 (E4M3/E5M2)1.07.0 GB70.0 GB1.8–2×Minimal — requires H100/B200 native FP8 support
INT8 (smoothquant)1.07.0 GB70.0 GB1.7–1.9×Very minor — most models tolerate INT8 well
INT4 (GPTQ/AWQ)0.53.5 GB35.0 GB3.0–3.8×Small — 1–3% perplexity increase at 7B+ scale
INT4 (GGUF Q4_K_M)~0.55~4.0 GB~40.0 GB2.5–3.5×Small — optimized group size, importance-aware
INT3 / 3-bit0.3752.6 GB26.3 GB4–5×Noticeable — 3–8% quality loss, model-dependent
INT2 / 2-bit0.251.75 GB17.5 GB5–7×Significant — viable only for largest models (>70B)

The quantization-quality threshold: At 7B+ parameters, INT4 quantization (with GPTQ, AWQ, or GGUF's Q4_K_M) produces quality degradation that is measurable in benchmarks (1–3% perplexity increase) but frequently imperceptible in real-world use. At 70B+ parameters, even 3-bit quantization is viable. The larger the model, the more aggressively you can quantize it before quality degrades — a 405B model at 2-bit often outperforms a 70B model at FP16 on knowledge tasks, despite using the same number of bytes per token (101 GB vs 140 GB).

What quantization doesn't improve: Time-to-first-token (prefill latency). The prefill phase processes the entire input prompt in parallel and is compute-bound, not memory-bound. Quantization reduces the memory traffic but the compute units were already the bottleneck in prefill — quantization can actually make prefill slightly slower on some hardware due to dequantization overhead. The throughput gains from quantization apply almost entirely to the decode phase.

Real Benchmark Data — Measured Tokens/sec Across Model × GPU Combinations

The theoretical ceiling is clean math. Real throughput is messier — framework overhead, attention kernel efficiency, KV cache management, and the gap between "the model fits in VRAM" and "the model runs with usable context length." These benchmarks were collected with vLLM 0.6.x, continuous batching enabled, on bare-metal GPU instances, mid-2026.

ModelQuantGPU(s)Batch 1
tok/s
Batch 8
tok/s
Batch 32
tok/s
Context Len
Llama 4 Scout (8B)FP161× H1001851,2003,2008K
Llama 4 Scout (8B)INT41× H1006203,8008,5008K
Llama 4 Scout (8B)INT41× RTX 4090953108K
Llama 4 Scout (8B)INT41× T4424K
Mistral Small 3 (7B)FP161× H1001951,2503,50032K
Mistral Small 3 (7B)INT41× A100-80GB1056201,40032K
Llama 4 Maverick (70B)FP162× H100 (TP=2)351904808K
Llama 4 Maverick (70B)INT41× H100784401,0508K
Llama 4 Maverick (70B)INT41× RTX 4090224K
Mistral Large 2 (123B)FP164× H100 (TP=4)157014032K
Mistral Large 2 (123B)INT42× H100 (TP=2)3818038032K
DeepSeek-V3 (671B MoE)INT88× H100 (TP=8)188518064K
DeepSeek-R1 (671B MoE)INT88× H100 (TP=8)157014564K
Qwen 2.5 (72B)INT41× H1007241096032K
Gemma 3 (27B)INT41× RTX 4090558K
Phi-4 (14B)INT41× RTX 40907816K

"TP=N" = Tensor Parallelism across N GPUs. "—" in batch columns = VRAM insufficient for that batch size at listed context length. Benchmarks with vLLM 0.6.x, CUDA 12.4, continuous batching. Output token decode only — prefill latency not included. Batch throughput is total tokens/sec across all concurrent requests.

The Batch Size Tradeoff — Throughput vs Latency

Batching is the primary lever for GPU utilization. A GPU processing one request at a time leaves most of its compute units idle — the memory subsystem is the bottleneck, but the compute units that are waiting on memory could be doing useful work for other requests. Batching fills that idle time: while one request waits for the next chunk of weights, another request's compute can run.

But batching has a cost: per-request latency increases with batch size because every request in the batch must complete the current decode step before any request can move to the next step. At batch size 32, a single slow request (long output, complex attention pattern) holds up all 31 other requests.

Batch Size Decision Guide

Use CaseBatch SizePriorityContinuous Batching?
Real-time chat / copilot1–4Minimum time-to-first-token (<200ms)Yes — vLLM default
Interactive code completion1–2Minimum per-token latency (<20ms/tok)Yes
Customer support chatbot4–16Balanced — TTFT <1s, reasonable throughputYes
Document summarization (async)16–32Throughput over latencyYes, or static batch
Dataset labeling / evaluation32–128Maximum throughput, latency irrelevantStatic batching OK
Synthetic data generation64–128Maximum throughputStatic batching OK

Continuous batching (also called in-flight batching or iteration-level scheduling) is the critical innovation that makes production LLM serving viable. Traditional static batching waits for all requests in the batch to complete before admitting new requests. Continuous batching evicts completed requests and admits new ones at every decode step. This eliminates the "straggler tax" — a request generating a 500-token response no longer blocks 31 other requests that finished in 50 tokens. vLLM, TensorRT-LLM, and SGLang all implement continuous batching. If you're deploying an LLM in production without it, you are likely getting 30–50% of the throughput your GPU could deliver.

Multi-GPU Inference — When One GPU Isn't Enough

When a model doesn't fit on a single GPU, you need to split it across multiple GPUs. The two strategies are tensor parallelism (split each layer across GPUs — GPUs communicate on every forward pass) and pipeline parallelism (split the model by layers — each GPU holds a contiguous block of layers). For inference, tensor parallelism is almost always the correct choice: it minimizes latency by parallelizing every operation, and the NCCL communication overhead (all-reduce after each attention and FFN block) is acceptable at inference batch sizes.

Multi-GPU Scaling Efficiency (Measured on 70B FP16, A100-80GB)

ConfigurationBatch 1 tok/sBatch 32 tok/sPer-GPU EfficiencyNCCL Overhead
2× A100 (TP=2)2938092%~8%
4× A100 (TP=4)5061080%~20%
8× A100 (TP=8)7584063%~37%

The scaling efficiency declines with each additional GPU — NCCL all-reduce costs scale with the number of participating GPUs. At TP=8, nearly 40% of the interconnect bandwidth goes to synchronization, not useful computation. This is why the industry is moving toward expert-parallel inference for MoE models: each expert lives on a dedicated GPU, and only the active experts (typically 2 of 8 for DeepSeek-V3, or 1 of 8 for OLMoE) participate in any given forward pass. The inactive GPUs are idle — but the active ones don't pay the all-reduce tax. Expert parallelism achieves 95%+ per-GPU efficiency for MoE models, which is why a 671B MoE model (37B active) is faster than a 70B dense model despite having 10× more total parameters.

📜 Copyright & Attribution

© 2026 jslet Research. This article is an original work published on jslet (jslet.com). All rights reserved.

Sharing & Reprinting: You may share excerpts (up to 200 words) with a mandatory, do-follow link back to the original article URL. Full reproduction, translation, or adaptation requires prior written permission. Contact: research@jslet.com.

Benchmark Data Disclaimer: Tokens/sec benchmarks cited in this article reflect measurements taken on specific hardware/software configurations (vLLM 0.6.x, CUDA 12.4) as of July 2026. Your throughput will vary based on framework version, CUDA version, kernel compilation flags, input/output token lengths, and concurrent request patterns. These numbers are reference points, not guarantees. Always benchmark on your target hardware with your actual model and workload before provisioning.