深圳尤洛视觉
深圳
立即加入

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

Ultralytics 团队

5 分钟阅读

2023年1月5日

使用 Neural Magic 的 DeepSparse 增强 Ultralytics YOLOv5 模型的训练和部署,以在 CPU 上实现 GPU 级别的性能。实现更快、可扩展的 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 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 格式的模型,可以通过以下方式传递:

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

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

Pipelines 将预处理和输出后处理封装在运行时周围,为将 DeepSparse 添加到应用程序提供了一个清晰的接口。DeepSparse-Ultralytics 集成包括一个开箱即用的 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)

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

apt-get install libgl1-mesa-glx

HTTP 服务器

DeepSparse Server 运行在流行的 FastAPI Web 框架和 Uvicorn Web 服务器之上。只需一个 CLI 命令,您就可以使用 DeepSparse 轻松设置模型服务终端。该服务器支持 DeepSparse 中的任何 Pipeline,包括使用 YOLOv5 进行对象检测,使您可以将原始图像发送到终端并接收边界框。

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

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

标注 CLI

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

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

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

使用 YOLOv5 标注的 Basilica

基准性能

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

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

批次 32 性能对比

ONNX Runtime 基准

在 batch 32 时,ONNX Runtime 使用标准的密集 YOLOv5s 实现了 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
> 吞吐量 (items/sec): 41.9025

DeepSparse 密集性能

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

在 batch 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
> 吞吐量 (items/sec): 69.5546

DeepSparse 稀疏性能

当将稀疏性应用于模型时,DeepSparse 相对于 ONNX Runtime 的性能提升甚至更强。

在 batch 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
> 吞吐量 (items/sec): 241.2452

批次 1 性能对比

对于延迟敏感的 batch 1 场景,DeepSparse 也能获得比 ONNX Runtime 更快的速度。

ONNX Runtime 基准

在 batch 1 时,ONNX Runtime 使用标准的密集 YOLOv5s 实现了 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
> 吞吐量 (items/sec): 48.0921

DeepSparse 稀疏性能

当将稀疏性应用于模型时,DeepSparse 相对于 ONNX Runtime 的性能提升甚至更强。

在 batch 1 时,DeepSparse 使用经过剪枝量化的 YOLOv5s 实现了 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
> 场景: sync
> 吞吐量 (items/sec): 134.9468

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

在 batch 1 时,DeepSparse 使用 4-block 经过剪枝量化的 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
> 吞吐量 (items/sec): 179.7375

瞧!您已准备好使用 DeepSparse 优化您的 YOLOv5 部署。

开始使用 YOLOv5 和 DeepSparse

要与我们联系,请加入我们的社区,并留下您的问题和评论。查看Ultralytics YOLOv5存储库和完整的用于部署YOLOv5的Neural Magic文档

在 Ultralytics,我们与其他初创公司进行商业合作,以帮助我们资助我们出色的开源工具(如 YOLOv5)的研发,从而使它们对所有人免费。本文可能包含指向这些合作伙伴的联盟链接。

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

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

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