💾

KV Cache

键值缓存 / Key-Value Cache

📖 什么是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、量化、共享

📖 相关导航

← 返回术语百科 | 首页 | 文章 | 专题