048、NPU的批处理(Batching):提高吞吐量的技巧
去年冬天调一个端侧人脸检测模型,跑在某个国产NPU上,单帧推理稳定在35ms,看起来还行。但客户要求视频流处理达到30fps,单帧35ms意味着理论极限才28fps,还差口气。我盯着日志看了半天,发现每次推理都在重复加载权重、初始化上下文、搬运数据——这些开销占了将近40%的时间。后来改成一次送4帧进去做批处理,吞吐量直接翻倍,单帧等效时间降到12ms。这就是批处理的魔力。
批处理不是简单的“多塞几张图”
很多人以为批处理就是把多张图片叠在一起扔给NPU,像CPU上那样for循环改batch size。NPU的批处理机制远比这复杂,搞不好反而更慢。
NPU内部有专门的批处理引擎(Batch Engine),它负责把多个输入样本组织成张量块(Tensor Block)。关键点在于:NPU的MAC阵列(乘累加单元)是固定尺寸的,比如16x16或者32x32。单帧推理时,MAC阵列可能只用了60%的算力,因为数据量不够填满所有计算单元。批处理把多个样本的计算合并,让MAC阵列接近满负荷运转。
我见过最典型的错误:有人把batch size设成8,但NPU的批处理引擎只支持2的幂次(1、2、4、8、16)。设成3、5、6、7这些非2的幂次,驱动层会做padding补零,白白浪费算力。更坑的是,有些NPU的批处理引擎对batch size有对齐要求,比如必须是4的倍数,否则内部会做多次小批量拼接,性能不升反降。
数据搬运才是真正的瓶颈
NPU的批处理收益主要来自两方面:计算密度