利用 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 命令,就能在数据上微调稀疏检查点。

详情请查看 Neural Magic 的 YOLOv5 文档。

使用 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 等开源工具的研发提供资金支持,使这些工具能够免费提供给所有人使用。本文可能包含这些合作伙伴的关联链接。

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

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

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