深圳Yolo 视觉
深圳
立即加入

利用Neural Magic的 DeepSparse 部署Ultralytics YOLOv5 ,在 CPU 上实现GPU性能

Ultralytics 团队

5 分钟阅读

2023年1月5日

利用Neural Magic 的 DeepSparse 在 CPU 上实现GPU性能,从而增强Ultralytics YOLOv5 模型的训练和部署能力。实现更快、可扩展的YOLOv5 部署。

想加快培训和部署您的 YOLOv5模型?我们将为您提供帮助!介绍我们最新的合作伙伴Neural Magic。Neural Magic 提供的软件工具强调模型的峰值性能和工作流程的简易性,因此我们很自然地携手提供解决方案,使YOLOv5 部署流程更加完善。

DeepSparse是Neural Magic的CPU 推理运行时,它利用神经网络中的稀疏性和低精度算术,在商品硬件上提供卓越的性能。例如,与ONNX Runtime 基准相比,DeepSparse在同一台机器上运行的YOLOv5s提供了5.8 倍的速度提升

YOLOv5 与 DeepSparse 的吞吐量比较

您的深度学习工作负载首次能够在满足生产的性能需求的同时,避免硬件加速器的复杂性和成本。简而言之,DeepSparse 为您提供 GPU 的性能和软件的简易性:

  1. 灵活部署:在云端、数据中心和边缘保持一致运行,并支持任何硬件提供商
  2. 无限可扩展性:使用标准 Kubernetes 进行横向扩展,垂直扩展到数百个内核,或使用无服务器完全抽象化
  3. 易于集成:使用简洁的 API 将您的模型集成到应用程序中并在生产中对其进行监控

在通用 CPU 上实现GPU性能

DeepSparse 利用模型的稀疏性来提高性能。

通过剪枝和量化进行稀疏化,可以在保持高精度的同时,大幅减少执行网络所需的大小和计算量。DeepSparse 具备稀疏感知能力,可跳过乘加零,减少前向传递的计算量。由于稀疏计算受内存限制,DeepSparse 按深度执行网络,将问题分解为Tensor 列(Tensor Columns),这是适合缓存的垂直计算条纹。

DeepSparse 和Ultralytics YOLOv5 网络

在高速缓存中按深度执行压缩计算的稀疏网络使 DeepSparse 能够在 CPU 上提供GPU性能!

创建根据自定义数据训练的YOLOv5 稀疏版本

Neural Magic 的开源模型库 SparseZoo 包含每个YOLOv5 模型的预解析检查点。使用与Ultralytics 集成的 SparseML,只需一条CLI 命令,就能在数据上微调稀疏检查点。

使用 DeepSparse 部署YOLOv5

安装 DeepSparse

运行以下程序安装 DeepSparse。建议使用Python 虚拟环境。

pip install deepsparse[serveryolo,onnxruntime].

收集ONNX 文件

DeepSparse 接受ONNX 格式的模型,以

  • 通往ONNX 模型的本地路径
  • SparseZoo 存根,用于标识 SparseZoo 中的模型

我们将比较标准密集型 YOLOv5s 与经过剪枝-量化的 YOLOv5s,后者通过以下 SparseZoo 存根识别:

zoo:ultralytics
zoo:ultralytics

部署模型

DeepSparse 提供了便捷的 API,可将您的模型集成到应用程序中。

要试用下面的部署示例,请为示例调出一张样本图片,并使用以下命令将其保存为basilica.jpg:

wget -Obasilicabasilicajpg

Python API

管道将预处理和输出后处理封装在运行时周围,为将 DeepSparse 添加到应用程序提供了一个简洁的界面。Ultralytics 集成包括一个开箱即用的管道,可接受原始图像并输出边界框。

创建管道并运行推理:

from deepsparse import Pipeline

# 本地文件系统中的图像列表
images = [basilica.jpg"]

# 创建管道
model_stub = "zoo:ultralytics"
yolo_pipeline = Pipeline.create(
task=yolo",
model_path=model_stub,
)

# 在图像上运行推理,接收边界框 + 类别
pipeline_outputs =yolo(images=images, iou_thres=0.6, conf_thres=0.001)
print(pipeline_outputs)

如果您在云中运行,您可能会收到一个错误,提示 open-cv 找不到 libGL.so.1。在 Ubuntu 上运行以下命令可以安装它:

apt-get install libgl1-mesa-glx

HTTP 服务器

DeepSparse 服务器运行于流行的 FastAPI 网络框架和 Uvicorn 网络服务器之上。只需一条CLI 命令,您就可以轻松地用 DeepSparse 建立模型服务端点。服务器支持 DeepSparse 的任何管道,包括使用YOLOv5 进行对象检测,使您能够向端点发送原始图像并接收边界框。

使用修剪量化的 YOLOv5s 启动服务器:

deepsparse.server\
--taskyolo \
--model_path zoo:ultralytics

使用Python 的请求包提出请求的示例:

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"]

注释CLI

您还可以使用 annotate 命令让引擎将带注释的照片保存在磁盘上。尝试 --source 0 来注释您的实时网络摄像头 feed!

deepsparse.object_detection.annotate --model_filepath zoo:ultralytics--sourcebasilica.jpg

运行上述命令将创建一个 annotation-results 文件夹,并将带注释的图像保存在其中。

用YOLOv5注释Basilica

基准性能

我们将使用 DeepSparse 的基准测试脚本,比较 DeepSparse 和ONNX Runtime 在 YOLOv5 上的吞吐量。

这些基准测试是在AWS c6i.8xlarge实例(16核)上运行的。

批次 32 性能对比

ONNX 运行时基线

在批次 32 时,ONNX Runtime 使用标准密集型 YOLOv5 实现了每秒 42 幅图像的速度:

deepsparse.benchmark zoo:ultralytics-s sync -b 32 -nstreams 1 -e onnxruntime

> 原始模型路径:zoo:ultralytics/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> 批量大小:32
> 情景:同步
> 吞吐量(项/秒):41.9025

DeepSparse 密集性能

虽然 DeepSparse 在优化后的稀疏模型上表现最佳,但它在标准密集 YOLOv5s 上也表现良好。

在 batch 32 时,DeepSparse 使用标准的密集 YOLOv5s 实现了 70 图像/秒的速度——比 ORT 提高了 1.7 倍!

deepsparse.benchmark zoo:ultralytics-s sync -b 32 -nstreams 1

> 原始模型路径:zoo:cv/ultralytics/yolov5-s/pytorch/ultralytics/coco/base-none
> 批量大小:32
> 情景:同步
> 吞吐量(项/秒):69.5546

DeepSparse 稀疏性能

在模型中应用稀疏性后,DeepSparse 的性能比ONNX Runtime 提升得更多。

在 batch 32 时,DeepSparse 使用经过剪枝量化的 YOLOv5s 实现了 241 图像/秒的速度——比 ORT 提高了 5.8 倍!

deepsparse.benchmark zoo:ultralytics-s sync -b 32 -nstreams 1

> 原始模型路径:zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/ultralytics_quant-none
> 批量大小:32
> 情景:同步
> 吞吐量(项/秒):241.2452

批次 1 性能对比

在对延迟敏感的批次 1 场景中,DeepSparse 的速度也比ONNX Runtime 快。

ONNX 运行时基线

在批次 1 中,ONNX Runtime 使用标准的高密度 YOLOv5 实现了每秒 48 幅图像的速度。

deepsparse.benchmark zoo:ultralytics-s sync -b 1 -nstreams 1 -e onnxruntime

> 原始模型路径:zoo:cv/ultralytics/yolov5-s/pytorch/ultralytics/coco/base-none
> 批量大小:1
> 情景:同步
> 吞吐量(件/秒):48.0921

DeepSparse 稀疏性能

在模型中应用稀疏性后,DeepSparse 的性能比ONNX Runtime 提升得更多。

在批次 1 中,DeepSparse 使用经过剪枝量化的 YOLOv5 实现了 135 幅图像/秒的速度,性能 ONNX Runtime 的 2.8 倍!

deepsparse.benchmark zoo:ultralytics-s sync -b 32 -nstreams 1

> 原始模型路径:zoo:ultralytics/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> 批量大小:1
> 场景:同步
> 吞吐量(项/秒):134.9468

由于 c6i.8xlarge 实例具有 VNNI 指令,如果权重以 4 个块为单位进行修剪,则可以进一步提高 DeepSparse 的吞吐量。

在批次 1 中,DeepSparse 使用 4 块剪枝量化 YOLOv5 实现了 180 条/秒的速度,性能 ONNX Runtime 的 3.7 倍!

deepsparse.benchmark zoo:ultralytics-s sync -b 1 -nstreams 1

> 原始模型路径:zoo:cv/ultralytics/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni
> 批量大小:1
> 场景:同步
> 吞吐量(项/秒):179.7375

好了!您就可以使用 DeepSparse 优化YOLOv5 部署了。

开始使用YOLOv5 和 DeepSparse

要与我们取得联系,请加入我们的社区,给我们留下您的问题和意见。查看Ultralytics YOLOv5 存储库和完整的Neural Magic 文档,了解如何部署YOLOv5

在Ultralytics,我们经常与其他初创公司合作,帮助我们为YOLOv5 等开源工具的研发提供资金支持,使这些工具能够免费提供给所有人使用。本文可能包含这些合作伙伴的联盟链接。

让我们一起构建人工智能的未来!

开启您的机器学习未来之旅

免费开始