197、超分模型压缩:知识蒸馏与剪枝技术在EDSR上的应用实战

197、超分模型压缩:知识蒸馏与剪枝技术在EDSR上的应用实战
197、超分模型压缩:知识蒸馏与剪枝技术在EDSR上的应用实战上个月部署EDSR到移动端的时候,模型加载直接OOM,32层残差块堆出来的参数,在骁龙888上跑一张512x512的图要4.7秒。客户说这速度还不如直接插值算了。当时我就意识到,超分模型落地最大的拦路虎不是精度,是模型太大、推理太慢。今天这篇笔记,就聊聊我在EDSR上折腾知识蒸馏和剪枝的那些坑和经验。从一次失败的蒸馏实验说起最开始我天真地以为,拿一个预训练好的EDSR当teacher,随便搭个小网络当student,直接拿L1 loss蒸馏就能成。结果跑完50个epoch,student的PSNR比teacher低了整整1.8dB,而且视觉上出现了明显的棋盘伪影。后来排查发现,问题出在蒸馏策略上——我直接把teacher的中间特征图对齐了,但EDSR的残差块输出分布差异极大,浅层特征和深层特征的数值范围差了三个数量级,硬对齐反而让student学到了噪声。正确的做法是:只对齐teacher和student的最终输出,中间层用注意力迁移(Attention Transfer)来引导,而不是直接做特征图MSE。具体实现时,我在EDSR的每个残差块后插入了注意力图计算模块,计算空间注意力掩码,让student去模仿teacher的注意力分布,而不是像素值。代码里这样写:# 别像我第一次那样直接算特征图MSE