Appearance
存储注意力机制中 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.py—CacheEngine预分配 GPU/PU KV Cache 显存池。vllm/core/kv_cache_manager.py—KVCacheManager追踪每个 sequence 的 KV block 使用情况。vllm/attention/layer.py—Attention层的 forward 方法接收kv_cache参数并执行读写。vllm/config.py—CacheConfig定义 block_size、gpu_memory_utilization、dtype 等缓存配置。
相关概念
- paged-attention — 管理 KV Cache 的分页机制
- kv-cache-offloading — 将 KV Cache 卸载到 CPU/磁盘以节省显存
- prefix-caching — 复用相同前缀的 KV Cache
- chunked-prefill — 分块计算 prefill 以控制 KV Cache 分配速率