大模型服务为什么需要准入控制?
简化版
大模型请求的输入长度、最大输出和 KV Cache 占用差异很大。没有准入控制时,流量一旦超过安全容量,队列会持续增长,已接收请求也会超时,最终出现 OOM、重试风暴和级联故障。
准入控制在执行前根据队列 Token、KV 水位、预测计算量、租户配额、优先级和截止时间,决定接收、排队、降级或快速拒绝。核心目标不是拒绝用户,而是保护 SLO:让系统在过载时可预测地少接,而不是不可控地全部失败。
详细版
普通按 QPS 限流不够,因为一个 16K Prompt 与一个 100 Token Prompt 的成本不同。更合理的是 Token/资源加权准入:估算 prompt_tokens + max_new_tokens、预计 KV 块和服务时间,并结合当前可用容量判断。
request -> validate -> estimate cost -> quota/SLO check
| accept -> scheduler
| queue -> bounded waiting
| degrade-> smaller model/shorter budget
| reject -> retry-after
策略要设置有界队列与截止时间,并按租户隔离配额。线上监控准入率、排队 Token、预测误差、拒绝原因、超时、OOM、P99 和重试率;灰度验证高峰下已接收请求的成功率是否提高。
完整版教学
1. 为什么无限排队会让系统雪崩
当请求到达率长期超过服务率,队列只增不减。请求等待超过客户端超时后,客户端可能重试,新增流量进一步扩大过载;GPU 仍可能计算已经无人等待的结果。
过载 -> 排队变长 -> 客户端超时 -> 重试增加
^ |
+----------------------------------+
准入控制要在这个正反馈形成前限制进入系统的工作量。
2. 为什么 QPS 不能表示 LLM 负载
LLM 请求成本与输入 Token、输出 Token、模型、并行策略和缓存命中相关。相同 10 QPS,短分类任务可能很轻,长上下文生成可能直接耗尽 KV。
因此控制量应更接近资源:Prefill Token、活跃序列、缓存 Token、预计 Decode Token 和 GPU 时间。QPS 仍可作为防攻击上限,但不能独立承担容量控制。
3. 准入要估算哪些成本
请求到达时已知 Prompt Token,输出长度通常只知道上限或历史分布。可计算保守估计:
estimated_work = a × prompt_tokens
+ b × expected_output_tokens
estimated_kv = bytes_per_token × (prompt_tokens + output_budget)
系数应从目标模型的 Profile 校准。对高风险流量用高分位输出估计,对可降级任务可用期望值并设置运行时硬上限。
4. 准入决策有哪些结果
准入不是只有接受与拒绝。常见动作如下:
| 动作 | 适用情况 | 注意事项 |
|---|---|---|
| 立即接收 | 资源和 SLO 余量充足 | 仍需运行时预算 |
| 有界排队 | 短时突发、截止时间允许 | 超过截止时间要移除 |
| 降级 | 可接受小模型或短输出 | 明确质量差异 |
| 路由 | 其他实例池有余量 | 考虑网络与缓存局部性 |
| 快速拒绝 | 已无可能按时完成 | 返回可解释错误和重试建议 |
快速拒绝通常比接收后超时更节省资源,也便于上游采取替代方案。
5. 怎样设置有界队列
队列上限可按请求数、等待 Token 或预测 GPU 毫秒设置,其中资源加权指标更稳。每个请求还应有绝对截止时间;即使队列未满,预测完成时间超过截止时间也不应接收。
队列太短会把可吸收的瞬时突发直接拒绝,太长则掩盖容量不足。应依据流量突发宽度和业务最大等待时间压测确定。
6. KV 水位为什么是关键约束
模型权重固定,但活跃请求 KV 会随生成增长。只看当前空闲显存可能过度接收,因为已运行请求还未达到其输出预算。
准入时要为在途请求预留预计增长空间,并设置高、低水位形成迟滞。例如超过高水位停止普通请求,降到低水位后再恢复,避免开关频繁抖动。
7. 租户配额如何设计
全局容量足够不代表公平。单一大客户可用长请求占满队列,使其他租户无法进入。可分别设置并发、每分钟 Token、KV 占用和优先级配额。
配额允许短时突发,但持续使用应受令牌桶速率约束。公共保底池可以利用闲置资源,同时要防止借用资源变成永久承诺。
8. 优先级不能只靠标签
若高优请求无限涌入,低优请求会永久饥饿。调度可结合优先级、等待时间老化和截止时间;准入则为不同等级保留容量或设置最大份额。
优先级应来自可信身份和业务规则,不能让客户端任意声明。否则所有请求都会标成最高等级,控制失效。
9. 怎样做优雅降级
可选降级包括缩短最大输出、减少检索文档、路由到小模型、关闭非必要多采样或转为异步任务。任何降级都必须在产品协议允许范围内,并让调用方知道结果类型变化。
不能在不告知的情况下截断关键证据或降低安全校验。高风险任务宁可拒绝或转人工,也不应为了容量隐式牺牲安全边界。
10. 如何避免重试风暴
拒绝响应应包含明确错误码与 Retry-After,客户端采用指数退避和随机抖动。服务端还可为幂等请求使用请求 ID 去重,避免网络重试重复执行。
若所有实例同时按固定周期恢复,客户端会在同一时刻再次冲击。随机抖动与全局负载信息有助于打散重试。
11. 预测不准怎么办
输出长度不可知,成本模型一定有误差。应记录预测值与实际 Prompt、输出、执行时间的差异,按任务和租户持续校准。
运行时仍要有硬预算:达到最大输出、截止时间或租户 Token 上限就停止或安全收尾。预测负责提高利用率,硬限制负责守住资源边界。
12. 如何评估准入策略
用真实长度分布制造平稳、阶跃、尖峰和热点租户流量,对比无准入基线。重点不是“拒绝率越低越好”,而是已接收请求的按时完成率和系统稳定性。
至少报告 P95/P99、成功率、主动拒绝、排队超时、OOM、客户端重试和单位成功成本。过载时主动拒绝略增、超时和 OOM 大幅下降,通常是正确结果。
13. 上线与故障兜底
先用影子模式只记录“本应拒绝”的决策,验证估算和租户影响;再灰度启用并限制最大拒绝比例。配置必须版本化,支持立即切回保守阈值。
容量服务或全局配额依赖故障时,采用本地保守上限,而不是默认无限接收。控制面不可用不能演化为数据面过载。
准入控制的成功标准,是在容量不足时仍能兑现对已接收请求的承诺。
14. 常见误区与追问
- 误区:有自动扩容就不需要准入。 模型冷启动慢,突发期间仍需保护现有容量。
- 误区:按 QPS 限流足够。 LLM 请求的 Token 与 KV 成本差异巨大。
- 误区:队列越长,拒绝越少。 长队列会把拒绝变成更昂贵的超时。
- 误区:拒绝率为零才是高可用。 过载时快速拒绝能保护整体成功率。
- 误区:客户端声明的优先级可以直接信任。 优先级必须由可信身份和服务端规则决定。
- 追问:如何设置输出预算? 用任务历史分布的高分位估计,并保留运行时硬上限。
- 追问:为何设置高低水位? 迟滞可防止准入状态在临界点频繁切换。
15. 加强记忆
- 先记原因:过载会形成排队、超时、重试的正反馈。
- 再记计量:不能只看 QPS,要看 Token、KV 和预计时间。
- 再记动作:接收、排队、降级、路由、快速拒绝。
- 再记边界:有界队列、截止时间和运行时硬预算。
- 再记公平:租户配额、可信优先级和保底份额。
- 再记防护:Retry-After、退避抖动、幂等去重。
- 最后记验收:看已接收请求成功率,而不是盲目追求零拒绝。