跳至内容

Neural Magic的 DeepSparse

欢迎使用软件交付的人工智能。

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

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

YOLOv5 速度改进

这是第一次,您的深度学习工作负载可以满足生产对性能的要求,而无需考虑硬件加速器的复杂性和成本。简而言之,DeepSparse 为您提供了 GPU 的性能和软件的简便性:

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

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 提供方便的应用程序接口,可将模型集成到应用程序中。

要试用下面的部署示例,请拉下示例图像并将其保存为 basilica.jpg 有以下内容

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

Python 应用程序接口

Pipelines DeepSparse- 集成包括开箱即用的预处理和输出后处理,为在应用程序中添加 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 服务器运行于流行的 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 的请求示例 requests 包装

import requests, json

# 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

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

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

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

深度稀疏密集性能

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

在批次 32 时,DeepSparse 使用标准密集 YOLOv5 实现了每秒 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 提升得更多。

在批次 32 时,DeepSparse 使用经过剪枝量化的 YOLOv5 实现了 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

第一批性能比较

与ONNX Runtime 相比,DeepSparse 还能在对延迟敏感的第 1 批方案中提高速度。

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

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

DeepSparse 稀疏性能

在批次 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 如果权重以 4 块为单位剪枝,DeepSparse 的吞吐量还能进一步提高。

在批次 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 社区可免费用于研究和测试。请从我们的文档开始。



创建于 2023-11-12,更新于 2024-03-19
作者:glenn-jocher(4)

评论