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:
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.
| Era | Who does KV paging | CUDA-graph coverage | Cost |
|---|---|---|---|
| PagedAttention (2023–2025) | a bespoke vLLM gather kernel | partial — a padded ladder of fixed batch sizes | live kernel dispatch on the un-captured paths |
| Model Runner V2 (vLLM 0.25) [release] | the attention backend, natively | full — the whole decode step, spec decoding included | one 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
- vLLM v0.20 — FlashAttention 4 packing — the previous vLLM release's headline kernel; MRv2 is the runner that now drives kernels like FA4 under one capturable path.
- vLLM v0.20 — TurboQuant 2-bit KV cache — KV-cache compression; vLLM 0.25 broadens the same idea with FP8/INT4/NVFP4 KV paths.
- AMD ATOM + ATOMesh — Prefill/decode disaggregation — another serving-stack rework; 0.25 also touches the prefill/decode KV transfer MRv2 unifies.