continuous batching、chunked-prefill相关概念

batching VS. continuous batching

batching是所有requests的output都生成完毕之后,才能开始处理下一个batch。一般要做input padding,要等待凑够batch才运行(也有超时bar)。

continuous batching是每完成1个request,就让1个新request加入到batch里。好处:可以让decode阶段的一个batch的token数目不减少,确保计算密度。

continuous batching VS. chunked prefill

VLLM里,前者是prefill优先。新到的prefill请求,打断所有decode请求。且prefill和decode不batching。

后者是decode优先。且prefill请求和decode请求可以batching到一起。decode那个batch的token较少填不满batch时,才会把prefill加进来。prefill的tokens太多时,分chunk每次做一段。

如下图,chunked prefill,deepspeed的论文:

2024年初;VLLM是prefill和decode不batch到一起。Orca是两者batch到一起。DeepSpeed是chunked prefill,即把input拆分,和decode阶段的batch到一起。

如何评测:模拟同时有1~32个并发用户(每个用户,拿到AI回复后,才会立即发送下一个prompt)(这里的“立即发送”,其实,跟现实用户想一会儿再打字一会儿,是不符合的)。prompt长度和output长度各自是某个值为均值的正态分布。

为什么用4张A100来测1份LLama-70B: 我猜想,1. 为了让batch能大些,1张卡可能batch大小太受限制;2. 为了推理速度快些,A100之间有NVLink,TP-4速度比TP-1要快。(我的猜测:可能因为我自己的实验是1张A100,所以chunked prefill优势不明显?)

用LLama2-13B测试,相比LLama2-70B,好处不那么明显了:

有效吞吐:

每张图,是人为规定的decode阶段SLA bar(按照人的阅读速度来定的)。

长尾延迟表现好:

在生产环境中,批处理能同时处理对模型的多个请求,从而充分利用 GPU 资源,不同的批处理方法适用于不同情况,不过引用中未直接提及使用 Dynamic BatchingContinuous Batching 提升 PD 分离效率的内容。但可从批处理通用原理及这两种批处理特点来推测提升效率的方法。 Dynamic Batching 通常适用于大多数非大语言模型(LLM),它会在一定时间窗口内收集请求,将这些请求组合成一个批次进行处理。在 PD 分离场景中,可设置合适的时间窗口,让系统有足够时间收集较多的 PD 分离请求,形成较大的批次。较大的批次能更充分地利用计算资源,减少单次请求处理的开销,从而提升效率。例如,在收集到足够多具有相似特征的 PD 分离请求后,一次性将它们送入模型处理,避免了单个请求处理时频繁的上下文切换和资源分配。 Continuous Batching 对于大多数 LLM 部署更适用,其核心是每次迭代都动态重新组织 batch。在 PD 分离中,可以在每次迭代时,根据当前请求的状态和特征,动态地将新的 PD 分离请求加入到当前批次中,或者移除已经完成部分处理的请求。这样能及时替换已完成请求的显存空间来处理新请求,减少推理次数,提高显存利用率。例如,当某个 PD 分离请求已经完成了一部分关键步骤,其占用的显存空间可被新的 PD 分离请求及时利用,实现更高效的资源分配。 ```python # 以下是一个简单的伪代码示例,模拟 Dynamic Batching 的请求收集过程 import time # 模拟请求队列 request_queue = [] # 时间窗口(秒) time_window = 1 # 批次大小 batch_size = 10 start_time = time.time() while True: # 模拟接收新请求 new_request = get_new_request() if new_request: request_queue.append(new_request) elapsed_time = time.time() - start_time if elapsed_time >= time_window or len(request_queue) >= batch_size: # 达到时间窗口或批次大小,处理批次请求 process_batch(request_queue) request_queue = [] start_time = time.time() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值