KV 缓存公式逐项拆解
KV 总量的计算链条很短,但要每一项都对上号:先算每个 token 占多少字节,再乘序列长度得到单条序列的占用,最后乘并发序列数。每 token 字节数由四件事决定:层数、键值头数、头维度与精度字节数,前两个容易搞错,后面两个容易和权重口径混用。
计算链
计算链
# 每 token 字节数(2 表示键与值两组张量都要存)
bytes/token = 2 × layers × kv_heads × head_dim × dtype_bytes
# 单条序列的 KV
seq_kv = bytes/token × seq_len
# 叠加并发
kv_total = seq_kv × concurrent_seqs
# 例:7B 级模型 32 层、键值头 8、头维度 128、FP16
# bytes/token = 2 × 32 × 8 × 128 × 2 = 131072 字节 ≈ 128 KiB参数从哪来
| layers | 配置里的层数字段 |
|---|---|
| kv_heads | 键值头数字段,分组查询注意力必须用这个 |
| head_dim | 配置里的头维度,或隐藏维度除以注意力头数 |
| dtype_bytes | FP16 约 2 字节,INT8 约 1 字节,四位约 0.5 字节 |
常见算错点
| 环节 | 容易错成 | 后果 |
|---|---|---|
| 头数口径 | 用注意力头数代替键值头数 | 估算偏大数倍,容量规划过于保守 |
| 键值倍数 | 漏乘 2 | 估算直接差一倍,并发上限算错 |
| 精度口径 | KV 与权重用不同精度却按同一口径算 | 估算偏差,边界机型上直接溢出 |
| 单位口径 | 十进制与二进制混用 | 差近百分之七,刚好吃掉安全余量 |
典型使用场景
- 容量规划:先算每 token 开销,再按目标上下文推并发上限
- 参数取舍:比较缩短上下文与降低 KV 精度两种省显存方案的效果
- 排查溢出:反推当前配置在目标长度下的理论占用,与实际用量对照
- 模型对比:同参数量不同结构模型的 KV 开销差异,直接影响并发能力
- 报价与方案输出:给客户算可承载并发时,KV 是必须写明的一项
公式给的是理论值:实际占用还要加上块粒度对齐、碎片与运行时缓冲,落地按理论值乘一个折扣系数更稳妥。
分组查询注意力的模型务必用键值头数:这个口径搞错是最常见的估算失败原因,会让结论偏出数倍。