KV Cache = 自回归解码时把已生成 token 的 Key/Value 向量缓存起来、避免每步重复计算历史 attention 的推理显存结构。每步解码只需计算新 token 的 Q,与缓存的历史 K/V 做 attention,新 K/V 追加进缓存。缓存显存公式(每元素 FP16 占 2 字节):
KV Bytes=2⋅2⋅nlayers⋅nkv_heads⋅dhead⋅s⋅b —— 第 1 个 2 = K 与 V 各一份,第 2 个 2 = FP16 每元素 2 字节,
s = 序列长度,
b = batch。数值例 (LLaMA-3 70B: 80 层、GQA 8 个 KV heads、
dhead=128,32K 上下文、8 并发):
2×2×80×8×128×32768×8≈85.9 GB≈86 GB;若换回同规模 MHA(64 个 KV heads)则约
687 GB —— 正好差
64/8=8 倍,这就是 GQA 压缩 KV 的直观收益。PagedAttention (vLLM): KV 不再按连续长数组预分配,而是切成固定大小的 block(默认每块 16 个 token,即
16×nkv_heads×dhead 个元素),用页表 (block table) 记录逻辑位置 → 物理块映射,像操作系统分页一样按需分配: 消除内部碎片(静态预分配超出实际生成长度)与外部碎片(不同长度序列交错、先来后走导致空闲空间无法拼接),并把「预留显存」降到几乎为 0,显存利用率从连续分配的约 60-80% 提升到接近 100%。