深度可分离卷积:MobileNet背后的计算优化一个让我加了两天班的bug去年调试一块基于Cortex-M7的AI推理引擎,跑MobileNetV1时发现推理速度比理论计算慢了整整一个数量级。当时我盯着逻辑分析仪上的波形,CPU在卷积层卡了将近300ms——这不对劲,理论计算应该只要30ms。排查到最后,发现是NPU的MAC阵列在标准卷积下利用率只有12%。问题出在数据搬运上:每次卷积核滑动,DMA都要从DDR搬一整块特征图,而这块数据里大部分像素只参与一次乘加运算就被丢弃了。这就是标准卷积的“数据复用率”瓶颈。这个坑让我意识到:理解深度可分离卷积,不能只看它减少了多少计算量,更要看它如何改变了数据流模式。标准卷积的“奢侈浪费”先算一笔账。输入特征图尺寸H×W×C,卷积核K×K,输出通道M。标准卷积的计算量是:H × W × C × M × K × K假设H=W=56,C=64,M=128,K=3。计算量约等于56×56×64×128×9 ≈ 2.3亿次乘加。但更致命的是内存访问量。每个输出像素需要读取K×K×C个输入值,而相邻输出像素的输入窗口有大量重叠。理论上,如果数据复用做得好,内存访问可以大幅降低。但在嵌入式NPU上,由于SRAM容量限制(通常只有几百KB),你很难把整张特征图留在片上。结果就是:数据反复从DDR搬运,带宽成了真正的瓶颈。我在调试时用性能计数器测过,标准卷积的MAC利用率在嵌入式NPU上通常只有20%-40
023、深度可分离卷积:MobileNet背后的计算优化
深度可分离卷积:MobileNet背后的计算优化一个让我加了两天班的bug去年调试一块基于Cortex-M7的AI推理引擎,跑MobileNetV1时发现推理速度比理论计算慢了整整一个数量级。当时我盯着逻辑分析仪上的波形,CPU在卷积层卡了将近300ms——这不对劲,理论计算应该只要30ms。排查到最后,发现是NPU的MAC阵列在标准卷积下利用率只有12%。问题出在数据搬运上:每次卷积核滑动,DMA都要从DDR搬一整块特征图,而这块数据里大部分像素只参与一次乘加运算就被丢弃了。这就是标准卷积的“数据复用率”瓶颈。这个坑让我意识到:理解深度可分离卷积,不能只看它减少了多少计算量,更要看它如何改变了数据流模式。标准卷积的“奢侈浪费”先算一笔账。输入特征图尺寸H×W×C,卷积核K×K,输出通道M。标准卷积的计算量是:H × W × C × M × K × K假设H=W=56,C=64,M=128,K=3。计算量约等于56×56×64×128×9 ≈ 2.3亿次乘加。但更致命的是内存访问量。每个输出像素需要读取K×K×C个输入值,而相邻输出像素的输入窗口有大量重叠。理论上,如果数据复用做得好,内存访问可以大幅降低。但在嵌入式NPU上,由于SRAM容量限制(通常只有几百KB),你很难把整张特征图留在片上。结果就是:数据反复从DDR搬运,带宽成了真正的瓶颈。我在调试时用性能计数器测过,标准卷积的MAC利用率在嵌入式NPU上通常只有20%-40