ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Ultralytics YOLOv5 模型剪枝与稀疏化(Pruning Sparsity)实战指南

Ultralytics YOLOv5 模型剪枝与稀疏化(Pruning  Sparsity)实战指南 Ultralytics YOLOv5 模型剪枝与稀疏化Pruning Sparsity实战指南【免费下载链接】ultralyticsUltralytics YOLO26, YOLO11, YOLOv8 — object detection, instance segmentation, semantic segmentation, image classification, pose estimation, object tracking项目地址: https://gitcode.com/GitHub_Trending/ul/ultralytics本文依据 Ultralytics YOLOv5 官方教程对应仓库文档 docs/en/yolov5/tutorials/model-pruning-and-sparsity.md整理扩充而成。围绕剪枝能省多少、代价是什么、怎么落地这条主线带你复现经典 YOLOv5 代码库中的torch_utils.prune()剪枝流程先建立基线、再剪到 30% 稀疏度、最后对比精度与速度并做微调补偿。读完你将掌握一套可复制的剪枝 微调优化链路并理解稀疏度、全局稀疏、非结构化剪枝与推理加速之间的关系。什么是模型剪枝模型剪枝Model Pruning是一类通过移除神经网络中不那么重要的参数权重与连接来减小模型尺寸与复杂度的技术。它不会改变模型的结构定义而是识别出对输出贡献极小的权重并让它们不再参与计算通常体现为将其置零从而获得一个更轻量、同时精度仍相近的模型。在 YOLOv5 场景下剪枝的核心收益包括减小模型体积剪枝后的权重文件占用更少的存储空间便于部署到存储受限的设备提升推理速度配合支持稀疏计算的后端或进一步结构化压缩可有效降低单帧推理耗时降低内存与能耗更少的有效参数意味着更低的显存/内存占用和功耗提升实时应用的整体效率为边缘设备、嵌入式平台上的目标检测留出更多资源余量。需要先澄清一个关键概念稀疏度Sparsity指被置零的权重占比。若稀疏度为 30%即意味着网络中约 30% 的权重参数被置零。文档中演示的是非结构化权重剪枝——逐参数独立地决定去留因此模型总参数量日志中的parameters统计并不会减少减小的是有效权重数与存储体积其真正的算力收益需要由稀疏加速硬件或软件如 TensorRT 稀疏推理、DeepSparse 等兑现。若希望在通用硬件上直接获得加速通常会进一步做结构化剪枝整通道剔除或在 模型剪枝/量化教程 中介绍的结构化稀疏化方案。开始前的环境准备官方教程假定你在一个Python 3.8.0的环境中操作并安装有PyTorch 1.8。教程面向的是经典 YOLOv5 代码库包含val.py、train.py、utils/torch_utils.py等脚本的独立仓库模型与数据集COCO 等会在首次运行时自动下载。git clone https://github.com/ultralytics/yolov5 # clone 代码库 cd yolov5 pip install -r requirements.txt # 安装依赖说明剪枝演示全程只需要验证validation路径即修改val.py在推理前插入一次剪枝调用不需要重新训练。这也是本方法适合快速验证剪枝可行性的原因——几分钟即可看到 30% 稀疏度下的精度账本。第一步测试基线性能动手剪枝前必须先在同一份数据、同一批超参数下跑出基线指标作为后续对比的锚点。教程用YOLOv5x在COCO val2017上、输入尺寸640 像素执行验证python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half参数要点--weights yolov5x.pt选择模型权重。yolov5x.pt是官方系列中最大、精度最高的模型也可换成yolov5s.pt/yolov5m.pt/yolov5l.pt或使用自定义数据集训练产出的./weights/best.pt--data coco.yaml数据集配置指向 COCO 标注与类别定义--img 640验证输入尺寸--half使用 FP16 半精度推理在 V100 等支持 FP16 的 GPU 上更快、更省显存。原始输出节选含关键观测点YOLOv5 v6.0-224-g4c40933 torch 1.10.0cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB) Fusing layers... Model Summary: 444 layers, 86705005 parameters, 0 gradients ... Class Images Labels P R mAP.5 mAP.5:.95: 100% 157/157 [01:1200:00, 2.16it/s] all 5000 36335 0.732 0.628 0.683 0.496 Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640) # --- base speed ... Average Precision (AP) [ IoU0.50:0.95 | area all | maxDets100 ] 0.507 # --- base mAP解读基线输出模型构成444 layers, 86,705,050 parameters, 0 gradients其中0 gradients是因为验证前执行了Fusing layers...将 Conv 与 BatchNorm 融合以加速融合后的层不再需要梯度。这一先融合、后评估的顺序也决定了剪枝作用在融合后的卷积权重上整体指标Precision 0.732、Recall 0.628、mAP.5 0.683、mAP.5:.95 0.496COCO 官方 APpycocotools 评估AP[0.50:0.95] 0.507含 small/medium/large 细分项与 AR 指标后续与剪枝模型的精度对比都以此为基准速度基线单帧5.2ms inference另加 0.1ms 预处理与 1.7ms NMS。请务必把基线 log 中的base speed与base mAPAP0.50:0.95 0.507记录下来剪枝完成后逐项对照。第二步对 YOLOv5x 应用 30% 稀疏度剪枝官方提供的最简方案是修改val.py在验证推理前调用utils/torch_utils.py中定义的torch_utils.prune()辅助函数将 YOLOv5x 剪到 0.3 稀疏度即 30% 的nn.Conv2d层权重被置零。典型改法是在加载模型、完成 Fusing 之后、正式进入验证循环之前插入剪枝调用例如from utils.torch_utils import prune # ... 原有模型加载与 Fusing 逻辑 ... prune(model, 0.3) # 对全部 nn.Conv2d 权重执行 30% 稀疏度剪枝 LOGGER.info(Pruning model... %.1f global sparsity, 0.3) # ... 继续原有验证逻辑 ...运行后会看到剪枝日志行Pruning model... 0.3 global sparsity随后的验证输出如下Model Summary: 444 layers, 86705005 parameters, 0 gradients Pruning model... 0.3 global sparsity ... Class Images Labels P R mAP.5 mAP.5:.95: 100% 157/157 [01:1100:00, 2.19it/s] all 5000 36335 0.724 0.614 0.671 0.478 Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640) # --- prune speed ... Average Precision (AP) [ IoU0.50:0.95 | area all | maxDets100 ] 0.489 # --- prune mAP注意两处易被误读的细节Model Summary中的86705005 parameters保持不变——非结构化剪枝是把权重值置零而非删除参数条目因此 PyTorch 统计的参数量不变真正的收益体现在有效权重非零值减少、存储空间下降剪枝打印的0.3 global sparsity是全局稀疏度即模型整体所有nn.Conv2d卷积层合计被置零权重占总权重数的比例而非逐层都恰好 30%。结果分析30% 稀疏度下的精度与速度账本将基线与剪枝后的关键指标并排对比指标基线Base30% 稀疏剪枝后变化COCO AP 0.50:0.950.5070.489仅下降约 3.6%mAP.50.6830.671下降约 0.012Precision0.7320.724小幅下降Recall0.6280.614小幅下降单帧推理耗时5.2 ms5.2 ms基本不变权重稀疏度0%30%Conv2d 权重置零—存储占用—降低有效参数减少由此可以得到文档强调的四个结论确实达成了 30% 稀疏度模型中nn.Conv2d层的 30% 权重参数已归零推理耗时几乎不变剪枝前后同为 5.2ms/帧。这是因为在 PyTorch 默认的稠密矩阵计算路径上零值权重依然参与矩阵乘法省不掉算力此阶段的收益是文件更小、内存占用更低精度损失极小COCO AP 从 0.507 降到 0.489降幅约 3.6%nn.Conv2d中占比很高的零权重对模型容量冗余的清除效果显著模型体积减小剪枝后的模型需要更少的存储空间这对嵌入式、边缘端部署尤为友好。一句话总结这段实验非结构化剪枝在几乎不动推理速度的前提下用约 3.6% 的 AP 代价换来了 30% 的权重稀疏化与存储缩减是把模型瘦身后再交给稀疏加速运行时使用的高性价比预处理手段。第三步对剪枝模型进行微调Fine-tuning剪枝本质上是用精度换稀疏度直接拿剪枝模型上线并非最优解。官方建议剪枝后必须做短周期微调让剩余参数重新适应被移除的连接通常能恢复大部分甚至全部精度。标准流程为以期望的稀疏度对模型施加剪枝如prune(model, 0.3)用较小的学习率对剪枝模型训练若干 epoch例如沿用自定义数据的train.py流程在验证集上将微调后的剪枝模型与基线再次对比确认精度回收情况。微调之所以有效是因为剪枝后的幸存权重分布发生了偏移原先收敛的解不再最优小幅度的继续训练让剩余权重学会补偿被删连接负责的那部分特征表达。若要追求更极致的压缩可继续参考 YOLOv5 的 Neural Magic 剪枝量化教程其对结构化稀疏与 INT8 量化组合的处理更为深入。剪枝优化与 Ultralytics 生态的衔接作为一套系统性的性能优化方法剪枝通常不是孤立使用的YOLOv5 生态中还包含一系列配套手段模型导出剪枝 微调完成后可经 模型导出教程 转为 ONNX、TensorRT、CoreML、TFLite 等格式TensorRT 等后端可进一步利用稀疏/低精度特性测试时增强与模型集成如果精度损失超过预期可用 TTA 教程 或 模型集成教程 在推理侧补偿架构层面的对照理解YOLOv5 架构总结 有助于定位不同模块的冗余来源指导该剪哪些层。在当前 Ultralytics 仓库中继续深挖本教程文档现收录于 Ultralytics 统一仓库的 YOLOv5 文档区。虽然torch_utils.prune()剪枝辅助函数定义在经典 YOLOv5 独立代码库中但围绕模型瘦身前后的量化观测工具在当前仓库里均有对应实现可在 ultralytics/utils/torch_utils.py 中查阅model_info()逐层打印layers / parameters / gradients / GFLOPs汇总信息是复现基线输出中Model Summary: 444 layers, 86705005 parameters那一行的同款统计逻辑也可用于验证剪枝前后参数量的不变性get_num_params() /get_num_gradients()分别统计参数量与含梯度参数数量fuse_conv_and_bn()验证阶段先融合 ConvBatchNorm 的实现依据——剪枝作用于融合后权重这也是日志中0 gradients的由来。如果你使用的是当前统一的 Ultralytics 库而非经典 YOLOv5 独立仓库请注意Ultralytics 主库提供的是无锚框 YOLOv5u 变体YOLOv5 模型文档由经典 YOLOv5 仓库训练的权重无法直接被主库加载需使用yolov5su.pt等 Ultralytics 权重在 训练、验证、推理、导出 各模式下工作。本教程的剪枝命令与数值结果针对经典 YOLOv5 代码库复现跨库迁移时需按对应库的 API 调整调用方式。支持的运行环境无论采用哪种环境Ultralytics 均提供了预装 CUDA、cuDNN、Python、PyTorch 等核心依赖的现成方案可直接用于跑通上述剪枝验证流程免费 GPU NotebookPaperspace Gradient、Google Colab、Kaggle 等平台一键运行 YOLOv5 教程Google CloudGCP 快速上手指南AmazonAWS 快速上手指南AzureAzureML 快速上手指南DockerDocker 快速上手指南小结把整套流程串起来YOLOv5 的剪枝优化是一条清晰且可复制的链路量基线在 COCO val2017或自定义验证集上以固定配置跑出 AP 与推理耗时剪枝验证借助torch_utils.prune()对模型施加目标稀疏度本教程示范 30%在同一验证流程上复测对比决策参考30% 稀疏度、AP 仅降约 3.6%、推理耗时基本不变这类账本判断该稀疏度是否符合部署诉求微调恢复用小学习率短训几个 epoch回收精度导出上线结合稀疏运行时、量化与模型导出把存储与算力收益最终落到边缘设备上。对于资源受限场景剪枝是让 YOLOv5 类检测模型轻装上路的实用第一步。建议你在自己的数据集上以小稀疏度如 10%~30%起步逐档上调并记录 AP 曲线找到精度与稀疏度的平衡点后再配合微调与量化获得最终的部署模型。【免费下载链接】ultralyticsUltralytics YOLO26, YOLO11, YOLOv8 — object detection, instance segmentation, semantic segmentation, image classification, pose estimation, object tracking项目地址: https://gitcode.com/GitHub_Trending/ul/ultralytics创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表