跳至内容

Neural Magic的 DeepSparse

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

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

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

YOLOv5 速度改进

For the first time, your deep learning workloads can meet the performance demands of production without the complexity and costs of hardware accelerators. Put simply, DeepSparse gives you the performance of GPUs and the simplicity of software:

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

DeepSparse 如何实现GPU 级性能?

DeepSparse 利用模型的稀疏性来提高性能。

Sparsification through pruning and quantization is a broadly studied technique, allowing order-of-magnitude reductions in the size and compute needed to execute a network, while maintaining high accuracy. DeepSparse is sparsity-aware, meaning it skips the zeroed out parameters, shrinking amount of compute in a forward pass. Since the sparse computation is now memory bound, DeepSparse executes the network depth-wise, breaking the problem into Tensor Columns, vertical stripes of computation that fit in cache.

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 Server runs on top of the popular FastAPI web framework and Uvicorn web server. With just a single CLI command, you can easily setup a model service endpoint with DeepSparse. The Server supports any Pipeline from DeepSparse, including object detection with YOLOv5, enabling you to send raw images to the endpoint and receive the bounding boxes.

用经过修剪和量化的 YOLOv5 启动服务器:

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

您还可以使用注释命令让引擎将注释过的照片保存在磁盘上。尝试使用 --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 社区可免费用于研究和测试。请从我们的文档开始。


📅 Created 11 months ago ✏️ Updated 13 days ago

评论