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

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

想要加速 YOLOv5 模型的训练和部署吗?我们为您提供解决方案!隆重推出我们的最新合作伙伴 Neural Magic。Neural Magic 提供的软件工具侧重于最佳模型性能和工作流程的简易性,因此我们自然而然地走到了一起,共同提供一种解决方案,以进一步优化 YOLOv5 的部署流程。
DeepSparse 是 Neural Magic 的 CPU 推理运行时,它利用神经网络中的稀疏性和低精度算法,在通用硬件上提供卓越的性能。例如,与 ONNX Runtime 基线相比,DeepSparse 在同一台机器上运行 YOLOv5s 时,速度提高了 5.8 倍!

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

通过缓存中的深度压缩计算的稀疏网络,使DeepSparse能够在CPU上提供GPU级别的性能!
Neural Magic 的开源模型仓库 SparseZoo 包含每个 YOLOv5 模型的预稀疏化检查点。使用与 Ultralytics 集成的 SparseML,您可以使用单个 CLI 命令将稀疏检查点微调到您的数据上。
运行以下命令来安装 DeepSparse。我们建议您使用带有 Python 的虚拟环境。
pip install deepsparse[server,yolo,onnxruntime]
DeepSparse 接受 ONNX 格式的模型,可以通过以下方式传递:
我们将比较标准密集型 YOLOv5s 与经过剪枝-量化的 YOLOv5s,后者通过以下 SparseZoo 存根识别:
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.jpg
Pipelines 将预处理和输出后处理封装在运行时周围,为将 DeepSparse 添加到应用程序提供了一个清晰的接口。DeepSparse-Ultralytics 集成包括一个开箱即用的 Pipeline,它接受原始图像并输出边界框。
创建管道并运行推理:
from deepsparse import Pipeline
# 本地文件系统中的图像列表
images = ["basilica.jpg"]
# 创建 Pipeline
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
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 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:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpg
运行上述命令将创建一个 annotation-results 文件夹,并将带注释的图像保存在其中。

我们将使用 DeepSparse 的基准测试脚本,比较 DeepSparse 在 YOLOv5s 上的吞吐量与 ONNX Runtime 的吞吐量。
这些基准测试是在AWS c6i.8xlarge实例(16核)上运行的。
在 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
> 原始模型路径: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> 批次大小: 32
> 场景: sync
> 吞吐量 (items/sec): 41.9025
虽然 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
> 原始模型路径: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> 批次大小: 32
> 场景: sync
> 吞吐量 (items/sec): 69.5546
当将稀疏性应用于模型时,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
> 原始模型路径: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> 批次大小: 32
> 场景: sync
> 吞吐量 (items/sec): 241.2452
对于延迟敏感的 batch 1 场景,DeepSparse 也能获得比 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
> 原始模型路径: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> 批次大小: 1
> 场景: sync
> 吞吐量 (items/sec): 48.0921
当将稀疏性应用于模型时,DeepSparse 相对于 ONNX Runtime 的性能提升甚至更强。
在 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 32 -nstreams 1
> 原始模型路径: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> 批次大小: 1
> 场景: sync
> 吞吐量 (items/sec): 134.9468
由于 c6i.8xlarge 实例具有 VNNI 指令,如果权重以 4 个块为单位进行修剪,则可以进一步提高 DeepSparse 的吞吐量。
在 batch 1 时,DeepSparse 使用 4-block 经过剪枝量化的 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
> 原始模型路径: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni
> 批次大小: 1
> 场景: sync
> 吞吐量 (items/sec): 179.7375
瞧!您已准备好使用 DeepSparse 优化您的 YOLOv5 部署。
要与我们联系,请加入我们的社区,并留下您的问题和评论。查看Ultralytics YOLOv5存储库和完整的用于部署YOLOv5的Neural Magic文档。
在 Ultralytics,我们与其他初创公司进行商业合作,以帮助我们资助我们出色的开源工具(如 YOLOv5)的研发,从而使它们对所有人免费。本文可能包含指向这些合作伙伴的联盟链接。