vLLM 0.25 makes Model Runner V2 the dense default — Retiring PagedAttention — What does it mean?
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.