Neural Magic的 DeepSparse
欢迎使用软件交付的人工智能。
本指南介绍如何使用Neural Magic 的 DeepSparse 部署YOLOv5 。
DeepSparse 是一种推理运行时,在 CPU 上性能卓越。例如,与ONNX Runtime 基准相比,DeepSparse 为在同一台机器上运行的 YOLOv5s 提供了 5.8 倍的速度提升!
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.
在高速缓存中按深度执行压缩计算的稀疏网络使 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 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 社区可免费用于研究和测试。请从我们的文档开始。