Skip to content

存储注意力机制中 Key 和 Value 向量的缓存,避免自回归解码时重复计算已生成 token 的投影。

为什么需要 KV Cache

LLM 自回归生成时,每步需对全部历史 token 计算注意力。若不缓存 Key/Value,每步的计算量随序列长度线性增长,总复杂度退化为 O(n^2)。KV Cache 将已计算的 Key/Value 保留在显存中,使每步仅需计算新 token 的投影,将增量解码复杂度降至 O(1)。

核心原理

  • Prefill 阶段:一次性计算 prompt 所有 token 的 K/V 并缓存。
  • Decode 阶段:仅计算新 token 的 Q/K/V,K/V 追加到缓存,用全量 K/V 与当前 Q 计算注意力。
  • 显存瓶颈:KV Cache 占用与 batch_size * seq_len * num_layers * hidden_dim 成正比,是长序列推理的主要显存开销。
  • 量化压缩:可用 FP8/INT8/INT4 对 KV Cache 进行量化,降低显存占用与带宽压力。

在源码中的实现

  • vllm/worker/cache_engine.pyCacheEngine 预分配 GPU/PU KV Cache 显存池。
  • vllm/core/kv_cache_manager.pyKVCacheManager 追踪每个 sequence 的 KV block 使用情况。
  • vllm/attention/layer.pyAttention 层的 forward 方法接收 kv_cache 参数并执行读写。
  • vllm/config.pyCacheConfig 定义 block_size、gpu_memory_utilization、dtype 等缓存配置。

相关概念