KV 缓存是什么?大模型推理时用空间换时间的关键优化
KV 缓存(Key-Value Cache,键值缓存)是大语言模型推理性能优化中最常用的技术之一。它在不影响任何计算精度的前提下,通过“用空间换时间”的思想,大幅提高推理的速度。它是 Transformer 推理中一项重要的工程化技术,各大推理框架都实现了它。
为什么需要 KV 缓存
大语言模型生成文字的方式是“自回归”的:一个 token 接一个 token 地生成,每生成一个新的 token,都要基于前面已有的所有内容。Transformer 的核心是注意力机制:在生成每一个新 token 时,它需要让这个新 token 去“关注”前面所有的 token,计算它们之间的相关性。具体来说,每个 token 都会被转换成三个向量:查询(Query)、键(Key)和值(Value)。新 token 用自己的查询向量,去和前面所有 token 的键向量计算相似度,再按照相似度对它们的值向量进行加权求和。
问题在于:如果不做任何优化,每生成一个新的 token,都要把前面所有 token 的键和值重新计算一遍。可是前面那些 token 的键和值,在之前的步骤中其实已经算过了,而且它们不会改变。生成到第 1000 个 token 时,前面 999 个 token 的键值都要再算一遍,大量的计算都是重复的,越往后越慢。
KV 缓存怎么做
KV 缓存的做法很简单:把每个 token 在每一层计算出的键和值保存下来,放在一个缓存里。生成新的 token 时,只需要计算这个新 token 自己的查询、键和值,然后直接从缓存中取出前面所有 token 的键和值来完成注意力计算,最后再把新 token 的键和值也加入缓存。这样就避免了大量的重复计算,生成速度得到了大幅的提升。
它带来的代价:显存
KV 缓存是典型的用空间换时间:它需要占用显存来保存所有的键和值。缓存的大小与对话的长度、模型的层数、注意力头的数量和维度,以及同时处理的请求数量成正比。对于长上下文和高并发的场景,KV 缓存占用的显存可能比模型参数本身还要大,常常成为推理的主要瓶颈:它限制了能处理的最大上下文长度,以及一张显卡能同时服务多少个用户。
如何优化 KV 缓存
因此,如何减小 KV 缓存成为大模型推理优化的核心问题之一。在模型结构上,有多查询注意力(MQA)和分组查询注意力(GQA),让多个注意力头共享同一组键和值;DeepSeek 提出的多头潜在注意力(MLA),把键和值压缩成低维的潜在向量;以及滑动窗口注意力,只保留最近一段内容的缓存。在系统层面,vLLM 提出的 PagedAttention 借鉴了操作系统的分页内存管理,减少显存的碎片和浪费;还有对 KV 缓存进行量化压缩、只保留重要 token 的缓存、把相同前缀的缓存在多个请求之间复用等方法。很多大模型 API 提供的“提示词缓存”功能,就是复用长前缀的 KV 缓存,从而降低重复内容的费用和延迟。