最近看了几篇关于网关和PD分离的论文,分享下个人想法。在网关、P、D这三者之中,P是最重要的。因为:
- Prefill阶段决定了time-to-first-token
- PD分离的效果很大程度上受限于kvcache的传输的代价(kvcache是以GB为单位的,跑RDMA也需要100毫秒级的时间)。而kvcache主要是P产生的。
由于P主导了kvcache的传输,所以最佳的D是由P选择的。对于网关,就只需要选择最佳的P。整个系统是网关到P到D。
那么接下来讨论如何选择最佳的P。这里先不考虑kvcache命中的事情,即最佳的P是空闲的P。
https://arxiv.org/html/2408.08147v1#S3 里提到网关通过在给定时间内反复重试不同的P来找到空闲的P(见 3.5 On-demand Forwarding for Idle Prefill 一节)。但这种做法的问题在于网关和P的数目差别不能太多。因为单次重试的时间取决于网络延时,难以通过优化网关来减少。如果一个网关需要对应几十台P,显然没办法把它们都重试一遍。延长总重试时间则与减少TTFT的目标相违背。然而P作为计算密集型,网关作为IO密集型,它们之间天然会出现单网关对应大量P的情况。
另一种思路是P上报相关的metric,网关根据metric来找到最佳的P。但只根据metric会有惊群的风险。因为每个网关看到的metric是一样的,他们找到的空闲的P也是一样的。提高metric上报的频率(比如收到新的任务就上报)可以减少惊群的影响(因为减少了不同时间内每个网关看到同样metric的可能性)。但无法根除惊群。
如果消灭惊群,那么引入一个全局组件也许是个办法。由一个具有全局视角的组件来分配任务是最公平的。当然全局组件固有问题就要考虑下了:
- 高可用(这种组件读写都多,主写从读可能还不够。当然不同阶段下具体问题具体分析……)
- 延迟(网关侧和P侧各有一次调用,不过TTFT单位是100毫秒级,同集群两次调用对比起来其实还好,吧?)
- 性能(推理的 QPS 都不高,所以性能要求也其实还好,吧?)
如果考虑kvcache命中,那么网关和P将更加紧密。Context cache作为实打实可以减少推理成本的方式,凡是做AI网关都是绕不过的。而context cache的形态其实是由cache kvcache的方式决定的(注意中间的cache是动词)。大部分推理服务都是通过公共prefix来cache kvcache cache(比如vllm的APC),所以context cache就主要看prefix。如果某些业务只会调度到某些P上面,就意味着context cache里的cache id会跟着业务走。另外P上说不定会有prefix之外的形态,比如https://arxiv.org/html/2410.15332v1。
总而言之,在设计AI网关时,需要从整体来看网关在推理链路里的角色。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。