跳转至内容

使用Neural Magic的DeepSparse部署YOLOv5

欢迎体验软件驱动的 AI。

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

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

YOLOv5 速度提升

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

  • 灵活部署: 在云、数据中心和边缘上,通过从 Intel 到 AMD 再到 ARM 的任何硬件提供商保持一致运行
  • 无限可扩展性: 纵向扩展到数百个内核,使用标准 Kubernetes,或使用 Serverless 完全抽象
  • 易于集成:用于将模型集成到应用程序中并在生产环境中对其进行监控的简洁 API

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

DeepSparse 利用模型稀疏性来提高其性能速度。

通过剪枝和量化实现的稀疏化是一种被广泛研究的技术,可以在保持高准确性的同时,大幅减少执行网络所需的大小和计算量。DeepSparse 具有稀疏感知能力,这意味着它可以跳过归零的参数,从而减少前向传递中的计算量。由于稀疏计算现在受内存限制,DeepSparse 以深度方式执行网络,将问题分解为 Tensor Columns,即适合缓存在计算中的垂直条纹。

YOLO 模型剪枝

具有压缩计算的稀疏网络,在缓存中以深度方式执行,使 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 存根,用于标识 SparseZoo 中的 ONNX 文件
  • 文件系统中 ONNX 模型的本地路径

以下示例使用标准的密集和剪枝量化 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 接受原始图像并输出边界框。

创建一个 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)

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

apt-get install libgl1

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

标注 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 文件夹中,并将标注的图像保存在其中。

已标注

性能基准测试

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

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

批次 32 性能比较

ONNX Runtime 基准

在 batch 32 时,ONNX Runtime 使用标准的密集 YOLOv5s 实现了 42 images/秒:

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 images/秒,性能比 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 images/秒,性能比 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

批次 1 性能比较

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

ONNX Runtime 基准

在 batch 1 时,ONNX Runtime 使用标准的密集 YOLOv5s 实现了 48 images/秒。

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 items/秒,性能比 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-block 经过剪枝量化的 YOLOv5s 实现了 180 items/秒,性能比 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 集成的博客文章



📅 创建于 1 年前 ✏️ 更新于 2 个月前

评论