KV 缓存是什么
自回归生成时,模型每产出一个 token 都要重新用到前面所有 token 的注意力键值。为了避免重复计算,这些中间结果被缓存下来,就是 KV 缓存。它随序列长度、层数、键值头数、精度与并发序列数增长,在长上下文与高并发下可以超过权重占用的显存,是线上容量问题最常见的来源。
量级直觉
量级直觉
# 单个 token 的 KV 字节数(2 对应键与值两组张量)
bytes/token ≈ 2 × 层数 × 键值头数 × 头维度 × 精度字节数
# 一条序列的 KV
序列 KV = bytes/token × 序列长度
# 并发后总量按并发序列数放大
KV 总量 = 序列 KV × 并发序列数
# 用分组查询注意力的模型按键值头数计算,而不是注意力头数四个驱动变量
- 序列长度:上下文越长,每条序列的 KV 越大,且是线性增长
- 并发序列数:同时在处理的请求越少,单条可用空间越大
- 模型结构:层数与键值头数决定每 token 的基础开销
- 缓存精度:降低 KV 精度能显著省显存,但要回归输出质量
变量的实际影响
| 变量 | 调大后的影响 | 常见处置 |
|---|---|---|
| 上下文上限 | KV 池被一次性预留,可用并发下降 | 按业务高水位设置,而不是模型上限 |
| 并发请求数 | 显存占用线性上升 | 限制在途请求数,超出部分排队 |
| 缓存精度 | 占用下降但质量可能变化 | 用固定评测集验证后再上线 |
| 模型结构 | 决定每 token 的基础开销 | 选型阶段就要纳入容量评估 |
服务端引擎普遍用分页方式管理 KV:按固定大小的块分配,块可以在请求之间复用,浪费从整块级降到块内,这是高并发下显存利用率明显改善的原因。
只按权重估显存是容量规划里最典型的误判:长上下文高并发时 KV 缓存占比可能反超权重,必须一起核算。