075、NPU的生成对抗网络(GAN)加速:实时图像生成
075 NPU的生成对抗网络(GAN)加速:实时图像生成
去年做边缘端AI相机项目时,客户要求实现实时风格迁移——手机拍一张照片,NPU上跑CycleGAN,1秒内输出梵高风格。当时我天真地以为,把PyTorch模型转成ONNX再量化就完事了。结果第一版跑下来,一张512x512的图,生成器推理耗时2.3秒,判别器还没算。客户当场脸就黑了。
后来拆开分析才发现,GAN在NPU上跑不动,根本原因不是算力不够,而是生成器里那些上采样层和跳跃连接,把NPU的存储带宽和计算流水线全打乱了。今天这篇笔记,就聊聊我在NPU上折腾GAN加速踩过的坑,以及最终怎么把生成时间压到300ms以内的。
生成器结构对NPU的“恶意”
先看一个典型的DCGAN生成器:输入100维噪声,经过全连接层reshape成4x4x1024的特征图,然后连续4次转置卷积(反卷积)上采样到64x64x3。这个结构在GPU上跑得飞起,但在NPU上就是灾难。
NPU的卷积加速器本质上是为规则网格计算优化的。转置卷积的“补零-卷积”操作,在硬件上会产生大量无效计算——补进去的零占用了乘法器,但结果全是零。更致命的是,转置卷积的输入输出尺寸不是整数倍关系时,NPU的DMA搬运会频繁触发边界处理,流水线断得一塌糊涂。
我踩过最深的坑是:用NPU厂商提供的工具链跑转置卷积,编译报告显示计算单元利用率只有12%。查了半天才发现,工具链把转置卷积拆成了“补零+普通卷积”,补零操作在NPU上是用标量核逐像素写的,速度比卷积本身还慢。
别这样
