在线服务的显存告急,不一定是模型权重太大,也可能是并发请求留下的KV缓存超出预期。大模型在线服务的KV缓存容量规划,不能只按最大上下文长度乘以请求数:请求会陆续进入和结束,输入、输出长度也不同。静态预留便于控制上限,动态分配更能适应负载波动,但两者都需要基于真实流量校准。
先把每个令牌的缓存成本算出来
估算单条序列的KV缓存,可使用近似公式:缓存字节数=2 × 层数 × KV头数 × 每头维度 × 每个元素字节数 × 缓存令牌数。系数2对应键和值;计算结果不含缓存块管理、对齐等开销,因此适合做基线,不等于设备上的精确占用。
以公开配置中的Qwen2.5-7B为例,按28层、4个KV头、每头128维和BF16缓存计算,每个令牌约占56 KiB;单条序列缓存4096个令牌,理论上约为224 MiB。实际部署还要核对所用模型配置、缓存精度和推理框架实现。大模型在线服务的KV缓存容量规划应从模型结构开始,而不是直接套用其他模型的容量数字。
静态预留与动态分配,差别在于如何管理余量
| 方式 | 优势 | 边界与适用条件 |
|---|---|---|
| 静态预留 | 预先划定缓存池或每请求预算,容量上限清楚,负载稳定时较容易保障延迟。 | 按过长上下文或过高并发预留,会让空闲空间无法充分利用;适合请求形态稳定、需要明确资源隔离的服务。 |
| 动态分配 | 请求按实际生成和缓存需求占用空间,长短请求混合时通常更灵活。 | 高峰时仍可能耗尽缓存;缓存块管理、碎片和回收时机也会影响可用容量。适合负载变化明显且系统具备相应管理能力的场景。 |
动态分配不等于可以超额承诺:同时活跃的长请求依然会争用显存。静态预留也不意味着每个请求都必须占满最大上下文对应的空间,具体行为取决于服务框架。比如vLLM采用PagedAttention管理KV缓存块,可减少连续内存分配带来的浪费,但不能消除总显存上限。
按线上负载规划:从观测到限流
- 核对可用预算。从设备显存中先扣除模型权重、运行时和其他必要占用,再为缓存设置上限;保留安全余量,避免把理论显存全部分给KV缓存。
- 收集请求分布。分别统计活跃并发、输入令牌数、输出令牌数和请求持续时间,关注高分位数及峰值时段。平均长度可能掩盖少量长上下文请求的影响。
- 换算缓存需求。使用模型配置和缓存精度计算单令牌成本,再结合并发序列的实际缓存长度估算总量。可将不同请求长度分档测算,而非假定每个请求都达到最大上限。
- 压测并调整策略。逐步提高并发,观察缓存占用、排队、请求拒绝和延迟。若显存余量充足但缓存池常闲置,可测试扩大动态池;若高峰频繁触顶,应先降低并发或限制单请求上下文,再评估增加资源。
还可用前缀缓存复用相同提示前缀的计算结果,但只有前缀确实重复时才有收益;它改变的是缓存复用情况,不应当作确定的容量折扣。准入控制则可在缓存预算接近上限时延后或拒绝新请求,避免现有请求被挤压。
常见问题
最大上下文长度是否等于缓存容量?
不是。它限制单条请求可处理的长度;总缓存还取决于同时活跃的请求及其实际长度。
怎样判断该选静态预留还是动态分配?
负载稳定、隔离要求明确时优先评估静态预算;请求长度和并发起伏较大时,可评估动态管理,并配合准入控制。

压测时最该观察什么?
除显存外,还要记录缓存占用、排队、拒绝率和延迟,并覆盖长短请求混合及高峰并发。
归根结底,大模型在线服务的KV缓存容量规划需要以模型结构和请求分布为依据,再用压测验证安全边界。静态预留换来可预期,动态分配换来弹性;合理方案往往是明确总预算,同时依据负载设置分配和准入规则。


