是什么
大语言模型逐字生成文本:先产出一个 token,把它接到输入后面,再运行一次模型产出下一个。每一步里,注意力层都需要此前所有 token 的键(key)向量和值(value)向量。已经算过的这些向量,在追加新 token 时并不会改变,每一步重算一遍就是白费力气。键值缓存(key-value cache,简称 KV cache)就是保存它们的地方:一个 token 被处理过一次之后,它的键和值留在内存里,之后每一步直接读取。缓存按请求各自维护,大小由该请求已经处理过的 token 数决定;它可能非常庞大,并且随着生成过程动态地增长和收缩 [1]。
怎么工作
举一个具体的小例子。假设目前输入是一句很短的话,模型已经处理完这句话,缓存里为其中每个位置存下了一个键向量和一个值向量。要生成下一个词时,新位置的查询(query)向量去和缓存里已有的键比对(再加上新位置自己的键),得到的注意力权重用来加权混合缓存里的值,输出的就是下一个 token。这个 token 被接上去,它自己的键和值也写进缓存。再生成下一个词时,前面所有的条目原样复用。
如果没有缓存,每一步生成都要把整段前缀重新送进模型算一遍,文本越长,重复的计算量膨胀得越快。有了缓存,每一步的主要开销就从「重算」变成了「读一遍不断变长的键值存储」。
内存问题从哪来
这份存储并不是无关紧要的记账细节。单个请求的缓存可能很大,而且大小并不固定:不同请求的长度差别很大,同一个请求在生成过程中还会一直变长 [1]。如果内存分配得粗糙,比如按最坏情况给每个请求预留一整块连续空间,用不满的部分就白白闲置;请求长短不一还会留下碎片,另有一部分内存被重复的副本占着 [1]。这些浪费直接压低了服务器能同时容纳的请求数,而高吞吐恰恰要求一次批处理很多请求 [1]。
分页思路与 vLLM
2023 年 9 月,Kwon 等人提出了 PagedAttention,这个注意力算法的灵感来自操作系统中的虚拟内存(virtual memory)和分页(paging)技术 [1]。操作系统里的分页,是把连续的逻辑地址映射到可以散布在内存各处的物理块上,用一张表记录对应关系,从而不必预留一整段连续空间。PagedAttention 把同样的思路用在了键值缓存上。
在 PagedAttention 之上,作者实现了 vLLM,一个键值缓存几乎零浪费的 LLM 服务系统 [1]。vLLM 还允许在同一个请求内部以及不同请求之间灵活共享缓存,从而进一步降低内存占用 [1]。
结果与今天的位置
与 FasterTransformer、Orca 等系统相比,在相同延迟水平下,vLLM 把常见 LLM 的吞吐量提高了 2–4 倍 [1]。序列越长、模型越大、解码算法越复杂,提升越明显 [1]。这项工作发表在 SOSP 2023,源代码公开 [1]。对今天做推理服务的人来说,键值缓存怎么管,已经和注意力怎么算一样,是系统设计中的核心问题:服务器的内存主要花在这份缓存上,而内存怎么分发,决定了这台机器一次能服务多少个用户。
局限
分页消除的是浪费,而不是数据本身。键和值仍然必须存下来,需要保存的量仍然随上下文长度和并发请求数增长。报告中的收益也取决于负载:正因为提升在长序列、大模型和复杂解码算法上更明显 [1],短序列或解码简单的场景收益就相对有限。
注释与来源
- Efficient Memory Management for Large Language Model Serving with PagedAttentionhttps://arxiv.org/abs/2309.06180
引用本页: 键值缓存(KV cache). TellWorld, https://www.tellworld.net/zh/learn/kv-cache. 更新于 2026-11-07