利用Neural Magic 的 DeepSparse 在 CPU 上实现GPU 级性能,增强Ultralytics YOLOv5 模型的训练和部署。实现更快、可扩展的YOLOv5 部署。
想要加快培训和部署您的 YOLOv5模型?我们为您提供帮助!介绍我们最新的合作伙伴、 Neural Magic.Neural Magic 提供的软件工具强调模型的峰值性能和工作流程的简易性,因此我们很自然地携手提供解决方案,使YOLOv5 部署流程更加完善。
DeepSparse是Neural Magic的CPU 推理运行时,它利用神经网络中的稀疏性和低精度算术,在商品硬件上提供卓越的性能。例如,与ONNX Runtime 基准相比,DeepSparse 在同一台机器上运行YOLOv5 的速度提高了 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 格式的模型,可以以
我们将把标准密集 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
管道将预处理和输出后处理封装在运行时周围,为将 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
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"]
您还可以使用注释命令让引擎将注释过的照片保存在磁盘上。尝试使用 --source 0 对实时网络摄像头源进行注释!
deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --sourcebasilica.jpg
运行上述命令将创建一个注释-结果文件夹,并将注释图像保存在其中。
我们将使用 DeepSparse 的基准测试脚本,比较 DeepSparse 和ONNX Runtime 在 YOLOv5 上的吞吐量。
基准测试在 AWS c6i.8xlarge 实例(16 核)上运行。
在批次 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 的性能比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 批方案中提高速度。
在批次 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 的性能比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 部署了。
要与我们取得联系,请加入我们的社区,并给我们留下您的问题和意见。查看Ultralytics YOLOv5 存储库和完整的Neural Magic 文档,以部署YOLOv5 。
在Ultralytics ,我们与其他初创公司建立了商业合作伙伴关系,以帮助我们为我们出色的开源工具(如YOLOv5 )的研究和开发提供资金,从而使这些工具对所有人都是免费的。本文可能包含这些合作伙伴的关联链接。