The news. On July 11, 2026, vLLM 0.25.0 shipped with Model Runner V2 as the default path for dense models and one blunt line in the release notes: "PagedAttention has been removed." The same release folds in dynamic speculative decoding compatible with full CUDA graphs, a unified Streaming Parser Engine, FP8/INT4/NVFP4 quantization paths, KV offloading, and distributed-serving fixes around NCCL and prefill/decode KV transfer. Read the release →

Picture an old telephone exchange. Every call has to pass through a switchboard operator who reads a plugboard, finds the two scattered lines the call needs, and physically patches them together — then waits for the next request and does it again. That operator is PagedAttention. When vLLM launched in 2023, the KV cache was scattered across GPU memory in fixed-size blocks, and PagedAttention was the operator who, every single decode step, read a block table and gathered the right blocks. It was a brilliant hire: it ended the memory fragmentation that used to force each request to reserve one giant contiguous slab of GPU memory up front.

But an operator is a person in the loop, and a person in the loop is slow. Because the operator patches a different set of lines on every call, the exchange can never settle into a fixed routine — and a fixed routine is exactly what the next optimization needs. That optimization is the CUDA graph: instead of the CPU calling out each GPU operation live, you record the whole per-step routine once and replay it in a single launch. Recording only works if the routine is the same every time. In practice, older vLLM could only capture graphs for a padded ladder of fixed batch sizes and ran everything else the slow, live-dispatched way.

PagedAttention borrowed its whole design from how an operating system fakes unlimited RAM — virtual pages mapped to scattered physical frames through a page table. The diagram below is that idea, and it is the machinery vLLM is now retiring:

OS Virtual Memory — 4 programs sharing physical RAM
What each program sees (virtual)
Chrome
0
1
2
VS Code
0
1
2
Slack
0
1
2
Spotify
0
1
2
Each app sees pages 0, 1, 2 — contiguous
Physical RAM (actual)
V0
S0
C0
S0
V1
5
S1
C1
8
V2
S1
C2
12
S2
S2
15
Pages scattered — C0 at slot 2, C1 at slot 7...
Page table translates:Chrome v0 → p2, VS Code v0 → p0, Slack v0 → p3

vLLM 0.25's move is to fire the switchboard — not because paging was wrong, but because the phone network learned to route itself. The release notes state the outcome plainly — "PagedAttention has been removed," Model Runner V2 as the dense default, and dynamic speculative decoding now compatible with full CUDA graphs — without spelling out the internal rewrite. The most plausible reading of why those go together: modern attention backends (FlashAttention, FlashInfer) now read block tables and gather paged KV inside the kernel, so the bespoke PagedAttention layer became a redundant middleman, and MRv2 could then unify the forward pass into one path static enough to capture the whole decode step as a replayable CUDA graph. Treat that causal chain as the likely mechanism behind the sourced facts, not a line-by-line claim from the notes.

Walk the launch-overhead math on one decode step (illustrative — the release reports the capability, not timings). Say a single decode step fires 60 tiny GPU kernels, each carrying ~5 µs of CPU launch overhead before any math runs: that is ~300 µs of pure dispatch per token. At those numbers, generating 200 tokens spends ~60 ms just launching kernels — often more than the arithmetic itself. Capture that step as one CUDA graph and all 60 kernels replay from a single launch: dispatch collapses from ~300 µs toward ~5 µs per token, and the ~60 ms of pure overhead nearly vanishes. That collapse is the whole reason "full CUDA graphs" is the headline of the release.

EraWho does KV pagingCUDA-graph coverageCost
PagedAttention (2023–2025)a bespoke vLLM gather kernelpartial — a padded ladder of fixed batch sizeslive kernel dispatch on the un-captured paths
Model Runner V2 (vLLM 0.25) [release]the attention backend, nativelyfull — the whole decode step, spec decoding includedone launch per step (~5 µs, illustrative)

The honest caveat: "PagedAttention has been removed" is a statement about the kernel, not about the idea. Paged KV — logical blocks mapped to scattered physical memory — is more alive than ever; it simply moved down a layer, into the attention backends most serving stacks already depend on. That is the quiet lesson of this release: PagedAttention didn't lose, it won so completely that its trick became a built-in feature and the standalone layer stopped earning its keep — the same way the switchboard operator's job didn't disappear, it got wired into the exchange. When a technique is good enough, the reward is to be absorbed and forgotten.

Goes deeper in: LLM Internals → Paged Attention → PagedAttention in Practice

Related explainers

Frequently Asked Questions

Check what you knowMap your AI & GPU knowledge across every track — free, role-based