PagedAttention:把 KV Cache 分成可管理的块
用逻辑块与物理块的映射理解显存碎片、动态分配与前缀共享。
PagedAttention:把 KV Cache 分成可管理的块
服务多个生成请求时,每个请求的长度不同,KV cache 还会随生成增长。本文根据注意力优化笔记整理 PagedAttention 的内存管理思路。
连续预留的问题
若为每个请求预留一大段连续显存,短请求用不完,长请求又可能需要扩容。不同长度请求陆续进入和退出,还会造成碎片。
这与“模型参数太大”是两个问题。即使权重已经装入显存,仍可能没有足够空间支持更多并发请求的缓存。
逻辑连续,物理分块
PagedAttention 论文借鉴分页思想:按固定 token 数把 KV cache 划成块,通过映射表定位逻辑块对应的物理块。请求看到的序列连续,物理存储不必是一整段连续区域。
| 对象 | 作用 |
|---|---|
| 逻辑块 | 表示序列中的一段 token |
| 物理块 | 实际存储这段 token 的 K 和 V |
| 块映射 | 让注意力内核找到所需数据 |
例如教学设置中每块容纳 4 个 token,长度 10 的缓存占用 3 块,尾块还有 2 个空位。分页减少大段预留,但不会消除所有尾部浪费和元数据开销。
请求生命周期中的操作
序列增长时,按需分配新块;请求完成后释放块。兼容的共享前缀可复用物理块,分支写入则需要保护共享内容,例如采用引用计数与写时复制。
前缀共享要求对应的模型、token 序列及缓存语义一致,不能把不同上下文的缓存任意混用。
分页不是压缩
分块改变存储布局,不自动降低每个 K/V 数值的位宽。量化、缓存淘汰、卸载和分页分别改变不同方面,需要独立分析。
PagedAttention 也不表示每个 token 的 KV 数据都更小;改善的是分配、共享和利用方式。
与服务调度的关系
更高的缓存利用率可能允许更大的有效批次,但提高吞吐量还需要合适的请求调度和计算内核。论文的具体收益不能无条件迁移到任何模型与并发规模。
阅读服务系统时,我会同时记录缓存布局、请求进入退出规则,以及延迟目标;单看显存占用不足以判断服务表现。
This post is licensed under CC BY 4.0 by the author.