3、batch size概念解析:batch size的定义、在推理中的角色、与吞吐量和延迟的关系

在深度学习推理的性能优化中,batch size(批大小)是最基础、也最容易被低估的杠杆。它直接决定了计算单元(如NPU的AI Core、向量单元)的利用率,进而影响推理服务的吞吐量(Throughput)和延迟(Latency)。理解batch size的本质,是进行后续实测分析和调优的前提。本节将从定义出发,厘清其在推理链路中的位置,并重点剖析它与吞吐量、延迟之间的“跷跷板”关系。

Batch Size 在推理中的核心角色与权衡 请求队列 并发请求数 Batch Size 决策点 单次NPU计算加载的样本数 影响计算密度与内存带宽 推理结果 响应返回 吞吐量(Throughput) 单位时间处理的样本数(req/s 或 samples/s) • 增大Batch → 计算密集度↑ → 吞吐量↑ • 但受限于NPU显存容量 • 存在最优Batch点(拐点) 延迟(Latency) 单个请求从提交到返回的时间(ms) • 增大Batch → 排队等待↑ → 延迟↑ • 计算时间可能缩短,但总延迟上升 • 需要权衡P99延迟与吞吐 权衡

3.1 batch size的定义与本质

Batch size(批大小)在推理场景中,指的是一次前向传播(Forward Pass)中,NPU同时处理的样本数量。与训练阶段不同,推理时的batch size通常由服务端的请求聚合策略决定,而非由数据集预先划分。例如,当客户端并发发送32个推理请求时,服务端可以选择将它们打包为一个batch=32的输入张量(Tensor),一次性交给NPU计算。

从硬件视角看,NPU(如昇腾910B、英伟达A100等)内部包含大量并行计算单元(AI Core、Tensor Core)。这些单元擅长执行矩阵乘法和向量运算。当batch size=1时,计算单元往往处于“半饥饿”状态——因为单样本的矩阵维度可能不足以填满所有计算流水线。而增大batch size,本质上是将多个独立样本的相同计算图叠加,形成更高维度的矩阵运算,从而提升计算密度。

核心理解:Batch size不是“越大越好”,也不是“越小越实时”。它是一个资源利用率与响应速度之间的调节旋钮。在NPU推理中,它直接决定了AI Core的忙碌程度、内存带宽的消耗模式以及算子融合的效率。

3.2 推理中batch size的角色定位

在推理服务链路中,batch size扮演着“计算打包器”的角色。它位于请求调度层与NPU执行层之间,是连接并发请求与硬件算力的桥梁。具体而言,其角色体现在以下三个层面:

  • 计算密度提升器:将多个请求的相同算子(如MatMul、Conv2D)合并为批量运算,减少算子启动开销和内核(Kernel)调度次数。
  • 内存带宽利用调节器:较大的batch size可以更好地复用权重数据(Weight),降低权重从HBM/DDR加载到片上SRAM的重复开销。
  • 延迟与吞吐的权衡杠杆:batch size增大时,单个请求的排队时间增加,但整体吞吐量上升;反之,batch size减小则延迟降低,但吞吐量下降。

在NPU推理框架(如MindSpore、TensorRT、ONNX Runtime)中,batch size通常作为动态维度(Dynamic Shape)或静态维度(Static Shape)存在。静态batch size便于编译器做极致优化(如算子融合、内存复用),但灵活性差;动态batch size则更适应真实业务波动,但可能损失部分优化空间。

3.3 与吞吐量的关系:非线性增长与拐点

吞吐量(Throughput)通常定义为单位时间内完成的推理请求数(单位:req/s或samples/s)。在理想情况下,吞吐量应随batch size线性增长——因为计算资源被更充分地利用。然而,实际NPU系统中,这种增长是非线性的,并存在明显的收益递减拐点。

其背后的机制包括:

  1. 计算资源饱和:当batch size达到NPU计算单元的最大并行度后,继续增大batch只会增加内存访问压力,而计算时间不再显著缩短。
  2. 内存带宽瓶颈:NPU的HBM带宽有限。当batch size过大时,数据搬运时间(DMA)成为主要矛盾,计算单元开始等待数据。
  3. 算子融合失效:部分融合算子(如Conv+BN+ReLU)在超大batch下可能因中间结果存储压力而被迫拆分为多个小算子,增加额外开销。
Batch Size 计算时间 (ms) 吞吐量 (samples/s) 单样本平均延迟 (ms) 备注
1 2.0 500 2.0 计算单元利用率低
4 4.5 889 1.125 利用率显著提升
8 7.2 1111 0.9 接近最优区域
16 13.0 1231 0.8125 吞吐增速放缓
32 25.6 1250 0.8 拐点出现,收益递减
64 52.0 1231 0.8125 吞吐量开始下降

上表展示了一个典型NPU推理场景的实测数据(假设模型为ResNet-50,输入224x224x3)。可以看到,当batch size从1增加到16时,吞吐量提升明显;但超过16后,吞吐量增长趋于平缓,甚至在batch=64时出现下降。这是因为内存带宽已饱和,且计算单元利用率达到上限。

3.4 与延迟的关系:排队论与P99指标

延迟(Latency)通常指单个请求从提交到返回结果的完整时间,包括网络传输、排队等待、NPU计算和后处理。batch size对延迟的影响是双重的:

  • 计算延迟(Compute Latency):增大batch size后,单个样本的平均计算时间会缩短(因为分摊了固定开销),但整个batch的总计算时间会增加。
  • 排队延迟(Queueing Latency):当服务端为了凑齐一个较大的batch而等待更多请求时,先到的请求必须等待后到的请求,导致排队延迟增加。

在实时推理场景(如在线推荐、自动驾驶)中,我们更关注P99延迟(即99%的请求延迟低于该值)。如果盲目增大batch size,虽然平均延迟可能下降,但P99延迟会急剧恶化——因为尾部请求需要等待更长时间才能凑齐batch。

风险提示:在延迟敏感型业务中,不能仅以平均延迟或吞吐量作为优化目标。必须同时监控P99/P95延迟。一个常见的失败案例是:将batch size从4调到16后,吞吐量提升了30%,但P99延迟从15ms飙升至80ms,导致服务超时率上升,用户体验严重下降。

3.5 案例拆解:图像分类服务的batch size调优

背景与约束:某AI安防平台部署了一个基于昇腾310B NPU的图像分类服务,输入为1080P视频帧,模型为ResNet-18。业务要求:吞吐量不低于800 FPS(帧/秒),且P99延迟不超过50ms。当前服务使用batch size=1,实测吞吐量仅420 FPS,P99延迟为22ms,吞吐量不达标。

初始现象与目标:工程师决定通过增大batch size来提升吞吐量,但担心延迟超标。目标是在满足P99≤50ms的前提下,将吞吐量提升至800 FPS以上。

关键输入数据:通过NPU Profiler工具采集到以下数据:

  • batch=1时:AI Core利用率仅35%,内存带宽利用率28%,算子启动开销占比15%。
  • batch=4时:AI Core利用率升至62%,带宽利用率45%,算子启动开销降至6%。
  • batch=8时:AI Core利用率78%,带宽利用率70%,算子启动开销降至3%。

分析判断过程:从数据看,batch=4和batch=8都能显著提升计算密度。但需要评估排队延迟的影响。服务端采用动态batching策略,最大等待时间为10ms。在batch=8时,凑齐8个请求的平均等待时间为8ms(假设请求到达率为1000 req/s),加上计算时间12ms,总延迟约20ms,P99可能达到45ms,接近上限。

实际操作步骤:

  1. 将batch size从1调整为4,并设置最大排队等待时间为5ms。
  2. 重新编译模型,开启算子融合(如Conv+BN+ReLU融合)。
  3. 使用NPU Profiler验证AI Core利用率提升至65%以上。
  4. 进行压测:模拟1000并发请求,持续10分钟。

结果对比:

指标 Batch=1(原) Batch=4(优化后) 变化
吞吐量 420 FPS 860 FPS ↑104.8%
P99延迟 22 ms 38 ms ↑16 ms(仍达标)
AI Core利用率 35% 65% ↑30%

风险与代价:P99延迟从22ms升至38ms,虽然仍低于50ms阈值,但余量变小。如果未来请求量波动增大,可能导致P99超限。为此,团队设置了动态batching开关:当P99延迟超过45ms时,自动将batch size降为2,以牺牲部分吞吐量换取延迟稳定。

复盘经验:batch size调优不是一次性工作,而是需要结合实时流量特征和硬件性能计数器持续调整。最优batch size通常位于“AI Core利用率接近80%但内存带宽未饱和”的区域。

3.6 常见误区与总结复盘

在实际项目中,工程师对batch size的理解常存在以下误区:

  • 误区一:认为batch size越大越好。实际上,超过拐点后,吞吐量不再增长,反而因内存压力导致性能下降。
  • 误区二:只关注平均延迟,忽略P99延迟。在交互式应用中,P99延迟决定了用户体验的“最差情况”,比平均值更重要。
  • 误区三:静态设置batch size,不随负载变化。真实业务的请求到达率是波动的,固定batch size要么导致延迟超标,要么导致吞吐量浪费。
  • 误区四:忽略NPU与GPU的差异。NPU的调度粒度、内存层次(如昇腾的L2 Buffer)与GPU不同,最优batch size的规律可能不同,必须基于实测数据。
经验总结:确定最优batch size的推荐流程是:① 使用Profiler采集不同batch下的AI Core利用率、内存带宽、算子耗时;② 绘制“batch size-吞吐量”曲线,找到拐点;③ 结合业务延迟要求(P99),在拐点左侧选择满足延迟约束的最大batch;④ 部署动态batching机制,根据实时负载和延迟反馈自动调整。