使用 Neural Magic 的 DeepSparse 在 CPU 上部署 Ultralytics YOLOv5,获得媲美 GPU 的性能
使用 Neural Magic 的 DeepSparse 部署 Ultralytics YOLOv5,通过稀疏量化模型实现媲美 GPU 的 CPU 推理,并提供代码示例和基准测试。
Nuvola Ladi5 分钟阅读
想要加快 YOLOv5 模型的训练和部署吗?来认识我们的最新合作伙伴 Neural Magic。Neural Magic 提供的软件工具注重实现模型的最佳性能和简化工作流程,因此我们携手合作,打造更出色的 YOLOv5 部署流程,再自然不过了。
更新:Neural Magic 于 2025 年 1 月被 Red Hat 收购,此后已停止维护 DeepSparse、SparseML 和 SparseZoo 的社区版本。以下步骤仅供参考;有关当前状态,请参阅上文链接的 YOLOv5 DeepSparse 指南。
DeepSparse 是 Neural Magic 的 CPU 推理运行时,它利用神经网络中的稀疏性和低精度算术运算,在通用硬件上实现出色性能。例如,与 ONNX Runtime 基准相比,DeepSparse 在同一台机器上运行 YOLOv5s 时,速度提升了 5.8 倍!

深度学习工作负载首次能够在不承担硬件加速器的复杂性和成本的情况下,满足生产环境的性能要求。简单来说,DeepSparse 兼具 GPU 的性能和软件的易用性:
- 灵活部署:无论使用哪家硬件供应商,都能在云端、数据中心和边缘保持一致运行
- 无限扩展性:可通过标准 Kubernetes 横向扩展、纵向扩展至数百个核心,或使用无服务器架构实现完全抽象化
- 轻松集成:使用简洁的 API 将模型集成到应用中,并在生产环境中对其进行监控
在通用 CPU 上实现 GPU 级性能#
DeepSparse 利用模型稀疏性来提升运行速度。
通过剪枝和量化进行稀疏化,可将执行网络所需的规模和计算量降低几个数量级,同时保持较高准确性。DeepSparse 能感知稀疏性,跳过结果为零的乘加运算,从而减少前向传播中的计算量。由于稀疏计算受内存限制,DeepSparse 会按网络深度执行,将问题拆分为 Tensor Columns,也就是能够放入缓存的垂直计算条带。

在缓存中按深度执行的稀疏网络和压缩计算,让 DeepSparse 能在 CPU 上实现媲美 GPU 的性能!
创建一个基于自定义数据训练的 Ultralytics YOLOv5 稀疏版本#
Neural Magic 的开源模型仓库 SparseZoo 包含每个 YOLOv5 模型的预稀疏化检查点。借助与 Ultralytics 集成的 SparseML,你可以通过一条 CLI 命令,使用自己的数据微调稀疏检查点。
使用 DeepSparse 部署 Ultralytics YOLOv5#
安装 DeepSparse#
运行以下命令安装 DeepSparse。我们建议你使用 Python 虚拟环境。
pip install deepsparse[server,yolo,onnxruntime]获取 ONNX 文件#
DeepSparse 接受 ONNX 格式的模型,模型可以通过以下任一方式提供:
- 指向 ONNX 模型的本地路径
- 用于标识 SparseZoo 中模型的 SparseZoo stub
我们将比较标准的稠密 YOLOv5s 与经过剪枝和量化的 YOLOv5s,后者由以下 SparseZoo stub 标识:
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none部署模型#
DeepSparse 提供便捷的 API,方便你将模型集成到应用程序中。
要尝试下面的部署示例,请下载示例图片,并使用以下命令将其保存为 basilica.jpg:
wget -O basilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpgPython API#
Pipeline 会在运行时封装预处理和输出后处理,为将 DeepSparse 添加到应用程序提供简洁的接口。DeepSparse-Ultralytics 集成包含一个开箱即用的 Pipeline,可接收原始图像并输出边界框。
创建 Pipeline 并运行推理:
from deepsparse import Pipeline
# 本地文件系统中的图像列表
images = ["basilica.jpg"]
# 创建 Pipeline
model_stub = "zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none"
yolo_pipeline = Pipeline.create(
task="yolo",
model_path=model_stub,
)
# 对图像运行推理,接收边界框和类别
pipeline_outputs = yolo_pipeline(images=images, iou_thres=0.6, conf_thres=0.001)
print(pipeline_outputs)如果你在云端运行,可能会遇到 OpenCV 找不到 libGL.so.1 的错误。在 Ubuntu 上运行以下命令即可安装:
apt-get install libgl1-mesa-glxHTTP 服务器#
DeepSparse Server 基于流行的 FastAPI Web 框架和 Uvicorn Web 服务器运行。只需一条 CLI 命令,你就能轻松使用 DeepSparse 设置模型服务端点。Server 支持 DeepSparse 的任何 Pipeline,包括使用 Ultralytics YOLOv5 进行目标检测,因此你可以向端点发送原始图像并接收边界框。
使用经过剪枝和量化的 YOLOv5s 启动 Server:
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none使用 Python 的 requests 包发送请求的示例:
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(url=url, files=files)
# 响应以 JSON 格式返回
annotations = json.loads(resp.text) # 标注结果字典
bounding_boxes = annotations["boxes"]
labels = annotations["labels"]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 的基准测试脚本,比较 DeepSparse 与 ONNX Runtime 在 YOLOv5s 上的吞吐量。
基准测试在 AWS c6i.8xlarge 实例(16 个核心)上运行。
批次大小为 32 时的性能比较#
ONNX Runtime 基线#
批次大小为 32 时,标准稠密 YOLOv5s 在 ONNX Runtime 上的性能为每秒 42 张图像:
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1 -e onnxruntime原始模型路径:zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none 批次大小:32 场景:sync 吞吐量(项/秒):41.9025
DeepSparse 稠密模型性能#
DeepSparse 在经过优化的稀疏模型上性能最佳,但处理标准稠密 YOLOv5s 时表现也很好。
批次大小为 32 时,DeepSparse 使用标准稠密 YOLOv5s 可达到每秒 70 张图像——性能比 ORT 提升 1.7 倍!
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1原始模型路径:zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none 批次大小:32 场景:sync 吞吐量(项/秒):69.5546
DeepSparse 稀疏模型性能#
对模型进行稀疏化后,DeepSparse 相较于 ONNX Runtime 的性能提升更为显著。
批次大小为 32 时,DeepSparse 使用经过剪枝和量化的 YOLOv5s 可达到每秒 241 张图像——性能比 ORT 提升 5.8 倍!
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 32 -nstreams 1原始模型路径:zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none 批次大小:32 场景:sync 吞吐量(项/秒):241.2452
批次大小为 1 时的性能比较#
在对延迟敏感的批次大小为 1 的场景中,DeepSparse 同样能够比 ONNX Runtime 更快。
ONNX Runtime 基线#
批次大小为 1 时,标准稠密 YOLOv5s 在 ONNX Runtime 上的性能为每秒 48 张图像。
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 1 -nstreams 1 -e onnxruntime原始模型路径:zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none 批次大小:1 场景:sync 吞吐量(项/秒):48.0921
DeepSparse 稀疏模型性能#
对模型进行稀疏化后,DeepSparse 相较于 ONNX Runtime 的性能提升更为显著。
批次大小为 1 时,DeepSparse 使用经过剪枝和量化的 YOLOv5s 可达到每秒 135 张图像——性能比 ONNX Runtime 提升 2.8 倍!
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 1 -nstreams 1原始模型路径:zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none 批次大小:1 场景:sync 吞吐量(项/秒):134.9468
由于 c6i.8xlarge 实例支持 VNNI 指令,如果按 4 个权重为一组进行剪枝,DeepSparse 的吞吐量还能进一步提升。
批次大小为 1 时,DeepSparse 使用按 4 个权重为一组剪枝并量化的 YOLOv5s 可达到每秒 180 项——性能比 ONNX Runtime 提升 3.7 倍!
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni -s sync -b 1 -nstreams 1原始模型路径:zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni 批次大小:1 场景:sync 吞吐量(项/秒):179.7375
好了!现在你可以使用 DeepSparse 优化 YOLOv5 部署了。
开始使用 Ultralytics YOLOv5 和 DeepSparse#
欢迎加入我们的社区,向我们提出问题并分享你的意见。查看 Ultralytics YOLOv5 仓库和 Neural Magic 关于部署 YOLOv5 的完整文档。
在 Ultralytics,我们与其他初创公司开展商业合作,为 YOLOv5 等优秀开源工具的研发提供资金支持,让所有人都能免费使用这些工具。本文可能包含指向合作伙伴的联盟链接。
作者
评论
提出问题、分享你的结果,或帮助其他人。










