论文:
https://arxiv.org/html/2401.09670v1
博客:
https://hao-ai-lab.github.io/blogs/distserve/
中文翻译:
Goodput: 满足用户时延要求的request/秒;有可能小于throughtput;
Continue batching, 新的request的prefilling耗时太长,使得同batch的老request延迟明显增大:
解决方案:
干Prefilling的GPU,和干Decoding的GPU,分开,各做各的;
调整灵活:如果input prompt长,那就增加Prefilling的GPU数目;如果output sequence长,那就增加decoding的GPU数目;
开销:KV-Cache在2个阶段的GPU之间传输。但,该开销<1个token的decoding耗时,很小。
局限性:只要得有2个GPU,1个GPU玩儿不转。
在trtllm build的int8 LLama70B模型上,单卡,实测延迟:
1000个字的prefilling: 1秒10个字的decoding: 0.1秒
结论:平均到一个字,prefilling大约比decoding快10倍
DistServe论文
结论:将Prefilling和Decoding分离,可以获得更高的goodput。
背景知识:1. Prefilling是Compute-bound的;2. Decoding是Memory-bound的;
好处1:分离,可以在两阶段使用不同的batching策略;
prefill阶段:随着batch size的增加,吞吐量的增长趋势却趋于平缓。这正是因为prefill阶段是compute-bound的,当batch中的总tokens数大于一个阈值的时候,prefill阶段产生compute-bound,使得吞吐量的增长趋势变缓。
decode阶段:随着batch size的增加,吞吐量的增长趋势越来越显著。这是因为decode阶段是memory-bound的,即相比于计算,读写数据的时间要更多。所以在decode阶段中,如果我们能提升batch size,就能把计算强度提起来,吞吐量就上去了。好处2:分离,可以在两阶段使用不同的tp/pp模型并行策略。
(1)对prefill和decode分别做goodput最大化,也就是对他们分别寻找最佳的并行策略(确定一个实例/一个模型副本要怎么分割)
(2)根据系统中的流量大小确定prefill/decode各自要部署多少个实例,然后按照(1)中确定的并行方式做实例部署如何确定prefill、decode阶段的tp/pp数目?答:网格搜索,尝试,取最优的goodput那个:
VLLM中,PD分离叫做"disaggregated prefilling"
PD分离的优点:
1. 可以独立的调优prefill架构和decode架构。用不同的TP、PP并行策略。通过增加实例数,达到任务所需的TTFT和TPOT。
2. 可以很好的控制decode阶段的运行不被新到的prefill所大大延后。进而提升了Goodput。(调优chunked-prefill也可达到同样目的,但chunk-size较难调到最优)。