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

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

想加快培训和部署您的 YOLOv5模型?我们将为您提供帮助!介绍我们最新的合作伙伴Neural Magic。Neural Magic 提供的软件工具强调模型的峰值性能和工作流程的简易性,因此我们很自然地携手提供解决方案,使YOLOv5 部署流程更加完善。
DeepSparse是Neural Magic的CPU 推理运行时,它利用神经网络中的稀疏性和低精度算术,在商品硬件上提供卓越的性能。例如,与ONNX Runtime 基准相比,DeepSparse为在同一台机器上运行的YOLOv5s提供了5.8 倍的速度提升!

您的深度学习工作负载首次能够在满足生产的性能需求的同时,避免硬件加速器的复杂性和成本。简而言之,DeepSparse 为您提供 GPU 的性能和软件的简易性:
DeepSparse 利用模型的稀疏性来提高性能。
通过剪枝和量化进行稀疏化,可以在保持高精度的同时,大幅减少执行网络所需的大小和计算量。DeepSparse 具备稀疏感知能力,可跳过乘加零,减少前向传递的计算量。由于稀疏计算受内存限制,DeepSparse 按深度执行网络,将问题分解为Tensor 列(Tensor Columns),这是适合缓存的垂直计算条纹。

在高速缓存中按深度执行压缩计算的稀疏网络使 DeepSparse 能够在 CPU 上提供GPU性能!
Neural Magic 的开源模型库 SparseZoo 包含每个YOLOv5 模型的预解析检查点。使用与Ultralytics 集成的 SparseML,只需一条CLI 命令,就能在数据上微调稀疏检查点。
运行以下程序安装 DeepSparse。建议使用Python 虚拟环境。
pip install deepsparse[serveryolo,onnxruntime].
DeepSparse 接受ONNX 格式的模型,以
我们将比较标准密集型 YOLOv5s 与经过剪枝-量化的 YOLOv5s,后者通过以下 SparseZoo 存根识别:
zoo:ultralytics
zoo:ultralytics
DeepSparse 提供了便捷的 API,可将您的模型集成到应用程序中。
要试用下面的部署示例,请为示例调出一张样本图片,并使用以下命令将其保存为basilica.jpg:
wget -Obasilicabasilicajpg
管道将预处理和输出后处理封装在运行时周围,为将 DeepSparse 添加到应用程序提供了一个简洁的界面。Ultralytics 集成包括一个开箱即用的管道,可接受原始图像并输出边界框。
创建管道并运行推理:
from deepsparse import Pipeline
# 本地文件系统中的图像列表
images = [basilica.jpg"]
# 创建管道
model_stub = "zoo:ultralytics"
yolo_pipeline = Pipeline.create(
task=yolo",
model_path=model_stub,
)
# 在图像上运行推理,接收边界框 + 类别
pipeline_outputs =yolo(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
DeepSparse 服务器运行于流行的 FastAPI 网络框架和 Uvicorn 网络服务器之上。只需一条CLI 命令,您就可以轻松地用 DeepSparse 建立模型服务端点。服务器支持 DeepSparse 的任何管道,包括使用YOLOv5 进行对象检测,使您能够向端点发送原始图像并接收边界框。
使用修剪量化的 YOLOv5s 启动服务器:
deepsparse.server\
--taskyolo \
--model_path zoo:ultralytics
使用Python 的请求包提出请求的示例:
import requests, 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"]
您还可以使用 annotate 命令让引擎将带注释的照片保存在磁盘上。尝试 --source 0 来注释您的实时网络摄像头 feed!
deepsparse.object_detection.annotate --model_filepath zoo:ultralytics--sourcebasilica.jpg
运行上述命令将创建一个 annotation-results 文件夹,并将带注释的图像保存在其中。

我们将使用 DeepSparse 的基准测试脚本,比较 DeepSparse 和ONNX Runtime 在 YOLOv5 上的吞吐量。
这些基准测试是在AWS c6i.8xlarge实例(16核)上运行的。
在批次 32 时,ONNX Runtime 使用标准密集型 YOLOv5 实现了每秒 42 幅图像的速度:
deepsparse.benchmark zoo:ultralytics-s sync -b 32 -nstreams 1 -e onnxruntime
> 原始模型路径:zoo:ultralytics/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> 批量大小:32
> 情景:同步
> 吞吐量(项/秒):41.9025
虽然 DeepSparse 在优化后的稀疏模型上表现最佳,但它在标准密集 YOLOv5s 上也表现良好。
在 batch 32 时,DeepSparse 使用标准的密集 YOLOv5s 实现了 70 图像/秒的速度——比 ORT 提高了 1.7 倍!
deepsparse.benchmark zoo:ultralytics-s sync -b 32 -nstreams 1
> 原始模型路径:zoo:cv/ultralytics/yolov5-s/pytorch/ultralytics/coco/base-none
> 批量大小:32
> 情景:同步
> 吞吐量(项/秒):69.5546
在模型中应用稀疏性后,DeepSparse 的性能比ONNX Runtime 提升得更多。
在 batch 32 时,DeepSparse 使用经过剪枝量化的 YOLOv5s 实现了 241 图像/秒的速度——比 ORT 提高了 5.8 倍!
deepsparse.benchmark zoo:ultralytics-s sync -b 32 -nstreams 1
> 原始模型路径:zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/ultralytics_quant-none
> 批量大小:32
> 情景:同步
> 吞吐量(项/秒):241.2452
在对延迟敏感的批次 1 场景中,DeepSparse 的速度也比ONNX Runtime 快。
在批次 1 中,ONNX Runtime 使用标准的高密度 YOLOv5 实现了每秒 48 幅图像的速度。
deepsparse.benchmark zoo:ultralytics-s sync -b 1 -nstreams 1 -e onnxruntime
> 原始模型路径:zoo:cv/ultralytics/yolov5-s/pytorch/ultralytics/coco/base-none
> 批量大小:1
> 情景:同步
> 吞吐量(件/秒):48.0921
在模型中应用稀疏性后,DeepSparse 的性能比ONNX Runtime 提升得更多。
在批次 1 中,DeepSparse 使用经过剪枝量化的 YOLOv5 实现了 135 幅图像/秒的速度,性能是 ONNX Runtime 的 2.8 倍!
deepsparse.benchmark zoo:ultralytics-s sync -b 32 -nstreams 1
> 原始模型路径:zoo:ultralytics/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:ultralytics-s sync -b 1 -nstreams 1
> 原始模型路径:zoo:cv/ultralytics/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni
> 批量大小:1
> 场景:同步
> 吞吐量(项/秒):179.7375
好了!您就可以使用 DeepSparse 优化YOLOv5 部署了。
要与我们取得联系,请加入我们的社区,给我们留下您的问题和意见。查看Ultralytics YOLOv5 存储库和完整的Neural Magic 文档,了解如何部署YOLOv5。
在Ultralytics,我们经常与其他初创公司合作,帮助我们为YOLOv5 等开源工具的研发提供资金支持,使这些工具能够免费提供给所有人使用。本文可能包含这些合作伙伴的联盟链接。