一、介绍
Continuous Batching(连续批处理)是一种针对大语言模型(LLM)推理的优化技术,旨在通过动态调整批处理的大小和调度策略,显著提高 GPU 的利用率和推理吞吐量,同时减少延迟。与传统的静态批处理(Static Batching)相比,Continuous Batching 的核心优势在于能够在每个推理迭代中动态调整批大小,而不是等待整个批次完成后再处理。
二、背景与动机
大语言模型的推理过程具有以下特点:
- 生成长度不可预知:模型的输出长度在推理时无法确定,这使得传统的静态批处理难以高效利用 GPU 资源。
- 推理时间差异大:不同请求的推理时间可能差异很大,导致 GPU 在处理长请求时出现资源浪费。
传统的静态批处理方式会等待所有请求完成后再结束批处理,这种方式在处理长请求时会导致 GPU 资源的浪费,尤其是在生成长度差异较大的情况下。Continuous Batching 通过在每个迭代阶段动态调整批大小,解决了这一问题。
三、工作原理
- 迭代级调度:Continuous Batching 在每个生成迭代中动态调整批大小。一旦某个请求完成生成,新的请求可以立即加入当前批次,从而避免 GPU 等待长请求完成的空闲时间。
- PagedAttention 机制:PagedAttention 是一种优化技术,通过将缓存(KV Cache)划分为固定大小的“页面”,并在需要时动态分配内存,从而减少显存浪费。这种方法显著提高了显存利用率,允许更大的批大小,进而提升吞吐量。
- 调度策略:调度器根据当前资源负载动态调整批处理的大小。例如,当某个请求无法获取足够的显存时,可以选择将其缓存从显存移至内存(Swap),待资源释放后再移回显存。
四、优势
- 显著提升吞吐量:通过动态调整批大小,Continuous Batching 能够充分利用 GPU 资源,减少空闲时间。根据 Anyscale 的实验,使用 Continuous Batching 可以实现高达 23 倍的吞吐量提升(使用 vLLM)。
- 降低延迟:Continuous Batching 允许新请求在当前批次中动态插入,减少了请求的等待时间。实验表明,Continuous Batching 在不同负载下都能显著降低延迟。
- 优化显存使用:通过 PagedAttention 等技术,Continuous Batching 能够减少显存浪费,允许更大的批大小,从而进一步提升吞吐量。
五、实现与应用
- FasterTransformer:NVIDIA 的 FasterTransformer 是一个针对 Transformer 模型的优化库,虽然最初仅支持静态批处理,但通过优化和结合 Continuous Batching 技术,其性能得到了显著提升。
- vLLM:vLLM 是一个开源项目,基于 Orca 的连续批处理设计,通过动态内存分配进一步减少了显存碎片化。在实验中,vLLM 的性能显著优于传统的静态批处理和简单的连续批处理。
- Hugging Face 的实现:Hugging Face 的 text-generation-inference 服务器实现了 Continuous Batching,支持动态批处理和高效调度,适用于生产环境。
六、总结