📖 什么是KV Cache?
KV Cache(键值缓存)是LLM推理中的一种优化技术,缓存Transformer中已计算的Key和Value,避免在生成每个新token时重复计算。
这是LLM推理加速的核心技术,几乎所有的生产环境推理框架都使用KV Cache。
💡 一句话理解
📝 比喻
考试的「草稿纸」
做数学题时,你已经算出的中间结果写在草稿纸上,下一题如果需要用到,直接看草稿纸就行,不用重新算一遍。KV Cache就是模型的「草稿纸」。
🏗️ 为什么需要KV Cache?
Transformer的自注意力机制:
Attention(Q, K, V) = softmax(QK^T / √d) V
# Q = Query(查询)
# K = Key(键)
# V = Value(值)
生成新token时,之前的K和V没有变化,但传统方法会重新计算。KV Cache把这些存起来:
❌ 无缓存:每次生成都要重新计算所有token的K和V
✅ 有缓存:之前的K和V已存好,只算新token的
📊 KV Cache工作流程
输入: "今天天气"
计算: K₁, V₁ for "今天", K₂, V₂ for "天气" → 缓存
生成: "很"
使用缓存: K₁, K₂, V₁, V₂
计算: K₃, V₃ for "很" → 加入缓存
生成: "好"
使用缓存: K₁, K₂, K₃, V₁, V₂, V₃
计算: K₄, V₄ for "好" → 加入缓存
⚙️ 显存占用计算
# KV Cache 显存占用公式
Memory = 2 × num_layers × seq_len × num_heads × head_dim × dtype_size
# 以 Llama-2-70B 为例:
num_layers = 80
num_heads = 64
head_dim = 128
dtype_size = 2 (FP16)
# 每个token的KV Cache:
per_token = 2 × 80 × 1 × 64 × 128 × 2 = 2.6 MB
# 4096 token长度的KV Cache:
total = 2.6 MB × 4096 ≈ 10.4 GB
# 这就是为什么长上下文需要大量显存!
💻 代码示例:vLLM中的KV Cache
from vllm import LLM, SamplingParams
# vLLM自动管理KV Cache,包括PagedAttention
llm = LLM(model="Qwen/Qwen2-7B")
# 批量推理时,KV Cache被高效共享
prompts = [
"什么是机器学习?",
"解释一下深度学习",
"神经网络是什么",
]
sampling_params = SamplingParams(
max_tokens=100,
temperature=0.7,
)
# vLLM的PagedAttention优化KV Cache内存使用
outputs = llm.generate(prompts, sampling_params)
for output in outputs:
print(f"Prompt: {output.prompt}")
print(f"Generated: {output.outputs[0].text}")
🚀 KV Cache优化技术
📄
PagedAttention
vLLM的分页管理
⚡
FlashAttention
IO感知的注意力
🗜️
KV Cache量化
FP16→INT8压缩
🔄
Prefix Caching
共享前缀缓存
✅ 总结
| 优点 | 大幅减少计算量,加速生成 |
| 代价 | 占用显存(与序列长度成正比) |
| 关键优化 | PagedAttention、量化、共享 |
🔗 相关术语
Transformer(注意力机制) · 推理(Inference) · Context Window(上下文窗口) · 量化(Quantization) · 投机解码 · LLM(大语言模型) · Memory(记忆)