随着深度学习模型在各种应用中的广泛部署,对模型推理的准确性和性能要求也越来越高。为了应对这一挑战,可以使用加速推理技术,通过专用硬件和/或库来加快推理过程。英特尔与微软合作,通过将OpenVINO™与Torch-ORT集成,重新定义了在Intel®硬件上的推理,同时保持了原生PyTorch体验。
OpenVINO™与Torch-ORT的集成为PyTorch开发者提供了在他们选择的框架内工作的能力,同时还能获得OpenVINO™工具包的速度和推理能力,这是通过内联优化实现的,用于加速PyTorch应用程序。这种集成的好处包括:
在本案例研究中,将讨论如何使用OpenVINO™与Torch-ORT集成重新训练PyTorchYOLOv7模型,并在Google Colab上评估与原生PyTorch相比的性能。
本文的目标是比较在Intel® CPU上的推理性能,因此将此分为两个笔记本:第一个笔记本中,使用GPU计算来训练YOLOv7。在训练模型后将其保存到Google Drive中,以便第二个笔记本用于推理。在第二个笔记本中,在Intel® CPU计算上运行推理,以基准测试原生PyTorch性能与OpenVINO™与Torch-ORT集成的性能。
所有相关的代码都可以在中找到。
通常来说,GPU的性能通常是CPU的3倍,但这会带来显著的成本增加。例如,AWS第三代Intel® Xeon®可扩展(Ice Lake)实例-c6i.2xlarge的按需成本为每小时0.34美元,而基于NVIDIA GPU的p3.2xlarge实例的成本为每小时3.06美元。如果能在运行推理工作负载时,以CPU的成本节省获得加速的推理性能提升,在财务上将处于更好的位置。
要重新训练YOLOv7模型,请参考博客文章“如何在自定义数据集上训练YOLOv7模型”。
让直接进入评估推理性能笔记本。如果还没有用自己的自定义数据集重新训练YOLOv7模型,已经在中为此基准测试提供了一个模型(best.pt)。
一旦访问了推理笔记本,建议将其保存一份副本。可以通过选择文件>另存为副本在驱动器中来做到这一点,以将笔记本分叉到自己的Google Drive中,这样就可以保存更改。
还需要确认运行时是CPU,为此笔记本。转到运行时>更改运行时类型>硬件加速器>无。
在训练笔记本中,在自定义数据集上训练了模型,然后将该模型保存到Google Drive中。在推理笔记本中,在Colab笔记本中挂载了Google Drive,这样就可以轻松地从笔记本内部访问模型。
注意:如果没有重新训练的模型,可以使用中的预训练模型。它位于/content/yolov7/runs/best.pt。
首先使用CPU上的原生PyTorch评估了YOLOv7模型的性能。已经调整了下面的自定义参数来实现这一点。有关更多详细信息,请参见detect.py接受的参数。
# 对detect.py进行了以下2个小改动以在CPU上运行:
# 注释掉了detect.py中的第38行和第39行,因为代码使用了jit trace。
# 在第84行和第85行添加了代码以启用设备类型为"cpu"
# 现在,进入yolov7目录,并使用新的detect_without_jit.py文件对样本图像进行评估:
如果没有从之前的训练笔记本中获得训练好的模型,运行此命令:
!python detect_without_jit.py --weights /content/yolov7/runs/best.pt --conf 0.25 --img-size 640 --source UWH -6 /test/images/DJI_0021_mp4-32_jpg.rf.0d9b746d8896d042b55a14c8303b4f36.jpg
如果有保存在Google Drive中想要使用的已训练模型,运行此命令:
!python detect_without_jit.py --weights /content/gdrive/MyDrive/TrainedModel/best.pt --conf 0.25 --img-size 640 --source UWH -6 /test/images/DJI_0021_mp4-32_jpg.rf.0d9b746d8896d042b55a14c8303b4f36.jpg
在这里可以看到使用原生PyTorch的结果:
4 black-hats, 9 bodysurfaces, Done. (901.6ms) Inference, (19.1ms) NMS
INFERENCE TIME WITH NATIVE PYTORCH IS 901.6 ms
The image with the result is saved in: runs/detect/exp/DJI_0021_mp4-32_jpg.rf.0d9b746d8896d042b55a14c8303b4f36.jpg
Done. (2.070s)
现在将进行相同的评估,但使用OpenVINO™集成Torch-ORT。首先,需要pip安装torch-ort-infer包:
# 安装torch-ort-infer
!pip install torch-ort-infer
已经调整了下面的自定义参数来实现这一点。有关更多详细信息,请参见detect.py接受的参数。在这里,只添加了2行代码,就可以使用OpenVINO™集成Torch-ORT提升性能:
line 17: from torch_ort import ORTInferenceModule
line 71: model = ORTInferenceModule(model)
这些更改已进行并复制到一个新文件detect_ort.py中。现在使用新的detect_ort.py文件对样本图像进行评估:
如果没有从之前的训练笔记本中获得训练好的模型,运行此命令:
!python detect_ort.py --weights /content/yolov7/runs/best.pt --conf 0.25 --img-size 640 --source UWH -6 /test/images/DJI_0021_mp4-32_jpg.rf.0d9b746d8896d042b55a14c8303b4f36.jpg
如果有保存在Google Drive中想要使用的已训练模型,运行此命令:
!python detect_ort.py --weights /content/gdrive/MyDrive/TrainedModel/best.pt --conf 0.25 --img-size 640 --source UWH -6 /test/images/DJI_0021_mp4-32_jpg.rf.0d9b746d8896d042b55a14c8303b4f36.jpg
在这里可以看到使用OpenVINO™集成Torch-ORT的结果:
4 black-hats, 9 bodysurfaces, Done. (778.2ms) Inference, (1.6ms) NMS
INFERENCE TIME WITH OPENVINO™ INTEGRATION WITH TORCH-ORT IS 778.2 ms
The image with the result is saved in: runs/detect/exp2/DJI_0021_mp4-32_jpg.rf.0d9b746d8896d042b55a14c8303b4f36.jpg
Done. (8.239s)
Google Colab目前使用的是具有每个插座2个核心的Intel® Xeon CPU,并且是一个共享硬件资源,但仍然可以看到使用OpenVINO™集成Torch-ORT对YOLOV7模型的性能有大约13%的提升。当然,值得注意的是,只添加了2行额外的代码就实现了这一点。如上所述的测试图像的结果,没有准确性的下降。