绿色检查
链接复制到剪贴板

利用Neural Magic的 DeepSparse 部署Ultralytics YOLOv5 ,在 CPU 上实现GPU-Class 级性能

利用Neural Magic 的 DeepSparse 在 CPU 上实现GPU 级性能,增强Ultralytics YOLOv5 模型的训练和部署。实现更快、可扩展的YOLOv5 部署。

想要加快培训和部署您的 YOLOv5模型?我们为您提供帮助!介绍我们最新的合作伙伴、 Neural Magic.Neural Magic 提供的软件工具强调模型的峰值性能和工作流程的简易性,因此我们很自然地携手提供解决方案,使YOLOv5 部署流程更加完善。

DeepSparse是Neural Magic的CPU 推理运行时,它利用神经网络中的稀疏性和低精度算术,在商品硬件上提供卓越的性能。例如,与ONNX Runtime 基准相比,DeepSparse 在同一台机器上运行YOLOv5 的速度提高了 5.8 倍

YOLOv5 与 DeepSparse 的吞吐量比较

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

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

在通用 CPU 上实现GPU 级性能

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

通过剪枝和量化进行稀疏化处理,可以在保持高精度的同时,以数量级减少执行网络所需的大小和计算量。DeepSparse 具备稀疏感知能力,可跳过乘加零,减少前向传递的计算量。由于稀疏计算受内存限制,DeepSparse 按深度执行网络,将问题分解为Tensor Columns,即适合缓存的垂直计算条纹。

DeepSparse 和Ultralytics YOLOv5  网络

在高速缓存中按深度执行压缩计算的稀疏网络使 DeepSparse 能够在 CPU 上实现GPU 级性能!

创建根据自定义数据训练的YOLOv5 稀疏版本

Neural Magic的开源模型库 SparseZoo 包含每个YOLOv5 模型的预解析检查点。使用与Ultralytics 集成的 SparseML,只需一条CLI 命令,就能在数据上微调稀疏检查点。

详情请查看Neural Magic的YOLOv5 文档。

使用 DeepSparse 部署YOLOv5

安装 DeepSparse

运行以下程序安装 DeepSparse。建议使用虚拟环境Python 。

pip install deepsparse[server,yolo,onnxruntime].

收集ONNX 文件

DeepSparse 接受ONNX 格式的模型,可以以

  • 通往ONNX 模型的本地路径
  • SparseZoo 存根,用于识别 SparseZoo 中的模型

我们将把标准密集 YOLOv5 与经过剪枝量化的 YOLOv5 进行比较,后者由以下 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 -Obasilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpg

Python 应用程序接口

管道将预处理和输出后处理封装在运行时周围,为将 DeepSparse 添加到应用程序提供了一个简洁的界面。DeepSparse-Ultralytics 集成包括一个开箱即用的管道,可接受原始图像并输出边界框。

创建管道并运行推理:

从 deepsparse 导入管道

# 本地文件系统中的图像列表
images = ["basilica.jpg"]

# 创建管道
model_stub = "zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none"
yolo _pipeline = Pipeline.create(
task="yolo",
model_path=model_stub,
)

# 在图像上运行推理,接收边界框 + 类别
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-mesa-glx

HTTP 服务器

DeepSparse 服务器运行于流行的 FastAPI 网络框架和 Uvicorn 网络服务器之上。只需一个CLI 命令,您就可以轻松地用 DeepSparse 建立模型服务端点。服务器支持 DeepSparse 的任何管道,包括使用YOLOv5 进行对象检测,使您能够向端点发送原始图像并接收边界框。

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

deepsparse.server \
--taskyolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none

使用Python 的请求包提出请求的示例:

导入请求、json

# 用于推理的图像列表(客户端的本地文件)
path = ['basilica.jpg']
files = [('request', open(img, 'rb')) for img in path]

# 通过 HTTP 向 /predict/from_files 端点发送请求
url = 'http://0.0.0.0:5543/predict/from_files'
resp = requests.post(url=url, files=files)

# 响应以 JSON 格式返回
annotations = json.loads(resp.text) # 注释结果字典
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 --sourcebasilica.jpg

运行上述命令将创建一个注释-结果文件夹,并将注释图像保存在其中。

附有注释的Basilica  YOLOv5

基准性能

我们将使用 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

> 原始模型路径:zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> 批量大小:32
> 情景:同步
> 吞吐量(项/秒):41.9025

深度稀疏密集性能

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

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

> 原始模型路径:zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> 批量大小:32
> 场景:同步
> 吞吐量(项/秒):69.5546

DeepSparse 稀疏性能

当稀疏性应用于模型时,DeepSparse 的性能比ONNX Runtime 提升得更多。

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

> 原始模型路径:zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> 批量大小:32
> 场景:同步
> 吞吐量(项/秒):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

> 原始模型路径:zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> 批量大小:1
> 情景:同步
> 吞吐量(项/秒):48.0921

DeepSparse 稀疏性能

当稀疏性应用于模型时,DeepSparse 的性能比ONNX Runtime 提升得更多。

在批次 1 中,DeepSparse 使用经过剪枝量化的 YOLOv5s 实现了每秒 135 幅图像的速度,性能比ONNX Runtime提高了 2.8 倍

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 32 -nstreams 1

> 原始模型路径:zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> 批量大小:1
> 场景:同步
> 吞吐量(项/秒):134.9468

由于 c6i.8xlarge 实例具有 VNNI 指令,如果权重以 4 块为单位剪枝,DeepSparse 的吞吐量将进一步提高。

在批次 1 中,DeepSparse 利用 4 块剪枝量化 YOLOv5 实现了 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

> 原始模型路径:zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni
> 批量大小:1
> 场景:同步
> 吞吐量(项/秒):179.7375

好了!您就可以使用 DeepSparse 优化YOLOv5 部署了。

开始使用YOLOv5 和 DeepSparse

要与我们取得联系,请加入我们的社区,并给我们留下您的问题和意见。查看Ultralytics YOLOv5 存储库和完整的Neural Magic 文档,以部署YOLOv5

在Ultralytics ,我们与其他初创公司建立了商业合作伙伴关系,以帮助我们为我们出色的开源工具(如YOLOv5 )的研究和开发提供资金,从而使这些工具对所有人都是免费的。本文可能包含这些合作伙伴的关联链接。

Facebook 徽标Twitter 徽标LinkedIn 徽标复制链接符号

在此类别中阅读更多内容

让我们共同打造人工智能的未来

开始您的未来机器学习之旅