笔记整理自技术博客:https://www.baseten.co/blog/continuous-vs-dynamic-batching-for-ai-inference/#naive-implementation-for-basic-testing
批处理(Batching)是在生产环境中服务LLM和其他生成模型的关键技术。通过同时处理多个请求来GPU模型,可以充分利用GPU资源,大幅提高模型部署的吞吐量。

最简单的模型服务器实现没有批处理。每个请求按接收顺序单独处理。
想象一条充满汽车的道路,每辆车只有司机,没有乘客。大多数车至少能坐四个人,所以大量容量被浪费。这正是您的GPU上发生的情况。无批处理会导致:

运行LLM或许多其他ML模型时的瓶颈是用于加载模型权重的内存带宽。
关键概念:
如果公交车运营静态批处理:司机等待公交车完全坐满,然后开车出发去目的地这确保公交车每次经过路线时都是满载的静态批处理最适用于:
优势:
劣势:
静态批处理适用于日常任务或后台处理,但对于对延迟敏感的生产部署(如响应用户输入生成图像),静态批处理无法满足要求。
想象在一个流量稀缺的日子,你是第一个上公交车的人。如果必须等待整个公交车坐满才能离开,你将等待很长时间。如果司机在第一个乘客上车时启动一个定时器,并在公交车满员或定时器到期(先发生的)时发车,这样保证最多等待几分钟。
设置动态批处理需要配置:
示例配置:- 批次大小:16个请求- 等待窗口:100毫秒当服务器接收到第一个请求时,会发生以下情况之一:1. 在100毫秒内接收到15个以上的请求 → 立即运行完整的批次2. 接收到少于15个请求 → 100毫秒后运行部分批次动态批处理在流量较少时导致更短的等待时间,同时在流量高峰期保持吞吐量。
动态批处理非常适合以下模型的实时流量:
具体部署的正确设置取决于:
动态批处理在广泛选项范围内提供了灵活性。
虽然动态批处理适合图像生成等模态(每个输出耗时基本相同),但对于LLM,我们可以使用连续批处理做得更好。

LLM创建token序列作为输出:
如果使用动态批处理方法:
连续批处理在token级别而非请求级别工作。
AI推理的瓶颈是加载模型权重。
连续批处理操作:
连续批处理类似于真实世界中的公交车路线运行方式:- 司机经过路线时,乘客乘坐公交车的时间不同- 当一个乘客到达目的地时,就会给新乘客腾出一个座位| 无批处理 | |||||
| 静态批处理 | |||||
| 动态批处理 | |||||
| 连续批处理 |
| 批处理 | ||
| 激活(Activations) | ||
| 内存带宽瓶颈 | ||
| 吞吐量 | ||
| 延迟 | ||
| Token级别处理 | ||
| Prefill | ||
| Next Token Prediction |