为什么 Batch Size 对推理性能影响巨大?
Batch Size(批处理大小)之所以对推理(Inference)性能有巨大影响,核心原因在于现代硬件(特别是 GPU)的架构设计特性以及计算与内存访问之间的平衡关系。
简单来说,增大 Batch Size 可以显著提高吞吐量(Throughput),但可能会增加单次请求的延迟(Latency)。
以下是 Batch Size 影响推理性能的几个核心技术原因:
1. 提高硬件利用率(SIMD/SIMT 架构)
GPU 是为大规模并行计算设计的。它的核心逻辑是 SIMT(Single Instruction, Multiple Threads,单指令多线程)。
- 小 Batch Size (例如 1): 就像开着一辆 50 座的大巴车(GPU),只拉了 1 个乘客(数据)。虽然车速很快,但大部分座位(计算核心 CUDA Cores)是空的,资源被严重浪费。
- 大 Batch Size: 就像大巴车坐满了人。GPU 的成千上万个核心可以同时对这一批数据执行相同的操作(例如矩阵乘法)。
- 数学本质:
- Batch=1 时,计算主要是矩阵-向量乘法 (GEMV)。
- Batch>1 时,计算变成了矩阵-矩阵乘法 (GEMM)。
- GPU 对 GEMM 的优化远好于 GEMV,能够更紧凑地排布计算任务,填满流水线。
2. 摊薄内存访问成本(Memory Wall 问题)
在深度学习推理中,“内存墙”(Memory Wall)往往比计算速度更是瓶颈。
- 权重重用(Weight Reuse):
模型推理的核心是 (权重 输入)。- 如果 Batch Size = 1:你需要从显存(HBM)把巨大的权重矩阵 读取到芯片缓存中,计算完这 1 个输入后,权重就被扔掉了。
- 如果 Batch Size = N:你把权重 读取一次,就可以复用于 个输入数据的计算。
- 算术强度(Arithmetic Intensity):
增大 Batch Size 提高了“计算量”与“内存访问量”的比率。因为读取权重的开销被 个样本分摊了,GPU 把更多的时间花在“算”上,而不是花在“等数据从内存搬过来”上。
3. 掩盖 Kernel Launch 开销
每一次 GPU 计算(比如一层卷积或全连接层)都需要 CPU 下发指令,这称为 Kernel Launch(内核启动)。
- 小 Batch Size: 计算量很小,GPU 瞬间算完,然后闲置等待 CPU 发送下一个指令。CPU 的调度开销(Overhead)占比很高。
- 大 Batch Size: 单个 Kernel 的计算时间变长,掩盖了 CPU 发指令的延迟,使得 GPU 能够连续不断地工作,流水线更顺畅。
4. 延迟(Latency)与吞吐量(Throughput)的权衡
这是工程上最需要关注的曲线:
- 吞吐量 (QPS/TPS): 随着 Batch Size 增大,吞吐量通常会线性或近线性增长,直到 GPU 计算单元饱和或显存带宽跑满。
- 延迟 (Latency):
- 在低负载区(Memory Bound): Batch Size 从 1 增加到 8 或 16,延迟可能几乎不变。因为此时 GPU 主要是因为“等数据”而闲置,多加数据只是填补了闲置时间。
- 在高负载区(Compute Bound): 当 GPU 核心已经满载,继续增大 Batch Size,延迟就会开始线性增加,因为计算单元必须排队处理数据。
5. 特殊场景:LLM 推理中的 KV Cache
在大型语言模型(LLM)推理中,Batch Size 的影响更为复杂且关键:
- Memory Bound 特性极强: LLM 生成 Token 的过程(Decoding)是典型的内存受限场景。如果不使用 Batching,GPU 显存带宽利用率极低。
- 显存容量限制: 增大 Batch Size 会导致 KV Cache(用于存储历史上下文的缓存)占用显存线性增加。如果 Batch Size 太大,会导致 OOM(显存溢出)。
- Continuous Batching: 现代推理引擎(如 vLLM, TGI)使用连续批处理技术,动态地将不同请求插入同一个 Batch 中,以最大化利用显存和计算能力。
总结
Batch Size 对性能影响巨大的原因在于:它将“内存受限(Memory Bound)”的任务转化为了“计算受限(Compute Bound)”的任务。
- 如果追求极致低延迟(如自动驾驶): 倾向于较小的 Batch Size(甚至为 1)。
- 如果追求高并发和成本效益(如 ChatGPT 后台): 会尽可能增大 Batch Size,直到填满显存或达到延迟容忍上限。