073、模型剪枝实战:L1/L2 结构化剪枝 + 微调恢复精度,参数量减半不掉点

073、模型剪枝实战:L1/L2 结构化剪枝 + 微调恢复精度,参数量减半不掉点 073、模型剪枝实战:L1/L2 结构化剪枝 + 微调恢复精度,参数量减半不掉点一、从一次线上事故说起去年有个项目,YOLOv8s 部署到 Jetson Orin NX,帧率死活上不去,只有 12 FPS。排查半天,发现是模型太大,显存带宽被吃满。当时团队里有人提议直接砍层数,结果 mAP 从 0.78 掉到 0.62,客户直接炸毛。后来我试了结构化剪枝——不是简单砍层,而是对卷积核做 L1/L2 范数排序,把“不重要”的通道剪掉。剪完参数量减半,mAP 只掉了 0.3 个点,微调两轮后反而涨了 0.1。今天就把这套流程拆开揉碎讲清楚,代码直接能跑,踩过的坑也一并标出来。二、剪枝到底在剪什么?很多人以为剪枝就是“删掉一些层”,这是大错特错。结构化剪枝的核心是剪通道——对每个卷积层,根据卷积核的 L1 或 L2 范数排序,砍掉范数最小的那些核。因为范数小的核,学到的特征响应弱,去掉后对整体输出影响最小。YOLOv8 的 backbone 里,每个 C2f 模块包含多个 Bottleneck,每个 Bottleneck 里又有 Conv-BN-SiLU。剪枝时不能直接动 C2f 的输入输出通道数,否则会破坏残差连接的结构。正确做法是:只剪 Conv 层的输出通道,同时同步更新后续 BN 层的输入通道数。这里踩过坑:第一次剪枝时,我直接对 Conv 的 weight 做 mask,结果 BN 层的 runnin