利用 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 向外扩展,纵向扩展至 100 个内核,或使用无服务器完全抽象化
  3. 易于集成:使用简洁的应用程序接口将模型集成到应用程序中,并在生产中对其进行监控

在通用 CPU 上实现 GPU 级性能

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

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

DeepSparse 和 Ultralytics YOLOv5 网络

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

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

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

使用 DeepSparse 部署 YOLOv5

安装 DeepSparse

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

pip install deepsparse[server,yolo,onnxruntime].

收集 ONNX 文件

DeepSparse 接受 ONNX 格式的模型,以

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

我们将把标准密集 YOLOv5 与经过剪枝量化的 YOLOv5 进行比较,后者由以下 SparseZoo 存根标识:

zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none

部署模型

DeepSparse 提供方便的应用程序接口,可将模型集成到应用程序中。

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

wget -O basilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpg

Python API

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

创建管道并运行推理:

从 deepsparse 导入管道

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

# 创建管道
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)

如果在云中运行,可能会出现 open-cv 无法找到 libGL.so.1 的错误。在 Ubuntu 上运行以下命令即可安装:

apt-get install libgl1-mesa-glx

HTTP 服务器

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

用经过修剪和量化的 YOLOv5 启动服务器:

deepsparse.server\
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none

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

导入请求、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

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

deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpg

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

用 YOLOv5 注释大教堂

基准性能

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

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

批次 32 性能比较

ONNX 运行时基线

在批次 32 时,ONNX Runtime 使用标准密集 YOLOv5 实现了每秒 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
> 情景:同步
> 吞吐量(项/秒):41.9025

深度稀疏密集性能

虽然 DeepSparse 在使用优化的稀疏模型时性能最佳,但在使用标准的密集 YOLOv5 时同样表现出色。

在批次 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
> 情景:同步
> 吞吐量(项/秒):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
> 情景:同步
> 吞吐量(项/秒):241.2452

第一批性能比较

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

ONNX 运行时基线

在批次 1 中,ONNX Runtime 使用标准的高密度 YOLOv5 实现了每秒 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
> 情景:同步
> 吞吐量(件/秒):48.0921

DeepSparse 稀疏性能

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

在批次 1 中,DeepSparse 使用经过剪枝量化的 YOLOv5 实现了 135 幅图像/秒的速度,性能是 ONNX Runtime 的 2.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
> 批量大小:1
> 场景:同步
> 吞吐量(项/秒):134.9468

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

在批次 1 中,DeepSparse 使用 4 块剪枝量化 YOLOv5 实现了 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
> 场景:同步
> 吞吐量(项/秒):179.7375

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

开始使用 YOLOv5 和 DeepSparse

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

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

让我们共同打造人工智能的未来

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

免费开始
链接复制到剪贴板