数据截至 (上游 commit f25c580af159)
01 · PagedAttention 与 KV cache 块管理
这一章讲什么: vLLM 的成名作。先讲清 KV cache 为什么是推理的显存杀手, 再讲 PagedAttention「按块分页」的核心思想,最后落到本 commit 里的三块真实代码:
KVCacheBlock块对象、BlockPool块池、KVCacheManager分配器,以及前缀缓存怎么靠链式哈希命中。
1. 它要解决的小问题
自回归生成每多一个 token,注意力就要重读它前面所有 token 的 Key/Value 向量。为了不重复计算,这些向量被缓存下来——这就是 KV cache。
问题在于它的形状:长度只有在生成结束那一刻才知道。传统实现为每条请求预留一段能装下 max_model_len 的连续显存,于是出现两种浪费:
| 浪费 | 来源 |
|---|---|
| 内部碎片 | 预留 4096 个 token 的位置,实际只用了 300 个,剩下的谁也用不了 |
| 外部碎片 | 显存被切成大小不一的占用段,加起来够、连续的不够 |
| 重复存储 | 一千条请求共享同一个系统提示词,前缀的 KV 被存了一千份 |
PagedAttention 论文(vLLM 的出处,arXiv:2309.06180)给出的判断是:这就是操作系统几十年前解决过的问题——内存分页。本 commit 里的 vllm/v1/core/ 就是这套思想在 V1 引擎里的完整实现。