Neural Magic的 DeepSparse
欢迎使用软件交付的人工智能。
本指南介绍如何使用Neural Magic 的 DeepSparse 部署YOLOv5 。
DeepSparse 是一种推理运行时,在 CPU 上性能卓越。例如,与ONNX Runtime 基准相比,DeepSparse 为在同一台机器上运行的 YOLOv5s 提供了 5.8 倍的速度提升!
这是第一次,您的深度学习工作负载可以满足生产对性能的要求,而无需考虑硬件加速器的复杂性和成本。简而言之,DeepSparse 为您提供了 GPU 的性能和软件的简便性:
- 灵活部署:使用从Intel 到 AMD 再到 ARM 的任何硬件提供商,在云、数据中心和边缘一致运行
- 无限可扩展性:使用标准 Kubernetes 或完全抽象的 Serverless,纵向扩展至 100 个内核
- 易于集成:简洁的应用程序接口可将模型集成到应用程序中,并在生产中对其进行监控
DeepSparse 如何实现GPU 级性能?
DeepSparse 利用模型的稀疏性来提高性能。
通过剪枝和量化进行稀疏化是一种被广泛研究的技术,它能在保持高精度的同时,以数量级减少执行网络所需的大小和计算量。DeepSparse 具有稀疏感知能力,这意味着它可以跳过归零参数,减少前向传递的计算量。由于稀疏计算现在受内存限制,DeepSparse 按深度执行网络,将问题分解为Tensor Columns(适合缓存的垂直计算条纹)。
在高速缓存中按深度执行压缩计算的稀疏网络使 DeepSparse 能够在 CPU 上实现GPU 级性能!
如何创建基于数据训练的YOLOv5 稀疏版本?
Neural Magic的开源模型库 SparseZoo 包含每个YOLOv5 模型的预解析检查点。使用与Ultralytics 集成在一起的 SparseML,只需一条CLI 命令,就可以在数据上微调稀疏检查点。
DeepSparse 的使用方法
我们将举例说明如何利用 DeepSparse 对 YOLOv5s 的稀疏版本进行基准测试和部署。
安装 DeepSparse
运行以下程序安装 DeepSparse。建议使用虚拟环境Python 。
收集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 上运行以下程序即可安装:
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 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 社区可免费用于研究和测试。请从我们的文档开始。