Ultralytics YOLO27: 加入候补名单。
获取 YOLO 许可
集成

计算机视觉推理中的 ONNX 与 TensorRT:基准测试及如何选择

ONNX Runtime 与 TensorRT 在计算机视觉推理中的对比:在 19 款 NVIDIA GPU 上测量 Ultralytics YOLO26 的速度和准确率,以及如何选择。

Miles DeansMiles Deans9 分钟阅读
AI 生成的物流场景及示意性检测结果;插图展示了 Ultralytics Platform 上 YOLO26n 在 NVIDIA L4 上的基准测试延迟。

ONNX 和 TensorRT 并非真正的竞争对手。ONNX 是一种模型格式,而 TensorRT 是 NVIDIA 的推理引擎,通常以 ONNX 文件作为输入。真正需要选择的是如何运行该文件:使用 ONNX Runtime,它支持多种硬件,甚至可以将工作交给 TensorRT;或者将文件编译成独立的 TensorRT 引擎,但这种引擎只能在 NVIDIA GPU 上运行。在对 19 款 NVIDIA GPU 上的 Ultralytics YOLO26 进行的 Ultralytics Platform 基准测试中,每款 GPU 和每种模型尺寸下,TensorRT FP16 都比公布的 ONNX FP16 结果更快,准确率差异在 0.001 mAP50-95 以内。不同模型尺寸的中位数加速比为 1.85x 至 2.55x。基准测试没有说明 ONNX 结果使用了哪个 ONNX Runtime 执行提供程序,因此无法据此确定 ONNX Runtime 的整体表现,也无法确定它与 TensorRT 执行提供程序搭配时的表现。对于运行在 NVIDIA GPU 上的 Ultralytics YOLO26,如果延迟很重要,可以先尝试 TensorRT FP16;如果同一个模型文件需要在多种硬件上运行,则使用 ONNX Runtime。Ultralytics YOLO 只需一个参数即可导出为这两种格式。

从哪里开始使用 Ultralytics YOLO:

部署从这里开始Ultralytics YOLO 导出
NVIDIA GPU,且延迟很重要TensorRT FP16format="engine", quantize=16
CPU、非 NVIDIA 硬件或混合设备集群ONNX Runtimeformat="onnx"
NVIDIA GPU 上的 ONNX Runtime API搭配 TensorRT 执行提供程序的 ONNX Runtimeformat="onnx"

ONNX 与 TensorRT:格式、运行时和引擎#

这个比较涉及三种不同的东西:

  • ONNX(开放神经网络交换)是一种文件格式,能够以不依赖框架的方式存储训练后模型的计算图和权重。你可以将模型从 PyTorch 导出为 ONNX,以便其他工具读取模型。
  • ONNX Runtime 用于运行 ONNX 模型。它会将任务交给称为 执行提供程序 的硬件后端,例如 CPU、CUDA 和 TensorRT,因此同一个文件既能在笔记本电脑的 CPU 上运行,也能在云端 GPU 上运行。
  • TensorRT 通过 ONNX 解析器读取模型,通常读取的是 ONNX 文件。它会融合层、为所构建的 GPU 上的每项操作选择最快的内核,并生成经过优化的 引擎。

所以,真正要比较的是 ONNX Runtime 和 TensorRT。ONNX Runtime 也可以通过其 TensorRT 执行提供程序调用 TensorRT,这样你就可以保留 ONNX Runtime 的 API,同时由 TensorRT 运行它支持的子图。ONNX Runtime 建议在其后注册 CUDA 执行提供程序,这样 TensorRT 不支持的节点就可以改由 CUDA 运行。

Ultralytics YOLO 模型导出为 ONNX 后,由 ONNX Runtime 运行或由 TensorRT 编译的示意图

一个 ONNX 文件,两种路径:ONNX Runtime 可在支持的硬件上运行该文件,而 TensorRT 会将其编译成适用于一种 NVIDIA GPU 类型的引擎。Ultralytics YOLO 可导出为这两种格式。

基准测试:YOLO26 在 ONNX Runtime 与 TensorRT 上的表现#

以下数据来自 Ultralytics Platform 推理基准测试。每个 Ultralytics YOLO26 检测模型都导出为表中所示的格式,然后在 Ultralytics Platform GPU 上,以批次大小 1 和 640 像素的输入,在 COCO val2017 上测量其推理延迟;测量时排除了预热阶段,并对每次运行的耗时进行了 sigma 截断。准确率是模型在 COCO val2017 上的 mAP50-95,每种格式和精度各测量一次。比较范围为 19 款 NVIDIA GPU(Ampere、Ada 和 Hopper),这些 GPU 均有四种格式的测试结果。

基准测试页面未说明 ONNX 结果使用了哪个 ONNX Runtime 执行提供程序,也没有将任何结果标注为使用 ONNX Runtime 的 TensorRT 执行提供程序;后者会将模型中受支持的部分交给 TensorRT 运行。这些 ONNX 结果反映的是基准测试所用的配置;实际性能会因 ONNX Runtime 执行提供程序而异。如果你想使用底层由 TensorRT 执行的 ONNX Runtime API,请在自己的硬件上对这种组合进行基准测试。

Ultralytics 基准测试中 YOLO26n TensorRT FP16 在不同 NVIDIA GPU 上的延迟

你可以在推理选项卡中切换模型尺寸、格式和精度,然后按延迟、准确率或成本对所有 GPU 排序。

各 YOLO26 模型尺寸的 TensorRT FP16 相较于 ONNX FP16 的中位数加速比柱状图

在每种模型尺寸和所有 GPU 上,TensorRT FP16 都比公布的 ONNX FP16 结果更快;页面未说明这些 ONNX 结果使用了哪个 ONNX Runtime 执行提供程序。柱状条显示 19 款 GPU 上的中位数加速比;误差线显示单款 GPU 上的最低和最高加速比。数据根据 Ultralytics Platform 推理基准测试计算。

模型mAP50-95:ONNX FP16mAP50-95:TensorRT FP16mAP50-95:TensorRT INT8TensorRT FP16 相较于 ONNX FP16 的加速比(中位数、范围)TensorRT INT8 相较于 TensorRT FP16 的加速比(中位数、范围)
YOLO26n0.3970.3970.3572.55x(1.79–3.28x)0.90x(0.79–1.07x)
YOLO26s0.4710.4710.4362.19x(1.83–2.93x)1.04x(0.89–1.19x)
YOLO26m0.5190.5190.4701.85x(1.52–2.54x)1.20x(0.90–1.38x)
YOLO26l0.5360.5350.5012.03x(1.67–2.73x)1.08x(0.92–1.33x)
YOLO26x0.5630.5640.4881.88x(1.67–2.11x)1.19x(0.92–1.67x)

根据 Ultralytics Platform 推理基准测试计算。加速比的计算方式为同一款 GPU 上的 ONNX FP16 延迟 ÷ TensorRT FP16 延迟,或 TensorRT FP16 延迟 ÷ TensorRT INT8 延迟,因此大于 1x 表示 TensorRT FP16(或 INT8)更快。中位数基于拥有全部四种格式测试结果的 19 款 NVIDIA GPU 计算;范围为这些 GPU 上的最小值和最大值。准确率是每种格式和精度对应的报告 mAP50-95。ONNX FP16 指公布的 ONNX Runtime 结果,其执行提供程序未作说明。

基准测试页面公布的四款常见 GPU 延迟,单位为毫秒/图像:基准测试页面:

GPU模型PyTorch FP16ONNX FP16TensorRT FP16TensorRT INT8
L4YOLO26n4.982.041.031.09
L4YOLO26x7.769.805.733.43
RTX 4090YOLO26n6.672.560.841.00
RTX 4090YOLO26x10.945.202.682.25
A100 SXMYOLO26n8.723.981.651.79
A100 SXMYOLO26x15.027.253.863.91
H100 SXMYOLO26n6.363.091.171.48
H100 SXMYOLO26x10.265.532.662.62

有三点值得注意:

  1. TensorRT FP16 在所有 GPU 和所有模型尺寸上的表现都优于公布的 ONNX FP16 结果,准确率差异在 0.001 mAP50-95 以内。如果你要在这些 NVIDIA GPU 上部署并且需要较低延迟,可以先尝试 TensorRT FP16。
  2. INT8 并非总能带来优势。在 YOLO26n 上,它在 19 款 GPU 中有 17 款的速度都慢于 TensorRT FP16,并且 mAP50-95 下降了 0.04。在较大的模型上,INT8 更常带来加速;例如,在 L4 上的 YOLO26x 加速比最高可达 1.67x,但 mAP50-95 会下降 0.034 至 0.076。
  3. 七款 Blackwell GPU 没有 ONNX 结果。基准测试页面将此归因于测试环境中的 ONNX Runtime 没有 Blackwell 内核。TensorRT 则在这七款 GPU 上都运行了。

这些结果涵盖了基准测试页面所示的配置,即批次大小为 1、输入为 640 像素;因此,在做出选择之前,请使用自己的数据,在部署设备上对自己的模型进行基准测试。

TensorRT 中的 FP16 与 INT8#

降低精度是另一个重要的优化手段,而基准测试说明了为什么需要进行测试:

  • FP16(半精度)会将权重和激活值的大小减半,相较于 FP32。在 Ultralytics Platform 基准测试中,TensorRT FP16 的准确率与 ONNX FP16 和 PyTorch FP16 相差不超过 0.003 mAP50-95。
  • INT8 使用 8 位整数存储权重和激活值,这是一种模型量化方式。它需要进行校准:使用一组有代表性的图像运行模型,以测量激活值范围。Ultralytics Platform 基准测试使用 NVIDIA ModelOpt,并以 COCO128 作为校准数据。

正如基准测试方法所述,INT8 在计算受限的大型模型上最能发挥优势。在最小的模型上,额外的量化操作可能与 FP16 的耗时相当,甚至会让速度变慢。请使用来自你自己领域的图像进行校准,并在部署 INT8 引擎之前用自己的数据验证准确率。

对比各 YOLO26 模型尺寸下 TensorRT INT8 与 FP16 的两张柱状图:左侧为加速比,右侧为 mAP50-95 的下降幅度

在 19 款 GPU 上,INT8 的中位数速度在 YOLO26n 上慢于 FP16,在较大的模型上最高快约 1.2x;但所有模型尺寸的 mAP50-95 都下降了 0.034 至 0.076。数据根据 Ultralytics Platform 推理基准测试计算。

引擎的可移植性与动态输入尺寸#

默认情况下,TensorRT 引擎与构建它的 GPU 和 TensorRT 版本绑定,因此,在 RTX 4090 上构建的引擎不适合直接复制到 H100 或 Jetson 上。TensorRT 提供了硬件和版本兼容性选项来放宽这些限制,但稳妥的默认做法是在要部署的设备上构建引擎,或为该设备构建引擎,并在升级 TensorRT 后重新构建。出于这个原因,Ultralytics Platform 的导出选项卡会要求你为 TensorRT 导出选择 GPU 类型。ONNX 文件没有这种限制:只要有 ONNX Runtime 和合适的执行提供程序,同一个文件就能运行。

两种格式都支持可变输入尺寸。对于 TensorRT,动态形状需要一个优化配置文件,用来设置输入尺寸的最小值、最优值和最大值;运行时的输入必须在该范围内。导出 Ultralytics YOLO 模型时,dynamic=True 会为 ONNX 和 TensorRT 启用动态输入形状。正如 NVIDIA 的动态形状指南所述,固定形状能让 TensorRT 有更多优化空间,因此只有在输入确实会变化时才使用动态形状,并对两种方式都进行基准测试。

何时选择 ONNX Runtime,何时选择 TensorRT#

  • 云端或本地部署的 NVIDIA GPU,且延迟很重要:选择 TensorRT,从 FP16 开始。较大的模型可以尝试 INT8,但要先校准并验证。
  • 边缘端的 NVIDIA Jetson:选择 TensorRT。请参阅 NVIDIA Jetson 指南。
  • CPU、非 NVIDIA 硬件或混合设备集群:使用 ONNX 和 ONNX Runtime,并选择每台机器支持的执行提供程序。
  • 还不确定部署硬件:先导出为 ONNX。之后你可以从同一个模型构建 TensorRT 引擎。
  • Intel CPU、GPU 或 NPU:可以考虑使用 Intel 的推理工具包 OpenVINO。

如需了解格式完整列表及其对比,请参阅模型部署选项指南。精度也不是唯一的优化手段:模型尺寸和输入分辨率同样重要;我们的剪枝与量化指南还介绍了另外两种缩小模型的方法。

将 Ultralytics YOLO 导出为 ONNX 和 TensorRT#

使用一个 format 参数,Ultralytics YOLO 就能导出为这两种格式;你还可以直接使用导出的模型进行预测或验证:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")

model.export(format="onnx", quantize=16)  # ONNX FP16,用于 ONNX Runtime
model.export(format="engine", quantize=16)  # TensorRT FP16 引擎,在此 GPU 上构建
# 若要改用 INT8,请使用数据集 YAML 进行校准(coco8.yaml 是一个小型演示数据集;请使用你自己的数据集):
# model.export(format="engine", quantize=8, data="coco8.yaml")

trt_model = YOLO("yolo26n.engine")
results = trt_model("https://ultralytics.com/images/bus.jpg")

quantize=16 用于选择 FP16,quantize=8 用于选择 INT8。两种引擎导出都会写入 yolo26n.engine,因此每次只运行其中一种。对于 INT8,请将 data 指向你自己的数据集 YAML,以便使用类似于实际部署场景的图像进行校准。如需了解所有选项,请参阅导出参数以及 ONNX 和 TensorRT 集成指南;也可以按照我们的分步文章学习导出为 ONNX和使用 TensorRT 优化。你也可以在 Ultralytics Platform 上通过浏览器导出训练好的模型。

常见问题

  • ONNX 是模型格式,而不是引擎,因此公平的比较对象是 ONNX Runtime 和 TensorRT。在对 19 款 NVIDIA GPU 上的 Ultralytics YOLO26 进行的 Ultralytics Platform 基准测试中,每款 GPU 上公布的 ONNX FP16 结果都慢于 TensorRT FP16;不同模型尺寸的计算所得中位数加速比为 1.85x 至 2.55x,mAP50-95 的差异最多为 0.001。基准测试没有说明 ONNX 结果使用了哪个 ONNX Runtime 执行提供程序,也没有任何结果标注为使用其 TensorRT 执行提供程序;如果你需要使用 ONNX Runtime 的 API,请自行测试这种组合。

  • 可以。ONNX 通常是 TensorRT 的输入:TensorRT 的 ONNX 解析器会读取模型并据此构建引擎。ONNX Runtime 也可以通过其 TensorRT 执行提供程序调用 TensorRT。

  • 不能。在 Ultralytics Platform 基准测试中,19 款 GPU 有 17 款在运行 YOLO26n 时,TensorRT INT8 的速度慢于 TensorRT FP16。在较大的模型上,INT8 更常带来加速;在能够运行所有格式的 19 款 GPU 上,YOLO26m 和 YOLO26x 的中位数加速比约为 1.2x。但每次都会损失 0.034 至 0.076 mAP50-95,因此请先用自己的数据验证 INT8 模型。

  • 不要指望可以。默认情况下,TensorRT 引擎与构建它时使用的 GPU 和 TensorRT 版本绑定,因此应在要部署的设备上或为该设备构建引擎。请保留 ONNX 文件作为可移植副本,并为每个目标设备重新构建引擎。

  • 通常选择 TensorRT:NVIDIA JetPack 内置 TensorRT;在 Jetson 本机上构建引擎可以针对该设备进行优化。上面的基准测试不包括 Jetson,因此请先在自己的模块上测量,再做决定。NVIDIA Jetson 指南介绍了 Ultralytics YOLO 的设置和导出步骤。

作者

Miles Deans
Miles Deans

SEO 主管 · Ultralytics

Miles Deans 是常驻伦敦的 Ultralytics SEO 负责人,负责推动公司的搜索策略和自然增长。他此前曾在 Adobe、Kaizen 和 Virgin Media O2 任职。

评论

提出问题、分享你的结果,或帮助其他人。

探索解决方案

体育领域的计算机视觉

体育领域的计算机视觉

了解 Ultralytics YOLO 如何通过球员和球追踪、表现分析、教练洞察及运动员康复,推动体育视觉技术的发展。
了解详情
航空影像计算机视觉

航空影像计算机视觉

使用 Ultralytics YOLO 将无人机和航空影像转化为农业、水产养殖、保护工作和地理空间分析的实时洞察。
了解详情
航空航天中的计算机视觉

航空航天中的计算机视觉

使用 Ultralytics YOLO 将计算机视觉应用于航空航天领域,包括飞机检查、跑道 FOD 检测、机场地面作业和复合材料缺陷检测。
了解详情
安防领域的计算机视觉

安防领域的计算机视觉

使用 Ultralytics YOLO 模型守护每个场所。视觉 AI 可用于周界监控、威胁检测、车牌识别和工作场所安全。
了解详情
机器人领域的计算机视觉

机器人领域的计算机视觉

使用 Ultralytics YOLO 模型提升智能机器的能力。机器人领域的视觉 AI 可用于自主导航、感知、目标跟踪和实时控制。
了解详情
物流中的计算机视觉

物流中的计算机视觉

借助 Ultralytics YOLO 模型优化物流流程。视觉 AI 可用于包裹检查、分拣、车辆跟踪和仓库安全实时监控。
了解详情
零售中的计算机视觉

零售中的计算机视觉

借助 Ultralytics YOLO 模型重新构想零售。视觉 AI 可用于库存跟踪、货架监控、排队管理和更深入的客户洞察。
了解详情
医疗领域的计算机视觉

医疗领域的计算机视觉

借助 Ultralytics YOLO 模型构建医疗解决方案。医疗领域的视觉 AI 可加快医学影像处理、优化诊断并监测患者。
了解详情
制造业中的计算机视觉

制造业中的计算机视觉

利用 Ultralytics YOLO 模型优化制造流程。视觉 AI 可用于质量控制、缺陷检测、个人防护装备合规检查和装配线自动化。
了解详情
汽车领域的计算机视觉

汽车领域的计算机视觉

利用 Ultralytics YOLO 模型在汽车领域应用计算机视觉。视觉 AI 可提升道路安全、驾驶辅助和车辆自动化水平,让道路更智能。
了解详情
农业中的计算机视觉

农业中的计算机视觉

借助 Ultralytics YOLO 模型,将视觉 AI 引入智慧农业。为作物监测、牲畜追踪和精准农业提供支持,从而提高产量并实现更智能的生产。
了解详情

让我们携手构建 AI 的未来!

开启你的旅程,迎接机器学习的未来