背景:KV Cache 的显存困境
LLM 推理时,每个请求都需要为 KV Cache 预留显存。传统做法是按 max_seq_len 连续预分配,带来两类浪费:
- 内部碎片(internal fragmentation):实际生成长度远小于预留长度
- 外部碎片(external fragmentation):不同长度请求导致显存空洞无法复用
实测传统方案的有效显存利用率往往只有 20%~40%。
PagedAttention 的核心思想
借鉴操作系统的虚拟内存分页:
- 将 KV Cache 切分为固定大小的 block(页),每个 block 存储固定数量 token 的 K/V
- 维护 block table 做逻辑 block → 物理 block 的映射
- 物理 block 按需分配,不要求连续
# 逻辑视图(每个 sequence 看到连续的 KV)
seq_a: [block_0, block_1, block_2]
# 物理视图(实际散布在显存各处)
physical: block_0→#7, block_1→#2, block_2→#5
带来的收益
| 维度 | 传统方案 | PagedAttention |
|---|---|---|
| 显存利用率 | 20%~40% | >96% |
| 显存共享 | 不支持 | 支持(prefix 复用) |
| 动态扩展 | 预分配 | 按需分配 |
Copy-on-Write 与前缀共享
多个请求共享相同前缀(如 system prompt)时,可以共享同一批物理 block,仅在内容分叉时才复制(CoW)。这是 vLLM 高吞吐的关键之一。
小结
PagedAttention 把"显存管理"这个系统问题用经典的 OS 思想优雅解决,是 vLLM 相比早期推理框架吞吐提升数倍的根本原因。
21313