技术深度解析
KV缓存本质上是一个键值存储,它在自回归生成过程中捕获每一层Transformer的中间注意力状态——具体来说,就是Key(K)和Value(V)矩阵。对于每一个新生成的token,模型需要计算它与之前所有token的注意力;如果没有缓存,每一步都需要重新计算整个注意力,导致序列长度的O(n²)复杂度。通过存储这些矩阵,推理复杂度降为每步O(n),但代价是内存随批次大小、序列长度、层数和隐藏维度线性增长。
内存占用惊人。以一个70B参数、80层、隐藏维度8192、32位精度的模型为例,每个token大约消耗80 × 8192 × 2 × 4字节 = 5.2 MB的KV缓存。在128K上下文长度下,每个序列需要超过650 GB——远超模型权重本身的140 GB。这种不对称性是核心矛盾:模型权重是静态的,可以分片存储,但KV缓存是动态的、按序列分配的,并且必须即时访问。
目前涌现了多种架构创新来应对这一挑战:
多查询注意力(MQA)和分组查询注意力(GQA) 减少了KV头相对于查询头的数量。MQA(用于PaLM和Falcon)对所有查询头使用单个KV头,将缓存大小缩减为查询头数量分之一(通常为8-16倍)。GQA(由Llama 2和3推广)将查询头分组为较少数量的KV头,提供了可调节的权衡。Llama 3 70B使用8个KV头对比64个查询头,缓存减少了8倍。
滑动窗口注意力(如Mistral和Mixtral)将缓存限制在最近token的固定窗口内(例如4096)。这限制了内存增长,但牺牲了长程上下文。Mistral 7B通过将滑动窗口与独立的交叉注意力层结合,在长上下文基准测试中取得了强劲表现。
前缀缓存在具有公共前缀的请求之间复用KV缓存。这在系统提示相同的聊天机器人应用中尤为强大。vLLM和TensorRT-LLM等系统通过基于哈希的查找表实现前缀缓存,在多轮对话中实现了高达10倍的吞吐量提升。
KV缓存量化将精度从FP16降低到INT8或INT4。NVIDIA 2024年的一篇论文显示,INT8量化KV缓存在MMLU上带来的精度下降不到1%,同时内存减半。开源仓库`kvcache-ai/kvcache`(3.2k星)提供了实验各种量化方案的工具包。
缓存感知调度将KV缓存视为稀缺资源。`vllm-project/vllm`(45k星)实现了一个调度器,可以抢占低优先级缓存的请求,并在请求之间复用缓存块。其PagedAttention机制受虚拟内存分页启发,将碎片化导致的内存浪费减少了高达60%。
| 技术 | 内存缩减 | 精度影响 | 实现复杂度 |
|---|---|---|---|
| 多查询注意力 | 8-16倍 | 某些任务下降2-5% | 低(架构变更) |
| 分组查询注意力 | 4-8倍 | 下降<1% | 低 |
| 滑动窗口 | 有界而非缩减 | 可变;长程任务表现差 | 低 |
| 前缀缓存 | 2-10倍(取决于用例) | 无影响 | 中 |
| KV缓存INT8量化 | 2倍 | MMLU下降<1% | 中 |
| PagedAttention | 减少40-60%碎片 | 无影响 | 高 |
数据要点: 没有单一技术是万能的。最佳方法是将架构变更(GQA)与运行时优化(前缀缓存、分页注意力)和压缩(量化)相结合。趋势是向多层缓存层级发展:GPU HBM用于热缓存,主机DRAM用于温缓存,SSD用于冷缓存。
关键参与者与案例研究
NVIDIA 在硬件层面的KV缓存优化上最为激进。其Hopper H100架构引入了支持FP8的Transformer Engine,但更关键的是,Blackwell B200 GPU将HBM容量翻倍至384 GB,并引入了专用于跨GPU共享KV缓存的缓存一致性域。NVIDIA的TensorRT-LLM库包含一个`kvcache`插件,支持前缀缓存、INT4量化以及GPU与CPU内存之间的自动分层存储。在内部基准测试中,TensorRT-LLM在Llama 3 70B 128K上下文上相比朴素实现实现了3.5倍的吞吐量提升。
AMD 正以MI300X反击,该产品提供192 GB HBM3和统一内存架构,简化了CPU与GPU之间的KV缓存管理。AMD的ROCm平台包含一个缓存感知调度器,可根据访问模式在GPU和主机内存之间动态分配KV缓存。早期基准测试显示,在长上下文工作负载上性能具有竞争力,但生态系统成熟度仍落后于CUDA。
Cerebras 采用截然不同的方法,通过其晶圆级引擎彻底消除了对KV缓存的需求。