用于 YOLO 的 OpenVINO 推理优化
简介
在部署深度学习模型时,特别是用于目标检测的模型(如 Ultralytics YOLO 模型),实现最佳性能至关重要。本指南深入探讨了如何利用 Intel 的 OpenVINO 工具包来优化推理,重点关注延迟和吞吐量。无论您是从事消费级应用还是大规模部署,理解和应用这些优化策略都将确保您的模型在各种设备上高效运行。
针对延迟进行优化
对于需要单个模型根据单个输入立即做出响应的应用(在消费场景中很常见),延迟优化至关重要。目标是最大限度地减少输入和推理结果之间的延迟。但是,实现低延迟需要仔细考虑,尤其是在运行并发推理或管理多个模型时。
延迟优化的关键策略:
- 每个设备单次推理: 实现低延迟的最简单方法是限制每个设备一次只进行一次推理。额外的并发通常会导致延迟增加。
- 利用子设备: 诸如多路 CPU 或多 tile GPU 之类的设备可以通过利用其内部子设备来执行多个请求,而延迟增加极小。
- OpenVINO 性能提示: 利用 OpenVINO 的
ov::hint::PerformanceMode::LATENCY
为ov::hint::performance_mode
模型编译期间的属性简化了性能调整,提供了一种与设备无关且面向未来的方法。
管理首次推理延迟:
- 模型缓存: 为了缓解模型加载和编译时间对延迟的影响,请尽可能使用模型缓存。对于无法进行缓存的场景,CPU 通常提供最快的模型加载时间。
- 模型映射与读取: 为了减少加载时间,OpenVINO 使用映射代替了模型读取。但是,如果模型位于可移动驱动器或网络驱动器上,请考虑使用
ov::enable_mmap(false)
切换回读取。 - AUTO 设备选择: 此模式在 CPU 上开始推理,一旦准备就绪就转移到加速器,从而无缝地减少了首次推理延迟。
优化吞吐量
吞吐量优化对于同时服务于大量推理请求的场景至关重要,可以在不显著牺牲单个请求性能的情况下,最大限度地提高资源利用率。
吞吐量优化方法:
-
OpenVINO 性能提示: 一种高级的、面向未来的方法,可以使用性能提示来增强各种设备的吞吐量。
import openvino.properties.hint as hints config = {hints.performance_mode: hints.PerformanceMode.THROUGHPUT} compiled_model = core.compile_model(model, "GPU", config)
-
显式批处理和流: 一种更精细的方法,涉及显式批处理和使用流进行高级性能调优。
面向吞吐量应用的设计:
为了最大限度地提高吞吐量,应用程序应该:
- 并行处理输入,充分利用设备的功能。
- 将数据流分解为并发的推理请求,并安排并行执行。
- 利用带有回调的 Async API 来保持效率并避免设备资源耗尽。
多设备执行:
OpenVINO 的多设备模式简化了吞吐量的扩展,它可以在无需应用程序级别的设备管理的情况下,自动平衡跨设备的推理请求。
真实世界的性能提升
使用 Ultralytics YOLO 模型实施 OpenVINO 优化可以显著提高性能。正如基准测试中所示,用户可以在 Intel CPU 上体验到高达 3 倍的推理速度提升,并且在 Intel 的硬件范围内(包括集成 GPU、独立 GPU 和 VPU)可以实现更大的加速。
例如,在 Intel Xeon CPUs 上运行 YOLOv8 模型时,OpenVINO 优化版本在每张图片的推理时间上始终优于 PyTorch 版本,且不会影响准确率。
实际应用
要导出和优化您的 Ultralytics YOLO 模型以用于 OpenVINO,您可以使用 export 功能:
from ultralytics import YOLO
# Load a model
model = YOLO("yolov8n.pt")
# Export the model to OpenVINO format
model.export(format="openvino", half=True) # Export with FP16 precision
导出后,您可以使用优化后的模型运行推理:
# Load the OpenVINO model
ov_model = YOLO("yolov8n_openvino_model/")
# Run inference with performance hints for latency
results = ov_model("path/to/image.jpg", verbose=True)
结论
通过 OpenVINO 优化 Ultralytics YOLO 模型以实现低延迟和高吞吐量,可以显著提高应用程序的性能。通过仔细应用本指南中概述的策略,开发人员可以确保其模型高效运行,满足各种部署场景的需求。请记住,针对延迟或吞吐量进行优化之间的选择取决于您的具体应用程序需求和部署环境的特性。
有关更详细的技术信息和最新更新,请参阅 OpenVINO 文档 和 Ultralytics YOLO 仓库。这些资源提供了深入的指南、教程和社区支持,以帮助您充分利用深度学习模型。
确保您的模型达到最佳性能不仅仅是调整配置;而是要了解您的应用程序的需求并做出明智的决策。无论您是为实时响应进行优化,还是为大规模处理最大化吞吐量,Ultralytics YOLO 模型和 OpenVINO 的结合都为开发人员提供了一个强大的工具包,可以部署高性能 AI 解决方案。
常见问题
如何使用 OpenVINO 优化 Ultralytics YOLO 模型以实现低延迟?
优化 Ultralytics YOLO 模型以实现低延迟涉及几个关键策略:
- 每个设备单次推理: 限制每个设备一次只进行一次推理,以最大限度地减少延迟。
- 利用子设备: 利用诸如多路 CPU 或多 tile GPU 之类的设备,它们可以处理多个请求,而延迟增加最小。
- OpenVINO 性能提示: 使用 OpenVINO 的
ov::hint::PerformanceMode::LATENCY
在模型编译期间进行简化、与设备无关的调优。
有关优化延迟的更多实用技巧,请查看我们指南的延迟优化部分。
为什么要使用 OpenVINO 优化 Ultralytics YOLO 的吞吐量?
OpenVINO 通过最大限度地利用设备资源而不牺牲性能来提高 Ultralytics YOLO 模型的吞吐量。主要优势包括:
- 性能提示: 跨设备的简单、高级的性能调优。
- 显式批处理和流: 用于高级性能的微调。
- 多设备执行: 自动推理负载平衡,简化应用程序级别的管理。
配置示例:
import openvino.properties.hint as hints
config = {hints.performance_mode: hints.PerformanceMode.THROUGHPUT}
compiled_model = core.compile_model(model, "GPU", config)
在我们的详细指南的吞吐量优化部分中了解更多关于吞吐量优化的信息。
在 OpenVINO 中,减少首次推理延迟的最佳实践是什么?
为了减少首次推理延迟,请考虑以下实践:
- 模型缓存: 使用模型缓存来减少加载和编译时间。
- 模型映射与读取: 默认使用映射 (
ov::enable_mmap(true)
),但如果模型位于可移动或网络驱动器上,则切换到读取 (ov::enable_mmap(false)
)。 - AUTO 设备选择: 利用 AUTO 模式从 CPU 推理开始,并无缝过渡到加速器。
有关管理首次推理延迟的详细策略,请参阅管理首次推理延迟部分。
如何在使用 Ultralytics YOLO 和 OpenVINO 时平衡延迟和吞吐量优化?
平衡延迟和吞吐量优化需要了解您的应用需求:
- 延迟优化: 适用于需要即时响应的实时应用(例如,消费级应用)。
- 吞吐量优化: 最适合具有许多并发推理的场景,从而最大限度地利用资源(例如,大规模部署)。
使用 OpenVINO 的高级性能提示和多设备模式可以帮助达到适当的平衡。根据您的具体要求选择合适的OpenVINO 性能提示。
除了 OpenVINO 之外,我是否可以将 Ultralytics YOLO 模型与其他 AI 框架一起使用?
是的,Ultralytics YOLO 模型具有高度的通用性,可以与各种 AI 框架集成。选项包括:
- TensorRT: 对于 NVIDIA GPU 优化,请遵循TensorRT 集成指南。
- CoreML: 对于 Apple 设备,请参阅我们的CoreML 导出说明。
- TensorFlow.js: 对于 Web 和 Node.js 应用程序,请参阅TF.js 转换指南。
在 Ultralytics 集成页面上探索更多集成。