
YOLOv5 稀疏化与量化部署实战借助 DeepSparse 在 CPU 上实现 GPU 级推理性能【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10本指南以本仓库中 YOLOv5 与 Neural Magic 集成教程 为主体系统讲解如何使用 Neural Magic 的 DeepSparse 推理运行时在纯 CPU 环境部署 YOLOv5 目标检测模型从稀疏化剪枝与量化原理、SparseZoo 预稀疏化模型获取到安装、ONNX 模型准备、Python API / HTTP Server / Annotate CLI 三种部署方式以及吞吐量与延迟基准测试。读完本文你将掌握一套无需 GPU 硬件即可达到接近 GPU 推理性能的 YOLOv5 落地路线并理解其背后的稀疏计算与缓存局部性原理。DeepSparse 是什么为 CPU 而生的高性能推理运行时DeepSparse 是 Neural Magic 推出的开源推理运行时专门面向 CPU 环境优化神经网络执行。按本仓库教程的表述在同一台机器上DeepSparse 推理 YOLOv5s 相对 ONNX Runtime 基线可以获得5.8 倍的加速这意味着深度学习负载首次可以不必依赖专用硬件加速器就能满足生产环境的性能要求。DeepSparse 的核心卖点可归纳为三点灵活部署在云、数据中心与边缘设备上保持一致运行行为可运行于 Intel、AMD 到 ARM 的各种硬件无限扩展垂直扩展可支撑数百核横向可按标准 Kubernetes 扩展也可通过 Serverless 实现完全抽象化部署易集成提供干净的 API可方便地将模型接入应用并在生产环境中监控。从架构与适用场景看DeepSparse 并不是替代 GPU 训练的方案而是面向推理部署阶段的 CPU 高性能引擎与仓库中 Ultralytics 集成总览 将 Neural Magic 归入 Deployment Integrations 的分类一致。DeepSparse 的加速原理稀疏化 Tensor ColumnsDeepSparse 之所以能在 CPU 上取得接近 GPU 的性能关键在于它充分利用了模型稀疏性。稀疏化Sparsification稀疏化通过**剪枝Pruning与量化Quantization**实现。剪枝将网络中冗余的权重参数置零量化则降低权重与激活的数值精度两者结合可以在保持高精度的同时将网络规模与计算量降低一个数量级。本仓库的 模型剪枝与稀疏化教程 给出了一个直观的仓库内证据对 YOLOv5x 进行 30% 全局稀疏度剪枝后nn.Conv2d层中 30% 的权重参数变为 0推理时间基本不变而 mAP 仅有轻微下降——这说明稀疏化可以在几乎无损的前提下显著压缩冗余计算。稀疏感知执行与 Tensor ColumnsDeepSparse 是稀疏感知sparsity-aware的它会跳过被置零的参数从而缩小一次前向传播中的实际计算量。由于稀疏计算变为内存受限memory boundDeepSparse 采用按深度方向执行网络的方式将计算问题分解为Tensor Columns——一种能够完整放入 CPU 缓存的纵向计算条带。压缩后的稀疏网络以深度优先方式在缓存内执行最大程度减少数据搬运、提高缓存命中率这正是 CPU 上实现 GPU 级性能的关键。如何为自定义数据创建稀疏版 YOLOv5要部署稀疏版 YOLOv5需要先获得稀疏化模型。Neural Magic 的开源模型仓库SparseZoo中提供了每个 YOLOv5 模型的预稀疏化检查点而SparseML与 Ultralytics 深度集成只需一条 CLI 命令就能把稀疏检查点在你的自有数据上做微调fine-tune从而获得适配你业务的稀疏模型。这一稀疏检查点 微调的流程意味着你不必从零训练稀疏模型只需在预稀疏化权重基础上继续训练即可。仓库中 YOLOv8 与 Neural Magic 的集成文档 提供了同一套工作流的 YOLOv8 版本pip install deepsparse[yolov8]、导出 ONNX、deepsparse.benchmark等可互相印证。安装 DeepSparseDeepSparse 通过 pip 安装官方建议在 Python 虚拟环境中执行pip install deepsparse[server,yolo,onnxruntime]这里通过 extra 依赖一次性引入了三部分能力依赖组作用server提供基于 FastAPI Uvicorn 的 DeepSparse Server用于搭建 HTTP 推理服务yolo提供 YOLO 任务的 Pipeline、annotate 等对象检测专用能力onnxruntime安装 ONNX Runtime用于基准测试中作为性能对比基线准备 ONNX 模型DeepSparse 接收ONNX 格式的模型来源可以是两种SparseZoo stub一个唯一标识 SparseZoo 中某个 ONNX 文件的引用字符串本地文件路径文件系统中的 ONNX 模型文件。本文示例使用标准的稠密版与剪枝量化版 YOLOv5s 检查点对应的 SparseZoo stub 分别为# 标准稠密 YOLOv5s zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none # 剪枝 65% 量化 的 YOLOv5s zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none # 面向 VNNI 指令的 4-block 剪枝 量化 YOLOv5s zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni如果希望基于仓库内模型自行导出 ONNX可参考本仓库 模型导出教程python export.py --weights yolov5s.pt --include onnx。当前仓库的 ONNX 导出实现 展示了导出过程的技术细节需要onnx1.12.0GPU 可用时同时引入onnxruntime-gpu与onnxslim做精简导出后加载检查模型结构确保导出的*.onnx与官方要求一致。仓库的 test_export_onnx 测试 也验证了YOLO(MODEL).export(formatonnx, dynamicTrue)的动态尺寸导出路径。若你是通过 Ultralytics 框架导出命令形式为yolo modeexport modelyolov8n.pt formatonnx详见 neural-magic.md 集成文档。部署方式一Python APIPipelineDeepSparse 的Pipeline把预处理与输出后处理封装在运行时周围为把 DeepSparse 接入应用提供干净的接口。DeepSparse-Ultralytics 集成内置了开箱即用的Pipeline直接接收原始图片输出目标边界框。示例图片为避免依赖外部下载可直接使用本仓库自带的示例图 ultralytics/assets/bus.jpg 或 ultralytics/assets/zidane.jpg原始教程使用wget从外部拉取一张名为basilica.jpg的示例图将其放在本地文件系统即可等价复现。from deepsparse import Pipeline # 本地文件系统中的图片列表 images [basilica.jpg] # 或替换为仓库示例图路径 # 创建 Pipeline使用剪枝量化版 YOLOv5s model_stub zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none yolo_pipeline Pipeline.create( taskyolo, model_pathmodel_stub, ) # 在图片上执行推理返回边界框 类别 pipeline_outputs yolo_pipeline(imagesimages, iou_thres0.6, conf_thres0.001) print(pipeline_outputs)其中两个关键推理参数含义如下参数默认/示例值含义iou_thres0.6NMS 阶段的 IoU 阈值越大则重叠框越可能被保留conf_thres0.001置信度阈值低于该值的检测结果被过滤调低可召回更多目标调高则更精简云端运行注意如果你在云环境运行可能遇到 open-cv 找不到libGL.so.1的错误在 Ubuntu 上执行apt-get install libgl1即可解决。部署方式二HTTP ServerFastAPIDeepSparse Server 构建在 FastAPI 与 Uvicorn 之上一条 CLI 命令即可搭建模型服务端点。Server 支持 DeepSparse 的所有 Pipeline包括 YOLOv5 目标检测——你可以向端点发送原始图片并接收边界框结果。启动剪枝量化版 YOLOv5s 的服务deepsparse.server \ --task yolo \ --model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none使用 Pythonrequests库发起请求的示例import requests, json # 客户端本地的待推理图片列表 path [basilica.jpg] files [(request, open(img, rb)) for img in path] # 通过 HTTP 向 /predict/from_files 端点发送请求 url http://0.0.0.0:5543/predict/from_files resp requests.post(urlurl, filesfiles) # 响应以 JSON 返回 annotations json.loads(resp.text) # 注解结果字典 bounding_boxes annotations[boxes] labels annotations[labels]该模式适合将检测能力封装为独立微服务供上层应用通过标准 HTTP 协议调用。部署方式三Annotate CLI可视化标注若只想快速查看模型效果可使用annotate命令让引擎把标注后的图片保存到磁盘甚至可以把--source设为0来标注实时摄像头画面deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpg运行后会生成annotation-results文件夹标注后的图片保存在其中便于直观检查检测框、类别与置信度输出的正确性。性能基准测试DeepSparse vs ONNX Runtime使用 DeepSparse 自带的基准脚本可在同一台机器上对比 DeepSparse 与 ONNX Runtime 的吞吐量。以下数据均来自原教程在 AWSc6i.8xlarge实例16 核上的记录展示了三种模型变体稠密 / 剪枝量化 / VNNI 优化在不同 batch 下的表现差异。Batch 32吞吐量对比ONNX Runtime 基线稠密 YOLOv5sbatch 3242 images/secdeepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1 -e onnxruntime Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none Batch Size: 32 Scenario: sync Throughput (items/sec): 41.9025DeepSparse 稠密模型70 images/sec相对 ORT 提升 1.7 倍deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1 Throughput (items/sec): 69.5546DeepSparse 剪枝量化模型241 images/sec相对 ORT 提升 5.8 倍deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 32 -nstreams 1 Throughput (items/sec): 241.2452Batch 1延迟敏感场景对比ONNX Runtime 基线稠密 YOLOv5sbatch 148 images/secdeepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 1 -nstreams 1 -e onnxruntime Throughput (items/sec): 48.0921DeepSparse 剪枝量化模型135 images/sec相对 ORT 提升 2.8 倍deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 1 -nstreams 1 Throughput (items/sec): 134.9468DeepSparse VNNI 优化模型180 images/sec相对 ORT 提升 3.7 倍由于c6i.8xlarge实例带有VNNIVector Neural Network Instructions指令集若权重按 4 的块blocks of 4进行剪枝DeepSparse 的吞吐还能进一步推高deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni -s sync -b 1 -nstreams 1 Throughput (items/sec): 179.7375基准命令参数速查参数示例含义-s / --scenariosync同步推理场景每个请求立即等待结果-b / --batch_size32、1单次推理的批大小越大吞吐越高1代表延迟敏感场景-nstreams1并发推理流的数量-e / --engineonnxruntime选择执行引擎不加该参数默认用 DeepSparse加-e onnxruntime则可测 ORT 基线综合来看稀疏化带来的收益在 batch 场景下最明显5.8 倍在 batch 1 延迟场景同样有效2.8 倍配合 VNNI 指令的块状剪枝还可进一步优化3.7 倍。需要说明的是这些倍数与吞吐数据是原教程在特定实例与固定参数下记录的结果实际数值会随 CPU 型号、核数、指令集与模型版本变化。适用前提与注意事项模型格式DeepSparse 只接受 ONNX 模型要么使用 SparseZoo stub要么提供本地 ONNX 文件路径稀疏化是性能关键虽然 DeepSparse 对稠密模型也有加速batch 32 场景 1.7 倍但最大收益来自剪枝量化模型且带 VNNI 指令的 CPU 上建议使用 4-block 剪枝权重-vnni后缀 stub运行环境建议使用 Python 虚拟环境安装deepsparse[server,yolo,onnxruntime]云端缺少libGL.so.1时执行apt-get install libgl1微调流程创建适配自有数据的稀疏模型使用 SparseML 在 SparseZoo 的预稀疏化检查点上微调而不是从零剪枝训练。延伸阅读YOLOv5 与 Neural Magic 集成教程本文档源文件YOLOv8 与 DeepSparse 集成文档同一套技术栈在 YOLOv8 上的部署示例与 benchmark 命令模型剪枝与稀疏化教程仓库内对 YOLOv5 剪枝原理与效果的直接验证模型导出教程ONNX/TFLite/CoreML 等 11 种格式Ultralytics 集成总览Neural Magic 在部署集成生态中的定位【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考