现代 AI 系统的“记忆碎片”:从 KV Cache 到 PagedAttention 的演进
在 LLM(大语言模型)的推理过程中,最昂贵的成本之一并非计算量,而是内存带宽。当你与 AI 对话时,模型需要回顾之前的所有上下文。如果每次生成新 Token 都要重新计算一遍之前的所有 Key 和 Value,推理速度将呈平方级下降。为了解决这个问题,工业界引入了 KV Cache(键值缓存)。

现代 AI 系统的“记忆碎片”:从 KV Cache 到 PagedAttention 的演进
在 LLM(大语言模型)的推理过程中,最昂贵的成本之一并非计算量,而是内存带宽。当你与 AI 对话时,模型需要回顾之前的所有上下文。如果每次生成新 Token 都要重新计算一遍之前的所有 Key 和 Value,推理速度将呈平方级下降。为了解决这个问题,工业界引入了 KV Cache(键值缓存)。
然而, KV Cache 带来了一个新的噩梦:内存碎片化。
KV Cache 的本质与痛点
简单来说,KV Cache 是将 Transformer 解码过程中已经计算过的 Token 的 Key 和 Value 向量存储在显存中。这样在生成下一个 Token 时,模型只需计算当前 Token 的 K-V,然后与缓存中的历史 K-V 拼接即可。
但在实际生产环境中,KV Cache 面临三个核心挑战:
1. 长度不可预测:每个请求生成的 Token 长度不同,系统无法预先知道需要分配多少内存。
2. 静态分配浪费:为了防止溢出,传统的推理框架(如早期的 HuggingFace Transformers)通常会根据模型支持的最大上下文长度(如 32k)预先分配一块连续内存。这意味着即使一个请求只生成了 10 个 Token,也会占用 32k 的空间。
3. 外部碎片化:由于请求的生命周期不同(有的快结束,有的刚开始),显存中会出现大量无法利用的空隙。
这种现象导致了极低的显存利用率,直接限制了并发数(Batch Size),从而拉低了整体吞吐量。
PagedAttention:借鉴操作系统的虚拟内存
为了彻底解决这个问题,vLLM 团队提出了 PagedAttention。其核心思想极其纯粹:像操作系统管理物理内存一样管理 KV Cache。
在传统的连续存储中,KV Cache 必须存储在一段连续的物理地址空间里。而 PagedAttention 将 KV Cache 分割成固定大小的“页”(Pages),每页存储固定数量的 Token(例如 16 个)。
工作机制
- 逻辑块 $\rightarrow$ 物理块:模型看到的仍然是一个连续的序列(逻辑块),但底层通过一个“块表”(Block Table)将其映射到不连续的物理显存块中。
- 动态按需分配:当一个请求需要更多空间时,系统才为其分配一个新的物理块。不再需要预先预留最大长度的空间。
- 高效共享:这是 PagedAttention 最强大的地方。在处理“并行采样”(Parallel Sampling)或“多轮对话”时,多个请求可以共享同一个物理块(例如共享 System Prompt 的 KV Cache),只需增加该块的引用计数即可。
从理论到实战:对推理性能的影响
PagedAttention 的引入将 LLM 推理从“内存受限”推向了更高的效率维度:
- 显存利用率提升:由于消除了内部碎片(Internal Fragmentation),显存利用率可提升至 96% 以上。
- 吞吐量飞跃:在相同硬件条件下,由于可以容纳更大的 Batch Size,每秒处理的 Token 数通常能提升 2-4 倍。
- 长文本支持:通过灵活的页管理,系统能够更稳定地处理超长上下文而不会轻易触发 OOM(Out of Memory)。
总结
如果说 Continuous Batching 解决了推理的时间调度问题,那么 PagedAttention 则解决了空间的管理问题。它将 AI 推理从简单的“矩阵运算”升级为了复杂的“资源调度”。对于开发者而言,理解这一层演进意味着能够更好地优化部署参数(如 gpu_memory_utilization 和 max_num_seqs),从而在成本与性能之间找到最佳平衡点。
留言区
欢迎分享你的想法!
加载留言中…