vllm从orca那抄到的连续批处理有缺点,它期望“在batch里动态卸载、加载序列”,也确实做到了,但是prefill和decoder俩阶段的计算方法不一样,前者一次性算出来,后者一个一个吐出来,两个的操作方法不同导致消耗的时间不同。理论上prefill多少个token都与decode 1个token时间一样,但是由于计算能力受限,prefill最多计算n个token,再多就超过decode 1个token的时间了,split-fuse就是做了这个优化。
回看orca,它没有分prefill和decode,当前batch所有序列该推哪步推哪步,第1个序列要prefill,第2个要decode,那就必须它俩都算完再计算下一步。
orca的缺点是其他decode总要等prefill,导致算力浪费。
vllm设立抢占式,基础操作是decode,抢占者是prefill,如果当前batch里申请prefill的序列多过m个,则下一步要同时做prefill和docode。显然,花费的时间仍然要看最长prefill token数,还是浪费算力。

优点:大幅减小首字输出时间。
缺点:整体推理速度下降,并发提升到后期的吞吐量会上升较慢,每个token的延迟也会增加。

更多推荐