KV Cache 准入与淘汰:在显存耗尽前控制长会话和优先级
KV Cache 不是先到先得的剩余显存。本文从请求级显存估算、租户预算、块式分配、抢占代价和前缀隔离设计可测量的准入与淘汰控制面。
本文要点
- 主题聚焦:AI、大模型、DevOps
- 适合人群:独立开发者、全栈工程师、AI 应用开发者
- 核心价值:快速理解背景、实践路径、常见误区和工程建议
KV Cache 把历史 token 的注意力键值留在显存,避免解码时重复计算,但它也让每个活跃序列成为一项持续增长的资源承诺。若服务只在显存真的不足时处理 OOM,一个超长会话就可能让同批短请求一起失败;若一律先到先得,离线低优先级任务又会占满交互池。可靠控制必须在请求进入执行队列前估算、预留和限额。
在准入前计算最坏承诺
估算至少使用模型层数、KV head 数、head dimension、缓存数据类型、输入长度和允许输出上限。理论字节数可作为起点,但实际运行时还存在块大小取整、页表、对齐、张量并行、副本工作区和碎片化。平台应通过目标模型与硬件压测校准一个 bytesPerToken,并保留安全系数;不能把权重加载后的“剩余显存”全部算成可售容量。
请求到达后,服务端重新编码得到输入 token,检查 input + max_new_tokens 是否超过模型和租户上限,再预估需要的 KV 块。客户端不提供输出上限时使用保守默认值,不能假设用户很快停止。准入控制返回三种明确结果:立即执行、进入有截止时间的队列、因配额或容量拒绝。无限排队只会把 OOM 换成超时。
kvPoolGiB: 52
blockTokens: 16
hardWatermark: 0.92
admissionWatermark: 0.82
interactiveReserve: 0.25
tenantMaxShare: 0.15
queueDeadlineMs: 8000
maxNewTokensDefault: 1024
这些值必须绑定模型 digest、运行时版本和 GPU SKU。模型结构或缓存 dtype 改变后重新压测;沿用旧的每 token 估算会制造虚假余量。GPU 推理容量规划 负责推理池总容量,本策略进一步决定单个请求是否值得占用其中的 KV 块。
配额要约束正在增长的序列
QPS 无法代表 KV 压力。按租户同时限制预留 token、活跃序列、最长上下文与累计 GPU 时间,并把输入已用量和输出剩余额度一起记账。交互、批量和系统关键流量使用独立预算;高优先级只能由可信服务端身份赋予。更完整的租户计费与原子配额可参考 AI 平台租户配额隔离。
调度器还要在每个解码步修正承诺:请求正常结束或取消,立即释放块;输出接近上限,剩余预留同步下降;连接断开则传播取消信号,不能继续生成到最大长度。排队指标至少包括按优先级的等待数、预计等待时间、被拒 token、已预留/已使用块、碎片率和取消后释放延迟。
前缀共享能省显存,却不能突破安全边界。共享键包含模型、tokenizer、adapter、聊天模板和精确 token 前缀;私有提示还必须包含租户及权限版本。不同租户即使文本相同,也只有在数据明确为公共且策略允许时才能共享。应用结果缓存与 KV Cache 的语义不同,Prompt 缓存设计 中的版本键原则可以复用,但绝不能把语义相似当作 KV 前缀相同。
淘汰应衡量恢复代价
达到回收水位后,不要随机删除活跃序列。候选排序至少考虑优先级、截止时间、已等待时间、剩余输出、重新 prefill 成本、租户超额程度、是否可恢复,以及共享前缀的引用数。优先回收可重放的离线任务、超过租户软额度且尚未开始的请求;已向用户流式输出的交互会话只有在系统生存受威胁时才抢占。
对支持抢占并重算的运行时,状态机明确区分 waiting、running、preempted、recomputing 和 finished。同一请求的 GPU 时间、重算次数与截止时间跨状态保留,避免被抢占后重新排到队首形成无限消耗。共享前缀块必须引用计数归零才能释放,否则会破坏仍在运行的序列。
压力策略可以设为:使用率 82% 后停止接收低优先级长请求,88% 后暂停批量 prefill,92% 后抢占可恢复任务;任意租户最多占池的 15%。但水位之间要留出至少一个最大调度周期的增长空间,并用真实长输出校准。Kubernetes 的优先级与抢占思想可以参考,实际 KV 决策仍须由理解 token 生命周期的推理调度器完成。
用故障演练证明策略有效
回放至少包含短问答、32K 长输入、长输出、共享前缀、取消风暴、单租户突发和批任务混合。逐渐增加负载直到拒绝发生,验证进程不 OOM、关键流量 SLO 仍满足、低优先级得到明确错误且显存能回落。再故意杀死 worker,确认未完成请求不会在另一副本重复占用旧预留。
上线门禁可要求:压力窗内 OOM 为零,取消后 P99 两秒内释放预留块,关键交互 P95 首 token 不超过 900ms,任一租户实际份额不超硬上限,抢占任务最终完成率高于 99%。与 LLM 批量推理 共用 GPU 时,还要验证离线队列在高峰停止、低峰恢复而不形成饥饿。
若新策略造成尾延迟或错误拒绝,回滚到旧调度配置 digest,同时保留较低的全局准入水位;不要关闭准入控制回到无限接收。回滚后用请求长度、预留误差和淘汰原因复盘,是估算偏差、优先级规则还是运行时释放缺陷。可靠的 KV Cache 管理最终表现为可预测的拒绝与降级,而不是偶发 OOM 后重启进程。
延伸阅读
Related