Ultralytics YOLO27: 加入候补名单。
获取 YOLO 许可
集成

使用 Neural Magic 的 DeepSparse 在 CPU 上部署 Ultralytics YOLOv5,获得媲美 GPU 的性能

使用 Neural Magic 的 DeepSparse 部署 Ultralytics YOLOv5,通过稀疏量化模型实现媲美 GPU 的 CPU 推理,并提供代码示例和基准测试。

Nuvola LadiNuvola Ladi5 分钟阅读
在 CPU 上使用 Neural Magic 的 DeepSparse 部署 Ultralytics YOLOv5

想要加快 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 倍!

Ultralytics YOLOv5 使用 DeepSparse 的吞吐量对比

深度学习工作负载首次能够在不承担硬件加速器的复杂性和成本的情况下,满足生产环境的性能要求。简单来说,DeepSparse 兼具 GPU 的性能和软件的易用性:

  1. 灵活部署:无论使用哪家硬件供应商,都能在云端、数据中心和边缘保持一致运行
  2. 无限扩展性:可通过标准 Kubernetes 横向扩展、纵向扩展至数百个核心,或使用无服务器架构实现完全抽象化
  3. 轻松集成:使用简洁的 API 将模型集成到应用中,并在生产环境中对其进行监控

在通用 CPU 上实现 GPU 级性能#

DeepSparse 利用模型稀疏性来提升运行速度。

通过剪枝和量化进行稀疏化,可将执行网络所需的规模和计算量降低几个数量级,同时保持较高准确性。DeepSparse 能感知稀疏性,跳过结果为零的乘加运算,从而减少前向传播中的计算量。由于稀疏计算受内存限制,DeepSparse 会按网络深度执行,将问题拆分为 Tensor Columns,也就是能够放入缓存的垂直计算条带。

DeepSparse 和 Ultralytics YOLOv5 网络

在缓存中按深度执行的稀疏网络和压缩计算,让 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.jpg

Python 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-glx

HTTP 服务器#

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 文件夹,并将已标注的图像保存在其中。

使用 Ultralytics YOLOv5 标注的 Basilica

基准性能#

我们将使用 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 等优秀开源工具的研发提供资金支持,让所有人都能免费使用这些工具。本文可能包含指向合作伙伴的联盟链接。

作者

Nuvola Ladi
Nuvola Ladi

数字内容经理 · Ultralytics

Nuvola Ladi 是 Ultralytics 的数字内容经理,负责创作涵盖视觉 AI 和 Ultralytics YOLO 的内容,并代表公司参加 PyTorch Conference 2025 等行业活动。她常驻西班牙,拥有 IE University 的视觉与数字媒体硕士学位。加入 Ultralytics 之前,她曾在 XVA Gallery & Hotel 和 Rolex 等机构任职。

评论

提出问题、分享你的结果,或帮助其他人。

探索解决方案

体育领域的计算机视觉

体育领域的计算机视觉

了解 Ultralytics YOLO 如何通过球员和球追踪、表现分析、教练洞察及运动员康复,推动体育视觉技术的发展。
了解详情
航空影像计算机视觉

航空影像计算机视觉

使用 Ultralytics YOLO 将无人机和航空影像转化为农业、水产养殖、保护工作和地理空间分析的实时洞察。
了解详情
航空航天中的计算机视觉

航空航天中的计算机视觉

使用 Ultralytics YOLO 将计算机视觉应用于航空航天领域,包括飞机检查、跑道 FOD 检测、机场地面作业和复合材料缺陷检测。
了解详情
安防领域的计算机视觉

安防领域的计算机视觉

使用 Ultralytics YOLO 模型守护每个场所。视觉 AI 可用于周界监控、威胁检测、车牌识别和工作场所安全。
了解详情
机器人领域的计算机视觉

机器人领域的计算机视觉

使用 Ultralytics YOLO 模型提升智能机器的能力。机器人领域的视觉 AI 可用于自主导航、感知、目标跟踪和实时控制。
了解详情
物流中的计算机视觉

物流中的计算机视觉

借助 Ultralytics YOLO 模型优化物流流程。视觉 AI 可用于包裹检查、分拣、车辆跟踪和仓库安全实时监控。
了解详情
零售中的计算机视觉

零售中的计算机视觉

借助 Ultralytics YOLO 模型重新构想零售。视觉 AI 可用于库存跟踪、货架监控、排队管理和更深入的客户洞察。
了解详情
医疗领域的计算机视觉

医疗领域的计算机视觉

借助 Ultralytics YOLO 模型构建医疗解决方案。医疗领域的视觉 AI 可加快医学影像处理、优化诊断并监测患者。
了解详情
制造业中的计算机视觉

制造业中的计算机视觉

利用 Ultralytics YOLO 模型优化制造流程。视觉 AI 可用于质量控制、缺陷检测、个人防护装备合规检查和装配线自动化。
了解详情
汽车领域的计算机视觉

汽车领域的计算机视觉

利用 Ultralytics YOLO 模型在汽车领域应用计算机视觉。视觉 AI 可提升道路安全、驾驶辅助和车辆自动化水平,让道路更智能。
了解详情
农业中的计算机视觉

农业中的计算机视觉

借助 Ultralytics YOLO 模型,将视觉 AI 引入智慧农业。为作物监测、牲畜追踪和精准农业提供支持,从而提高产量并实现更智能的生产。
了解详情

让我们携手构建 AI 的未来!

开启你的旅程,迎接机器学习的未来