使用 Neural Magic 的 DeepSparse 部署 YOLOv5
欢迎使用软件交付的 AI。
本指南介绍了如何使用 Neural Magic 的 DeepSparse 部署 YOLOv5。
DeepSparse 是一款在 CPU 上具有卓越性能的推理运行时。例如,与 ONNX Runtime 基准相比,DeepSparse 在同一台机器上运行 YOLOv5s 的速度提升了 5.8 倍!
你的 深度学习 工作负载首次能够满足生产环境的性能需求,而无需硬件加速器带来的复杂性和高昂成本。简单来说,DeepSparse 为你提供了 GPU 级的性能和软件级的简洁性:
- 灵活的部署:可在云端、数据中心和边缘环境中使用任何硬件提供商(从 Intel 到 AMD 再到 ARM)保持一致的运行表现
- 无限的可扩展性:垂直扩展至数百个核心,通过标准 Kubernetes 进行水平扩展,或使用 Serverless 实现完全抽象
- 轻松集成:通过简洁的 API 将模型集成到应用程序中并在生产环境中进行监控
DeepSparse 是如何实现 GPU 级性能的?
DeepSparse 利用模型稀疏性来获得性能提升。
通过剪枝和量化实现的稀疏化是一项研究广泛的技术,它可以在保持高 精度 的同时,大幅减少执行网络所需的规模和计算量。DeepSparse 是稀疏感知的,这意味着它会跳过置零的参数,从而在一次前向传播中缩减计算量。由于稀疏计算现在受限于内存,DeepSparse 会在缓存中深度优先地执行网络,将问题分解为 Tensor Columns(张量列),即适合缓存的垂直计算条。
采用压缩计算并在缓存中进行深度优先执行的稀疏网络,使 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 中 ONNX 文件的 SparseZoo stub
- 指向文件系统中 ONNX 模型的本地路径
以下示例使用标准的密集型和剪枝量化型 YOLOv5s 检查点,通过以下 SparseZoo stubs 进行标识:
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.jpgPython 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)如果你在云端运行,可能会遇到 OpenCV 无法找到 libGL.so.1 的错误。你可以安装缺失的库:
apt-get install libgl1或者使用完全避免 GUI 依赖的无头 (headless) Ultralytics 包:
pip install ultralytics-opencv-headlessHTTP 服务器
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"]Annotate CLI
你还可以使用 annotate 命令让引擎将标注后的照片保存到磁盘上。尝试使用 --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 的基准测试脚本,在 YOLOv5s 上对比 DeepSparse 和 ONNX Runtime 的吞吐量。
基准测试是在 AWS c6i.8xlarge 实例(16 核)上运行的。
Batch 32 性能对比
ONNX Runtime 基准
在 Batch 32 时,ONNX Runtime 使用标准的密集型 YOLOv5s 可达到 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.9025DeepSparse 密集性能
虽然 DeepSparse 在优化后的稀疏模型上表现最佳,但它在标准的密集型 YOLOv5s 上表现也同样出色。
在 Batch 32 时,DeepSparse 使用标准的密集型 YOLOv5s 可达到 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.5546DeepSparse 稀疏性能
当将稀疏性应用于模型时,DeepSparse 相较于 ONNX Runtime 的性能优势会进一步增强。
在 Batch 32 时,DeepSparse 使用剪枝量化型 YOLOv5s 可达到 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.2452Batch 1 性能对比
对于延迟敏感的 Batch 1 场景,DeepSparse 也能比 ONNX Runtime 获得速度提升。
ONNX Runtime 基准
在 Batch 1 时,ONNX Runtime 使用标准的密集型 YOLOv5s 可达到 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.0921DeepSparse 稀疏性能
在 Batch 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 实例具备 VNNI 指令集,如果权重以 4 个为块进行剪枝,DeepSparse 的吞吐量可以进一步提高。
在 Batch 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 Community 可免费用于研究和测试。查看其 文档 开始上手。
有关使用 DeepSparse 部署 YOLOv5 的更多信息,请查看 Neural Magic 的 DeepSparse 文档 以及 Ultralytics 关于 DeepSparse 集成的博客文章。