模型部署与推理优化

PagedAttention 与 KV 显存分页管理

kp-014核心25 分钟04-KV与注意力

一句话定义

PagedAttention 借用操作系统虚拟内存的思想,把每个请求的 KV Cache 切成固定大小的 block 按需分配,消灭"按最大长度预留"造成的显存浪费,把有效吞吐提升数倍。

为什么重要

vLLM 论文实测:传统"预留 max_seq_len 连续显存"的做法浪费 60–80% 的 KV 显存(内部碎片 + 保留浪费 + 外部碎片),意味着同样的卡只能服务 1/3 的并发。分页是现代推理引擎的标配——理解它就理解了 vLLM/SGLang 吞吐优势的第一来源。

前置知识

  • kp-013(KV Cache 的线性增长与并发关系)。
  • 操作系统"分页/虚拟内存"的名词级概念(页表、按需分配)。

核心概念

  • 三种浪费:①预留浪费:按 max_seq_len 预留,实际请求短得多;②内部碎片:预留与实际之间的空隙;③外部碎片:连续分配导致的碎片化。vLLM 论文测得传统系统有效 KV 利用率仅 20–40%。
  • block 分页:KV 按固定 token 数(常用 16)切块,物理块不连续,由每请求的块表(block table)映射;需要多少分配多少。
  • 前缀共享与 copy-on-write:相同 system prompt 的多个请求共享物理块(beam search / 并行采样同理),写时复制保证语义正确——这是前缀缓存(kp-023)的显存层基础。
  • 按块调度的副产品:显存接近满时不再整请求拒绝,而能按块粒度做抢占与换出(swap/recompute)。

原理与机制

分页与操作系统虚拟内存同构:把逻辑上的连续序列切成固定 block,用块表映射到不连续的物理块,分配粒度从"整条序列"降到"16 个 token"。预留浪费、内部碎片与外部碎片因此同时消失,剩余浪费只有每条序列末尾的半个 block;块表还顺手带来前缀共享与写时复制——同前缀请求引用同一物理块,调度器得以按块粒度做抢占与换出。

公式与模型

分页后的浪费下界 ≈ 每请求最后一个 block 的半块(≤ block_size/2 个 token 的槽位),相对浪费 ≈ 1/(2×block_size) ≈ 3%(block=16)。对照传统预留:请求实际长度 L_act,分配 L_max,浪费率 = 1 − L_act/L_max——真实负载分布长尾(多数请求 <1k,少数 32k)时平均浪费率轻松超过 60%。两者相差约一个数量级,直接转化为 2–4× 并发与吞吐。

图示

传统连续分配(按 max_len=2048 预留):   [实际 KV ███░░░░░░░░░] ← 大量预留浪费
PagedAttention: 逻辑序列 → 块表[7,3,9,1] → 物理块散布显存,按需分配
                 system prompt 块被 3 个请求共享(引用计数)

直观类比

传统方式像给每位客人预留整个宴会厅最大包间(不管来几人);分页像餐厅按桌拼位——座位利用率从三成到九成,这就是吞吐差距的来源。

实例或案例

生产压测常见复现:同一 7B、同一并发 64,连续分配式部署常在 10–20 并发就 OOM 或排队,分页式引擎能吃满 64 并发且 KV 显存利用率 >90%。升级到分页引擎通常是"零精度成本、纯工程收益"的最大单项改进。

常见误区

  • "分页只是省显存":更准确说省的是显存浪费,兑换成更高并发与吞吐;同时换来的还有按块抢占等调度灵活性。
  • "非连续 KV 访问会大幅变慢":注意力 kernel 按 block 粒度读取,块内连续,访存模式可控,实测开销很小。
  • "块越小越省":块太小则块表与 kernel 启动开销上升,16 是工程平衡点。

自测题

  1. 传统 KV 分配的三种浪费分别是什么?

要点:预留浪费(按 max 分配)、内部碎片、外部碎片。

  1. block_size=16 时,分页的理论最大相对浪费约多少?

要点:约 1/(2×16) ≈ 3%。

  1. 前缀共享为什么能省显存?写时复制解决什么?

要点:相同前缀引用同一物理块;解决共享块被写时互相污染的问题。

与其他知识点的关系

建立在 kp-013 之上;与 kp-021(连续批处理)合体构成现代引擎吞吐的两个支柱;kp-022 的显存参数与 kp-023 的会话亲和都以此为前提。

延伸阅读

《Efficient Memory Management for LLM Serving with PagedAttention》(Kwon 等,SOSP 2023)——第 4、5 节的实验数字适合精读。

#PagedAttention#vLLM#分页#显存碎片#前缀共享