063、NPU的YOLO加速:目标检测网络的硬件优化
一、一个让我熬夜三天的bug
去年做某安防芯片的YOLOv5s移植,板子跑起来检测框全飘在天上。用CPU推理完全正常,一上NPU就崩。查了三天,最后发现是NPU的卷积加速器对3×3卷积的stride=2处理有个隐藏约束——输入feature map的宽度必须是16字节对齐。YOLO的Backbone里那个下采样层,输入尺寸是80×80,80不是16的倍数,NPU硬件自动做了padding补到96,结果坐标全偏了。
这个坑让我意识到:NPU不是万能加速器,它有自己的“脾气”。不懂硬件细节,YOLO跑上去可能比CPU还慢。
二、YOLO在NPU上的计算瓶颈拆解
YOLO系列(v3/v5/v8)的核心计算量集中在三个部分:
卷积层占了总计算量的85%-92%。特别是Backbone里的3×3卷积,CSPDarknet结构里大量使用。每个卷积包含乘加运算(MAC),NPU的脉动阵列(Systolic Array)就是为这个设计的。
上采样层在Neck部分,YOLOv5用最近邻插值,计算量不大但访存模式很“散”。NPU的DMA控制器如果没做预取,这里会卡住流水线。
检测头的1×1卷积和通道压缩,计算量占比不高但精度敏感。量化时这里最容易掉点。
我习惯用Roofline模型分析:YOLOv5s的计算密度大约是200-400 FLOPs/Byte,