使用 Neural Magic 的 DeepSparse 部署 YOLOv5

欢迎使用软件交付的 AI。

本指南介绍了如何使用 Neural Magic 的 DeepSparse 部署 YOLOv5。

DeepSparse 是一款在 CPU 上具有卓越性能的推理运行时。例如,与 ONNX Runtime 基准相比,DeepSparse 在同一台机器上运行 YOLOv5s 的速度提升了 5.8 倍!

YOLOv5 DeepSparse vs ONNX Runtime speed comparison chart

你的 深度学习 工作负载首次能够满足生产环境的性能需求,而无需硬件加速器带来的复杂性和高昂成本。简单来说,DeepSparse 为你提供了 GPU 级的性能和软件级的简洁性:

  • 灵活的部署:可在云端、数据中心和边缘环境中使用任何硬件提供商(从 Intel 到 AMD 再到 ARM)保持一致的运行表现
  • 无限的可扩展性:垂直扩展至数百个核心,通过标准 Kubernetes 进行水平扩展,或使用 Serverless 实现完全抽象
  • 轻松集成:通过简洁的 API 将模型集成到应用程序中并在生产环境中进行监控

DeepSparse 是如何实现 GPU 级性能的?

DeepSparse 利用模型稀疏性来获得性能提升。

通过剪枝和量化实现的稀疏化是一项研究广泛的技术,它可以在保持高 精度 的同时,大幅减少执行网络所需的规模和计算量。DeepSparse 是稀疏感知的,这意味着它会跳过置零的参数,从而在一次前向传播中缩减计算量。由于稀疏计算现在受限于内存,DeepSparse 会在缓存中深度优先地执行网络,将问题分解为 Tensor Columns(张量列),即适合缓存的垂直计算条。

DeepSparse tensor columns for sparse neural network inference

采用压缩计算并在缓存中进行深度优先执行的稀疏网络,使 DeepSparse 能够在 CPU 上提供 GPU 级的性能!

如何创建在我的数据上训练的 YOLOv5 稀疏版本?

Neural Magic 的开源模型库 SparseZoo 包含了每个 YOLOv5 模型的预稀疏化检查点。使用与 Ultralytics 集成的 SparseML,你可以通过单个 CLI 命令将稀疏检查点微调到你的数据上。

查看 Neural Magic 的 YOLOv5 文档以获取更多详情

DeepSparse 使用方法

我们将通过一个示例来演示如何使用 DeepSparse 对 YOLOv5s 的稀疏版本进行基准测试和部署。

安装 DeepSparse

运行以下命令以安装 DeepSparse。我们建议你在 Python 虚拟环境中使用。

pip install "deepsparse[server,yolo,onnxruntime]"

收集 ONNX 文件

DeepSparse 接受 ONNX 格式的模型,可以通过以下方式传入:

  • 一个用于识别 SparseZoo 中 ONNX 文件的 SparseZoo stub
  • 指向文件系统中 ONNX 模型的本地路径

以下示例使用标准的密集型和剪枝量化型 YOLOv5s 检查点,通过以下 SparseZoo stubs 进行标识:

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,它可以接收原始图像并输出边界框。

创建一个 Pipeline 并运行推理:

from deepsparse import Pipeline

# list of images in local filesystem
images = ["basilica.jpg"]

# create Pipeline
model_stub = "zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none"
yolo_pipeline = Pipeline.create(
    task="yolo",
    model_path=model_stub,
)

# run inference on images, receive bounding boxes + classes
pipeline_outputs = yolo_pipeline(images=images, iou_thres=0.6, conf_thres=0.001)
print(pipeline_outputs)

如果你在云端运行,可能会遇到 OpenCV 无法找到 libGL.so.1 的错误。你可以安装缺失的库:

apt-get install libgl1

或者使用完全避免 GUI 依赖的无头 (headless) Ultralytics 包:

pip install ultralytics-opencv-headless

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 json

import requests

# list of images for inference (local files on client side)
path = ["basilica.jpg"]
files = [("request", open(img, "rb")) for img in path]

# send request over HTTP to /predict/from_files endpoint
url = "http://0.0.0.0:5543/predict/from_files"
resp = requests.post(url=url, files=files)

# response is returned in JSON
annotations = json.loads(resp.text)  # dictionary of annotation results
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 文件夹,并将标注后的图像保存在其中。

YOLOv5 detection results with bounding boxes

性能基准测试

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

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

Batch 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

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
# Batch Size: 32
# Scenario: sync
# Throughput (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

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
# Batch Size: 32
# Scenario: sync
# Throughput (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

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
# Batch Size: 32
# Scenario: sync
# Throughput (items/sec): 241.2452

Batch 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

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
# Batch Size: 1
# Scenario: sync
# Throughput (items/sec): 48.0921

DeepSparse 稀疏性能

在 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 1 -nstreams 1

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
# Batch Size: 1
# Scenario: sync
# Throughput (items/sec): 134.9468

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

在 Batch 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

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni
# Batch Size: 1
# Scenario: sync
# Throughput (items/sec): 179.7375

开始使用 DeepSparse

研究或测试? DeepSparse Community 可免费用于研究和测试。查看其 文档 开始上手。

有关使用 DeepSparse 部署 YOLOv5 的更多信息,请查看 Neural Magic 的 DeepSparse 文档 以及 Ultralytics 关于 DeepSparse 集成的博客文章

评论