首页/AI/大模型部署与运维速查/KV 缓存公式:逐项拆解

KV 缓存公式:逐项拆解

KV 总量 = 每 token 字节数 × 序列长度 × 并发序列数;每 token 字节数 = 2 × 层数 × KV 头数 × 头维度 × 精度字节(2 对应 K 与 V 两组张量)。

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_bytesFP16 约 2 字节,INT8 约 1 字节,四位约 0.5 字节

常见算错点

环节容易错成后果
头数口径用注意力头数代替键值头数估算偏大数倍,容量规划过于保守
键值倍数漏乘 2估算直接差一倍,并发上限算错
精度口径KV 与权重用不同精度却按同一口径算估算偏差,边界机型上直接溢出
单位口径十进制与二进制混用差近百分之七,刚好吃掉安全余量

典型使用场景

  • 容量规划:先算每 token 开销,再按目标上下文推并发上限
  • 参数取舍:比较缩短上下文与降低 KV 精度两种省显存方案的效果
  • 排查溢出:反推当前配置在目标长度下的理论占用,与实际用量对照
  • 模型对比:同参数量不同结构模型的 KV 开销差异,直接影响并发能力
  • 报价与方案输出:给客户算可承载并发时,KV 是必须写明的一项
公式给的是理论值:实际占用还要加上块粒度对齐、碎片与运行时缓冲,落地按理论值乘一个折扣系数更稳妥。
分组查询注意力的模型务必用键值头数:这个口径搞错是最常见的估算失败原因,会让结论偏出数倍。

易错点

  • 漏乘键值两份:估算差一倍,窗口与并发规划都要返工
  • 用注意力头数代替键值头数:分组查询注意力模型上会严重高估
  • 用平均长度算并发:长请求扎堆时直接触发抢占,必须用长度分布的高水位
  • 把理论值当承诺值:块对齐与碎片会打折,落地要留余量
  • 忽略缓存精度的影响:降低 KV 精度是省显存的有效手段,不纳入对比会漏掉更优方案

数据来源与参考

  • vLLM 官方文档:KV 缓存与 PagedAttention(docs.vllm.ai)
  • Hugging Face 模型配置文档(huggingface.co/docs)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌