Skip to content

动态批处理与推理调度 ​

网关可以同时接收很多会话,但每条会话的最终结果仍要经过角色、声纹和解码调度。入口并发、正在执行的序列数、声纹批次行数是三个量,调大其中一个不会自动提高整条链路吞吐。

找出真正排队的一层 ​

将末音到 Final 拆为边界确认、排队、必需模型关键路径、有序发布和传输。每个任务记录 enqueue/start/end;角色与 ASR 并行时取依赖关键路径,不把所有模型耗时相加。

一次目标识别并发对照中,网关 Final 容量已有余量,解码进程仍只允许少量序列同时运行。增加网关 worker 没有消除长尾;提高目标解码的动态序列上限才缩短等待。这说明 final concurrency 不等于解码器实际并发。

若 N 个近似等长任务同时到达,解码最多执行 B 个,理想化波次数为 ceil(N / B)。实际连续批处理会在序列结束后补入新任务,长短句、编码开销和 KV cache 决定真实等待。这个公式只用于定位波次放大,不能作为容量承诺。

单进程动态序列调度 ​

当前方案优先使用一个目标解码进程,共享模型权重,并提高可执行序列上限。--max-num-seqs 是上限,低并发时不需要等待凑满批次。它也不等于所有模型算子都使用同一固定 batch。

bash
# vLLM 类运行时的参数片段;仅示意序列调度上限
--max-num-seqs 8

一次固定模型与输入的阶梯对照将上限从 4 调为 8:32 路负载下,尾帧到 terminal 的 P95 约从 7.2 秒降为 3.7 秒;单路约为 1.0 秒,基本不变。此结果说明减少排队可以保留低并发体验,但它是会话收尾指标,不是逐句末音到 Final,也没有证明任意长上下文同样改善。

复制多个模型进程会重复权重、缓存和初始化,容易先耗尽设备内存。只有单实例无法满足吞吐,且有独立资源预算、路由与压测证据时,才考虑多副本。增加 max-num-seqs 也要测设备峰值、OOM、成功率及持续负载,不能无限加大。

各模型采用自己的批次策略 ​

模块调度对象主要预算
网关会话与封口段接收缓冲、in-flight、等待时限
角色模型上下文窗口worker 数、窗口长度、身份状态
声纹模型音频特征与参考比较图支持的 batch/长度、共享 worker
普通与目标解码活跃生成序列序列上限、输入 token、KV cache
热词召回音频编码与词库检索实时预算、池快照、管理隔离

静态编译图的 batch 行数不等于网关连接数。小批次补齐时,填充行不得生成真实会话结果或污染状态;动态长度也必须满足模型清单中的 shape 范围。模型、运行库和 shape 清单需要成套更新。

截止时间与负载保护 ​

请求从进入任务队列时就携带绝对 deadline。角色等待、声纹、召回、解码和重试共同消耗剩余时间,不能每一层重新得到完整超时。可选召回只使用部分预算,为必需解码留出时间。

text
remaining = deadline - monotonic_now
remaining <= 0:直接结束,不开始新推理
可选依赖预算:min(依赖上限, remaining - 必需阶段预留)
重试:保留原 deadline 和原任务输入

队列满时按协议拒绝、背压或明确降级。Preview 可被更新版本替代,Final 对应已接受音频,应优先保留资源。连接断开后原生任务可能仍在运行,必须跟踪退出才能回收预算,不能仅清空 Go 对象就重新放行同一份设备容量。

冷态与热态分别测量 ​

健康接口通过不代表所有波形长度和执行图已预热。用代表性音频走实际子进程、动态库和模型路径,分别测冷启动首轮、热态单路、阶梯并发及持续混合长短句。动态库搜索路径选到旧文件时,即使 worker 可执行文件更新,实际预热与推理也可能仍使用旧实现。

每档统计总数、成功、拒绝、超时和错误,再统计成功请求的 P95/P99。观察队列是否持续增长、设备内存是否回落,不能只报告成功时延。普通、目标和多人模式分别测试,目标正负例还要确认门控没有因并发而绕过。

诊断 IO 的锁范围 ​

压缩音频诊断包属于 CPU/IO 工作,不应占用全局会话保存锁。先冻结数据,在锁外压缩,最后在短临界区原子发布索引并更新配额。清理器只能看到完整发布对象;下载接口不能读到半成品。降低压缩级别需要比较体积与内容一致性,不能把压缩阶段收益直接算成推理收益。

别急,先让缓存热一下。