LLM系列:continuous batching

895 阅读2分钟

LLM推理原理

一条请求推理过程:
1 从prompt token序列开始,如下黄色部分;
2 推理迭代过程中,每次生成一个token,直到生成结束token或达到token序列最大长度,如下蓝色.

image.png

LLM推理关键点:
1 prompt prefill耗时约等于后续每个token生成时间。prefill阶段对attention inputs的计算量是固定,其他计算与后续token生成过程相同;
2 LLM推理是 memory-IO bound。即1MB数据加载到计算核时间比计算核处理时间要多;
3 GPU memory消耗量与模型大小和token长度成正比.

综上所述,推理内存优化后,LLM性能会有显著提升。量化压缩技术优化模型权重内存;FlashAttention技术重新组织attention计算减少内存IO,显著提升吞吐;下面介绍的Continuous batching是另一项不需修改模型权重的加速技术。

LLM batching原理

什么是batching?
虽然GPU是大规模并行计算架构,非常擅长密集型计算,但LLMs推理的算力很难吃满,原因是加载模型权重占据大部分芯片内存带宽;
批处理(batching)技术不需要每次input sequence就加载模型权重,而是加载一次处理多个input sequence。这个技术充分利用芯片的内存带宽、提高计算利用率和吞吐。

Naive batching / static batching

朴素batching/静态batching:推理完成时batch size一直保持不变。

cb.png

在上图多batch推理场景中,s2请求生成5个新token,s3只生成1个新token。虽然s3结束的早,但由于是同一个batch,必须等s2生成结束才会返回。

Continous Batching

源自论文(《Orca: A Distributed Serving System for Transformer-Based Generative Models》)[www.usenix.org/conference/… Batching技术可以实现数倍甚至数十倍的系统吞吐提升。

cb2.png

主要解决3个问题:

  • 1 对Early-finished Requests的处理:输入输出长度差异,部分请求提前结束,产生NPU空泡
  • 2 对Late-joining Requests的处理:缺少新请求插入推理Batch机制,等待批处理增加时延;
  • 3 Batching任意一组请求:每个请求对应的QKV Tensor的Length维度各不相同,批量计算需要处理此问题。

论文提出的 Iteration-level Scheduling技术,可以很好解决Early-Finished 和 Late-Joining。具体参考算法解读.
解决思路:多batch(多用户并行使用)推理场景,通过对batch时序优化,可以去除空泡,提高NPU利用率和吞吐量。

参考:
zhuanlan.zhihu.com/p/680123256
www.anyscale.com/blog/contin…