0%

vLLM 与 PagedAttention

vLLM 与 PagedAttention

一句话定位:把操作系统的虚拟内存分页思想搬到 KV Cache 上——用非连续的固定大小 block 管理显存,把因碎片与预留造成的浪费降到极低,从而大幅提升并发与吞吐。

1. 问题:连续分配造成的双重浪费

传统实现给每个请求预留一段连续显存来放 KV Cache,且必须按可能的最大序列长度预留:

  • 内部浪费(预留过度):请求实际只生成 100 token,却按 2048 预留,剩余全部闲置;
  • 外部浪费(碎片化):请求长短不一、频繁进出,空闲显存被切碎,总量够却放不进新请求。

结果是有效显存利用率很低,能并发的请求数远低于理论值。

2. 机制:借鉴虚拟内存分页

  • 把 KV Cache 切成固定大小的 block(如每 block 存 16 个 token 的 K/V);
  • 一个请求的 KV 序列由若干 block 组成,这些 block 在物理显存上无需连续
  • 用**block table(页表)**维护”逻辑 token 位置 → 物理 block”的映射,注意力 kernel 按页表间接寻址(这就是 PagedAttention)。

直接收益:

  • 消除外部碎片:任何空闲 block 都能被复用;
  • 消除预留浪费:按需增长,用多少分多少(仅最后一个 block 有不足一页的内零头);
  • 显存利用率大幅提升 → 同样显存可容纳更多并发请求 → 吞吐显著提高(论文报告相较此前系统有数倍吞吐提升)。

3. 前缀共享与 Copy-on-Write

多个请求共享同一前缀(同一 system prompt、同一 few-shot 示例、并行采样同一 prompt 的多个输出)时:

  • 前缀对应的 block 只存一份,被多个请求的页表同时引用(引用计数);
  • 当某个请求需要在共享 block 上写入分歧内容时,触发 Copy-on-Write:复制该 block 后再写,其他请求不受影响。

这与操作系统 fork 的 COW 完全同源,能进一步省下大量重复显存。

4. 工程视角

vLLM 是围绕 PagedAttention 构建的推理引擎,同时实现了 Continuous Batching(3.6)——两者配合才是吞吐提升的完整来源:分页解决”装得下多少”,连续批处理解决”跑得满不满”

参考:论文《Efficient Memory Management for Large Language Model Serving with PagedAttention》(Kwon et al., 2023);vLLM 官方文档