为什么要做PD分离
定义
整个LLM
推理过程由Prefill
和多轮迭代的Decode
组成:
-
计算密集型的
Prefill
阶段,LLM
处理所有用户的input
,计算出对应的KV Cache
。 -
显存密集型的
Decode
阶段,顺序的产生一个个的token
,每次访存只计算一个token
。
指标
Prefill性能评估指标
-
TTFT(Time To First Token)
表示生成第1
个token
所用的时间P90 TTFT SLO = 0.4s
,意味着我们对该系统的要求是:90%
的request
的TTFT
值都必须<=0.4
Decode性能评估指标
-
TPOT(Time Per Output Token)
表示产出每一个response token
所用的时间P90 TPOT SLO = 0.04s
,意味着我们对该系统的要求是,在90%
的request
的TPOT
值都必须<=0.04s
。 -
TBT(Token By Token)
表示增量Token
时延,即连续生成两个token
之间的时间间隔。这是衡量用户体验流畅度的重要指标,TBT
越稳定,用户感知到的响应就越连贯。在PD分离架构中,保持稳定的TBT
是一个关键目标。
Continuing Batching
-
Prefill
阶段:因为Prefill
阶段是计算密集型,随着Batch Size
的增加,算力受限,吞吐量的增长趋势趋于平缓。 -
Decode
阶段:因为Decode
阶段是带宽、内存密集,随着Batch Size
的增加,吞吐量的增长趋势越来越显著。
想要在Decode
阶段实现Continuing Batching
的前提是,每个被调度的request
需要空闲算力完成Prefill
计算。按现有的部署模式,当Prefill
和Decode
部署在一起时,当有新的Prefill
请求时,会被优先处理,从而导致Decode
的执行流程被影响,增量Token
时延(TBT
)无法得到有效保障。
例如下图,当request5
或request6
到来时,系统可能会优先执行request5
或request6
的Prefill
,此时request2/3/4
的响应时延会受到一定影响,从而导致TBT
不稳定。
在实际的深度学习模型部署中,由于Prefill
和Decode
两阶段的计算/通信特征的差异特点,为了提升性能和资源利用效率,通过PD
分离部署方案将Prefill
和Decode
分别部署在不同规格和架构的集群中,并且配合服务层的任务调度,在满足TTFT
和TBT
指标范围内,结合Continuous batching
机制尽可能提高Decode
阶段的batch
并发数,在提供更好用户体验的前提下,提升算力利用率。
基于该方案,结合下图可以看到Prefill
和Decode
的执行互不影响,系统能够提供给用户一个稳定的TBT
。
PD分离带来的优势
在long context
背景下,Prefill
和Decode
阶段对计算和显存的需求非常不平衡。PD分离架构能够带来以下显著优势:
资源分配与利用的优化
-
充分利用异构设备资源:
Prefill
阶段计算密集,可采用高算力的GPU
(如A100
、H100
等高端计算卡);而Decode
阶段显存密集,可采用低算力大显存的GPU
(如大内存的L40
等)。这种分配方式能够显著降低硬件成本,提高资源利用率。 -
动态资源伸缩:可以根据负载情况独立地为
Prefill
和Decode
集群进行扩缩容,在高峰期可以为瓶颈阶段分配更多资源,提高系统的弹性和成本效益。
性能指标的优化
-
分开优化,同时提升多项指标:在
Prefill
阶段应该限制Batch Size
大小以减少TTFT
,而在Decode
阶段则应该增大Batch Size
以提高并发处理能力。这种分离优化策略能同时改善TTFT
和TPOT
指标,而不必在两者之间做折中。 -
稳定的TBT保障:通过将
Prefill
和Decode
分离,新请求的Prefill
计算不会占用Decode
阶段的资源,从而保证了稳定的TBT
,提供更流畅的用户体验。
技术实现的灵活性
-
模型优化的灵活性:可以对
Prefill
和Decode
阶段分别采用不同的模型优化技术,如在Prefill
阶段采用量化、矩阵分解等技术,而在Decode
阶段使用Continuous Batching
和KV Cache
管理优化。 -
不同硬件加速器的支持:可以在
Prefill
阶段使用GPU
,而在Decode
阶段尝试使用其他类型的加速器(如专用的推理芯片),进一步降低成本和提高效率。
系统可靠性提升
-
故障隔离:当
Prefill
或Decode
集群中的某个节点出现故障时,不会直接影响另一阶段的处理,提高了系统的整体可靠性。 -
版本升级的灵活性:可以独立地升级
Prefill
或Decode
集群,减少系统维护和升级对服务的影响。