Ultralytics YOLO27:
Get Started

YOLO26 模型的 TensorRT 导出#

在高性能环境中部署计算机视觉模型时,可能需要一种能够最大限度提升速度和效率的格式。将模型部署到 NVIDIA GPU 上时,这一点尤为重要。

使用 TensorRT 导出格式,可以优化Ultralytics YOLO26模型,使其在 NVIDIA 硬件上实现快速、高效的推理。本指南将提供易于遵循的转换步骤,帮助你在深度学习项目中充分利用 NVIDIA 的先进技术。

TensorRT#

NVIDIA TensorRT optimization workflow

TensorRT由 NVIDIA 开发,是一款先进的软件开发套件 (SDK),专为高速深度学习推理而设计。它非常适用于目标检测等实时应用。

这个工具包可优化适用于 NVIDIA GPU 的深度学习模型,从而实现更快速、更高效的运行。TensorRT 模型会经过 TensorRT 优化,其中包括层融合、精度校准(INT8 和 FP16)、动态张量内存管理和内核自动调优等技术。将深度学习模型转换为 TensorRT 格式,可以让开发者充分发挥 NVIDIA GPU 的潜力。

TensorRT 以兼容多种模型格式而著称,包括 TensorFlow、PyTorch 和 ONNX,为开发者提供灵活的解决方案,以便集成和优化来自不同框架的模型。这种多功能性支持在各种硬件和软件环境中高效部署模型。

TensorRT 引擎与特定硬件和运行时绑定

TensorRT 会在用于构建引擎的 GPU 上对引擎进行配置和调优。请针对部署所用的 GPU 架构构建引擎,并确保 TensorRT/CUDA 运行时匹配;不要将 .engine 文件视为可移植的模型格式。对于边缘部署,Ultralytics Platform提供八种 Jetson 目标设备选项,并分别记录了实际构建和验证状态;你也可以在目标设备上本地导出。

TensorRT 模型的主要功能#

TensorRT 模型具备多种主要功能,有助于提升高速深度学习推理的效率和效果:

  • 精度校准:TensorRT 支持精度校准,可针对特定准确率要求微调模型。TensorRT 还支持 INT8 和 FP16 等低精度格式,在保持可接受准确率的同时进一步提升推理速度。

  • 层融合:TensorRT 优化过程包含层融合,即将神经网络的多个层合并为一个运算。这可以减少计算开销,并通过最大限度地减少内存访问和计算来提升推理速度。

TensorRT neural network layer fusion optimization

  • 动态张量内存管理:TensorRT 可在推理过程中高效管理张量内存使用情况,减少内存开销并优化内存分配,从而更高效地利用 GPU 内存。

  • 内核自动调优:TensorRT 会自动调优内核,为模型的每一层选择最优的 GPU 内核。这种自适应方法可确保模型充分利用 GPU 的计算能力。

TensorRT 部署选项#

在查看将 YOLO26 模型导出为 TensorRT 格式的代码之前,我们先来了解 TensorRT 模型通常用于哪些场景。

TensorRT 提供多种部署选项,各选项在易于集成、性能优化和灵活性之间各有侧重:

  • 在 TensorFlow 中部署:此方法将 TensorRT 集成到 TensorFlow 中,使优化后的模型能够在熟悉的 TensorFlow 环境中运行。对于包含受支持层和不受支持层的模型,此方法很有用,因为 TF-TRT 能够高效处理这些层。

NVIDIA TensorRT optimization workflow

  • 独立 TensorRT Runtime API:提供细粒度控制,非常适合对性能要求极高的应用。该方式较为复杂,但支持自定义实现不受支持的算子。

  • NVIDIA Triton Inference Server:支持来自各种框架的模型,特别适用于云端或边缘推理,并提供并发模型执行和模型分析等功能。

支持的任务#

TensorRT 导出支持 Ultralytics 的全部七种任务。语义分割和深度估计仅适用于 YOLO26,因为只有 YOLO26 系列提供这两种预测头。

任务YOLOv8YOLO11YOLO26
检测✅✅✅
分割✅✅✅
语义分割❌❌✅
深度估计❌❌✅
分类✅✅✅
姿态✅✅✅
OBB✅✅✅

将 YOLO26 模型导出为 TensorRT#

将 YOLO26 模型转换为 TensorRT 格式,可以提高执行效率并优化性能。

安装#

要安装所需软件包,请运行:

安装
# Install the required package for YOLO26
pip install ultralytics

有关安装流程的详细说明和最佳实践,请查看我们的 YOLO26 安装指南。安装 YOLO26 所需软件包时,如果遇到困难,请参阅我们的常见问题指南,获取解决方案和建议。

用法#

开始阅读使用说明前,请务必了解 Ultralytics 提供的 YOLO26 模型,以便根据项目需求选择最合适的模型。

TensorRT 格式支持导出、预测和验证模式。推理和验证需要 NVIDIA GPU。导出模型后,加载导出的模型即可运行推理或验证其准确率。

导出
from ultralytics import YOLO

# 加载 YOLO26 模型
model = YOLO("yolo26n.pt")

# 将模型导出为 TensorRT 格式
model.export(format="engine")  # 创建 'yolo26n.engine'
预测
from ultralytics import YOLO

# 加载导出的 TensorRT 模型
model = YOLO("yolo26n.engine")

# 运行推理
results = model("https://ultralytics.com/images/bus.jpg")
验证
from ultralytics import YOLO

# 加载导出的 TensorRT 模型
model = YOLO("yolo26n.engine")

# 在 COCO8 数据集上验证准确率
metrics = model.val(data="coco8.yaml")

导出参数#

参数类型默认值说明
formatstr'engine'导出模型的目标格式,用于定义与各种部署环境的兼容性。
imgszint 或 tuple640模型输入所需的图像尺寸。正方形图像可使用整数;若要指定具体尺寸,则可使用元组 (height, width)。
quantizeint 或 strNone量化精度:16 (FP16) 或 8 (INT8/PTQ;需要校准 data/fraction);32/未设置表示 FP32。使用 quantize=8 训练的检查点始终会根据其携带的范围导出为 INT8,无需校准。此设置取代了已弃用的 half/int8 标志。
dynamicboolFalse允许使用动态输入尺寸,从而更灵活地处理不同图像尺寸。
simplifyboolTrue使用 onnxslim 简化模型图,可能提升性能和兼容性。
opsetintNone指定中间 ONNX 图的 ONNX opset 版本。若未设置,则使用最新的受支持版本。
workspacefloat 或 NoneNone设置用于 TensorRT 优化的最大工作空间大小(单位为 GiB),以平衡内存使用和性能;使用 None 可让 TensorRT 自动分配内存,分配上限为设备最大容量。
nmsbool,可选None选择原始输出(None,默认)、嵌入式 NMS(True)或无 NMS 检测头(False)。
batchint1指定导出模型的批量推理大小,或导出模型在 predict 模式下可同时处理的最大图像数。
datastrNone数据集 YAML 文件的路径,是量化所必需的;分类任务则需要数据集目录或内置数据集名称。如果使用 quantize=8 但未指定此项,Ultralytics 会为该模型任务选择默认校准数据集;使用 quantize=8 训练的检查点则不需要此项。
fractionfloat、int 或 list1.0校准子集,可按比例、图像数量或 [train, val, test] 比例/数量指定。包含两个项目的列表会让 test 保持完整,而 0 会跳过它。
devicestrNone指定导出设备:GPU(device=0),或 NVIDIA Jetson 的 DLA(device=dla:0 或 device=dla:1)。
提示

请确保导出为 TensorRT 时使用支持 CUDA 的 GPU。

JetPack 和 DLA 兼容性

TensorRT 11.2.1 不支持 JetPack,包括 Thor;请使用 JetPack 版本支持的 TensorRT 10.x 运行时。对于 device=dla:0 或 device=dla:1,NVIDIA 指出 TensorRT 10.7 是最后一个支持 DLA的版本。TensorRT 11.0、11.1 和 11.2 均不支持 DLA。

有关导出流程的更多详情,请访问 Ultralytics 导出文档页面。

使用 INT8 量化导出 TensorRT#

使用 TensorRT 将 Ultralytics YOLO 模型以 INT8精度导出时,会执行训练后量化 (PTQ)。TensorRT 会对 PTQ 执行校准:在 YOLO 模型使用具有代表性的输入数据进行推理时,测量每个激活张量中激活值的分布,然后据此估算各张量的缩放值。每个适合量化的激活张量都有关联的缩放值,该值由校准过程推导得出。通过 quantize=8 和量化感知训练微调的检查点已携带 INT8 范围,因此导出时会使用这些范围并跳过校准。

TensorRT 11 量化

TensorRT 11 移除了隐式量化和 IInt8Calibrator 接口。在 TensorRT 11 及更高版本中,Ultralytics 使用 NVIDIA ModelOpt 显式量化执行 INT8 量化:在构建强类型引擎之前,将 Q/DQ 节点插入 ONNX 计算图;FP16 则通过 ModelOpt AutoCast 混合精度转换实现。quantize=8、quantize=16 和 data 参数的工作方式不变;首次使用时会自动安装 ModelOpt。TensorRT 7-10 则使用下文介绍的旧版校准器。

处理采用隐式量化的网络时,TensorRT 会按需使用 INT8 来优化层的执行时间。如果某一层使用 INT8 运行更快,且其数据输入和输出已分配量化缩放值,TensorRT 就会为该层分配 INT8 精度内核;否则,TensorRT 会根据哪种精度能让该层运行得更快,为内核选择 FP32 或 FP16。

提示

至关重要的一点是,必须使用与部署时运行 TensorRT 模型权重相同的设备,以 INT8 精度进行导出,因为不同设备的校准结果可能有所不同。

配置 INT8 导出#

使用 Ultralytics YOLO 模型的导出功能时提供的参数会对导出模型的性能产生显著影响。你还需要根据设备可用资源选择参数,不过默认参数应该适用于大多数 Ampere(或更新架构)的 NVIDIA 独立 GPU。GPU 导出使用的校准算法为 "MINMAX_CALIBRATION",NVIDIA Jetson 上的 DLA 导出则使用 "ENTROPY_CALIBRATION_2"。你可以在 TensorRT 开发者指南中详细了解可用选项。Ultralytics 的测试发现,"MINMAX_CALIBRATION" 是 GPU 导出的最佳选择,系统会根据导出设备自动选择该算法。

  • workspace:控制转换模型权重时分配的设备内存大小(单位为 GiB)。

    • 根据校准需求和可用资源调整 workspace 的值。较大的 workspace 可能会延长校准时间,但可以让 TensorRT 探索更多优化策略,从而可能提升模型性能和准确率。相反,较小的 workspace 可以缩短校准时间,但可能限制优化策略,影响量化模型的质量。

    • 默认值为 workspace=None,这会让 TensorRT 自动分配内存。手动配置时,如果校准发生崩溃(无警告退出),可能需要增大此值。

    • 如果 workspace 的值大于设备可用内存,TensorRT 会在导出期间报告 UNSUPPORTED_STATE,这意味着应降低 workspace 的值或将其设为 None。

    • 如果 workspace 设为最大值后校准失败或崩溃,请考虑使用 None 自动分配内存,或减小 imgsz 和 batch 的值以降低内存需求。

    • 请记住,INT8 校准针对每台设备分别进行。借用“高端”GPU进行校准,可能会导致模型在另一台设备上推理时性能不佳。

  • batch:推理时使用的最大批次大小。使用 dynamic=True 时,推理可以使用更小的批次,但不接受大于指定大小的批次。

注意

使用较小的批次可能导致 INT8 校准时的缩放不准确,因为校准过程会根据所见数据进行调整。较小的批次可能无法覆盖完整的取值范围,进而影响最终校准效果。使用较大的批次大小有助于获得更具代表性的校准结果。

NVIDIA 通过实验建议,使用 INT8 量化校准时,至少使用 500 张能够代表模型数据的校准图像。这只是一个指导建议,并非硬性要求,而且你需要通过实验确定哪些设置适合你的数据集。由于 TensorRT 的 INT8 校准需要校准数据,导出未经 quantize=8(训练后量化)训练的检查点时,请务必使用 data 参数,并将其设置为 TensorRT 的 quantize=8,再使用 data="my_dataset.yaml",以便利用验证图像进行校准。使用 quantize=8 训练的检查点会跳过校准,因此无需设置 data。使用 INT8 量化导出 TensorRT 时,如果未为 data 传入值,系统会默认使用根据模型任务选择的某个“小型”示例数据集,而不会报错。

示例
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.export(
    format="engine",
    dynamic=True,  # (1)!
    batch=8,  # (2)!
    workspace=4,  # (3)!
    quantize=8,
    data="coco.yaml",  # (4)!
)

# 加载导出的 TensorRT INT8 模型
model = YOLO("yolo26n.engine", task="detect")

# 运行推理
result = model.predict("https://ultralytics.com/images/bus.jpg")
  1. 使用动态轴导出,接受从 32 像素到导出 imgsz 两倍范围内的输入尺寸;除非显式设置,否则 dynamic 保持为 False。更多信息请参阅导出参数。
  2. 将导出模型和 INT8 校准的最大批次大小设为 8。
  3. 分配 4 GiB 内存,而非占用整个设备的内存进行转换。
  4. 使用 COCO 数据集进行校准,具体使用验证图像(共 5,000 张)。

使用 YOLO 与 TensorRT INT8 的优势#

  • 减小模型体积: 将 FP32 量化为 INT8 可将模型体积缩小至原来的 1/4(无论是在磁盘上还是内存中),从而加快下载速度、降低存储需求,并减少部署模型时的内存占用。

  • 降低功耗: 使用 INT8 导出的 YOLO 模型执行低精度运算时,功耗可能低于 FP32 模型,尤其适用于电池供电的设备。

  • 提升推理速度: TensorRT 会针对目标硬件优化模型,从而可能提升 GPU、嵌入式设备和加速器上的推理速度。

关于推理速度的说明

使用导出为 TensorRT INT8 的模型进行推理时,前几次调用的预处理、推理和/或后处理时间可能会比平常更长。推理期间更改 imgsz 时也可能出现这种情况,尤其是在 imgsz 与导出时指定的值不同时(导出 imgsz 被设置为 TensorRT“optimal”配置文件)。

使用 YOLO 与 TensorRT INT8 的缺点#

  • 评估指标下降: 使用较低精度意味着 mAP、Precision、Recall 或任何用于评估模型性能的其他指标都可能有所下降。Sigmoid 层会保持较高精度,以保留分数校准效果,但 INT8 仍可能改变置信度值,因此应根据 INT8 模型自身的 F1 曲线选择运行阈值。请参阅性能结果部分,比较在各种设备的小样本上使用 INT8 导出时 mAP50 和 mAP50-95 的差异。

  • 增加开发时间: 为数据集和设备找到 INT8 校准的“optimal”设置,可能需要进行大量测试。

  • 依赖硬件: 校准和性能提升可能高度依赖硬件,模型权重的可迁移性也会降低。

Ultralytics YOLO TensorRT 导出性能#

NVIDIA A100#

性能

测试环境:Ubuntu 22.04.3 LTS、python 3.10.12、ultralytics==8.2.4、tensorrt==8.6.1.post1

这些模型在 COCO 上训练,包含 80 个预训练类别;使用示例请参阅检测文档。

注意

对于每项测试,显示使用预训练权重 yolov8n.engine 时 mean、min(最快)和 max(最慢)的推理时间

精确率评估测试平均
(毫秒)
最小值 | 最大值
(毫秒)
mAP验证
50(B)
mAP验证
50-95(B)
batch尺寸
(像素)
FP32预测0.520.51 | 0.568640
FP32COCO验证0.520.520.371640
FP16预测0.340.34 | 0.418640
FP16COCO验证0.330.520.371640
INT8预测0.280.27 | 0.318640
INT8COCO验证0.290.470.331640

消费级 GPU#

检测性能(COCO)

测试环境:Windows 10.0.19045、python 3.10.9、ultralytics==8.2.4、tensorrt==10.0.0b6

注意

对于每项测试,显示使用预训练权重 yolov8n.engine 时 mean、min(最快)和 max(最慢)的推理时间

精确率评估测试平均
(毫秒)
最小值 | 最大值
(毫秒)
mAP验证
50(B)
mAP验证
50-95(B)
batch尺寸
(像素)
FP32预测1.060.75 | 1.888640
FP32COCO验证1.370.520.371640
FP16预测0.620.75 | 1.138640
FP16COCO验证0.850.520.371640
INT8预测0.520.38 | 1.008640
INT8COCO验证0.740.470.331640

嵌入式设备#

检测性能(COCO)

测试环境:JetPack 6.0 (L4T 36.3) Ubuntu 22.04.4 LTS、python 3.10.12、ultralytics==8.2.16、tensorrt==10.0.1

注意

对于每项测试,显示使用预训练权重 yolov8n.engine 时 mean、min(最快)和 max(最慢)的推理时间

精确率评估测试平均
(毫秒)
最小值 | 最大值
(毫秒)
mAP验证
50(B)
mAP验证
50-95(B)
batch尺寸
(像素)
FP32预测6.116.10 | 6.298640
FP32COCO验证6.170.520.371640
FP16预测3.183.18 | 3.208640
FP16COCO验证3.190.520.371640
INT8预测2.302.29 | 2.358640
INT8COCO验证2.320.460.321640
信息

请参阅我们的 NVIDIA Jetson 搭配 Ultralytics YOLO 快速入门指南,详细了解设置和配置。

信息

请参阅我们的 NVIDIA DGX Spark 搭配 Ultralytics YOLO 快速入门指南,详细了解设置和配置。

评估方法#

展开以下各部分,了解这些模型的导出和测试方式。

导出配置

有关导出配置参数的详细信息,请参阅导出模式。

from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# TensorRT FP32
out = model.export(format="engine", imgsz=640, dynamic=True, verbose=False, batch=8, workspace=2)

# TensorRT FP16
out = model.export(format="engine", imgsz=640, dynamic=True, verbose=False, batch=8, workspace=2, quantize=16)

# TensorRT INT8,使用校准 `data`(即适用于相应模型任务的 COCO、ImageNet 或 DOTAv1)
out = model.export(
    format="engine", imgsz=640, dynamic=True, verbose=False, batch=8, workspace=2, quantize=8, data="coco8.yaml"
)
预测循环

如需了解更多信息,请参阅预测模式。

import cv2

from ultralytics import YOLO

model = YOLO("yolo26n.engine")
img = cv2.imread("path/to/image.jpg")

for _ in range(100):
    result = model.predict(
        [img] * 8,  # 同一图像的 batch=8
        verbose=False,
        device="cuda",
    )
验证配置

如需详细了解验证配置参数,请参阅 val 模式。

from ultralytics import YOLO

model = YOLO("yolo26n.engine")
results = model.val(
    data="data.yaml",  # 适用于相应模型任务的 COCO、ImageNet 或 DOTAv1
    batch=1,
    imgsz=640,
    verbose=False,
    device="cuda",
)

部署导出的 YOLO26 TensorRT 模型#

成功将 Ultralytics YOLO26 模型导出为 TensorRT 格式后,就可以开始部署了。如需了解在各种环境中部署 TensorRT 模型的详细说明,请参阅以下资源:

总结#

本指南重点介绍了如何将 Ultralytics YOLO26 模型转换为 NVIDIA TensorRT 模型格式。这一步转换对于提升 YOLO26 模型的效率和速度至关重要,可使模型更有效,并适用于各种部署环境。

如需了解更多使用详情,请参阅 TensorRT 官方文档。

如果你想了解更多 Ultralytics YOLO26 集成方案,请查看我们的集成指南页面,其中提供了大量实用资源和见解。

常见问题#

  • 按照以下步骤,将 Ultralytics YOLO26 模型转换为 TensorRT 格式,以便在 NVIDIA GPU 上实现优化推理:

    1. 安装所需的软件包:

      pip install ultralytics
    2. 导出 YOLO26 模型:

      from ultralytics import YOLO
      
      model = YOLO("yolo26n.pt")
      model.export(format="engine")  # 创建 'yolo26n.engine'
      
      # 运行推理
      model = YOLO("yolo26n.engine")
      results = model("https://ultralytics.com/images/bus.jpg")

    如需了解更多详情,请参阅 YOLO26 安装指南和导出文档。

  • 使用 TensorRT 优化 YOLO26 模型有以下几项优势:

    • 更快的推理速度:TensorRT 会优化模型层,并使用精度校准(INT8 和 FP16)来加快推理,同时不会明显降低准确率。
    • 内存效率:TensorRT 会动态管理张量内存,减少开销并提高 GPU 内存利用率。
    • 层融合:将多个层合并为单个运算,从而降低计算复杂度。
    • 内核自动调优:自动为每个模型层选择经过优化的 GPU 内核,确保发挥最佳性能。

    如需了解更多信息,请参阅 NVIDIA TensorRT 官方文档和我们的 TensorRT 深度概览。

  • 可以,你可以使用 TensorRT 和 INT8 量化来导出 YOLO26 模型。此过程包含训练后量化 (PTQ) 和校准;如果检查点是使用 quantize=8(量化感知训练)训练的,则会直接导出检查点中包含的范围,无需校准:

    1. 使用 INT8 导出:

      from ultralytics import YOLO
      
      model = YOLO("yolo26n.pt")
      model.export(format="engine", batch=8, workspace=4, quantize=8, data="coco.yaml")
    2. 运行推理:

      from ultralytics import YOLO
      
      model = YOLO("yolo26n.engine", task="detect")
      result = model.predict("https://ultralytics.com/images/bus.jpg")

    如需了解更多详情,请参阅使用 INT8 量化导出 TensorRT 部分。

  • 你可以参考以下资源,在 NVIDIA Triton Inference Server 上部署 YOLO26 TensorRT 模型:

    这些指南将帮助你在各种部署环境中高效集成 YOLO26 模型。

  • TensorRT 带来的性能提升会因模型和所用硬件而异。以下是使用 YOLOv8n 测得的典型基准数据,展示了不同精度带来的相对提升:

    • NVIDIA A100:

      • FP32 推理:~0.52 毫秒 / 图像
      • FP16 推理:~0.34 毫秒 / 图像
      • INT8 推理:~0.28 毫秒 / 图像
      • INT8 精度下 mAP 略有下降,但速度显著提升。
    • 消费级 GPU(例如 RTX 3080):

      • FP32 推理:~1.06 毫秒 / 图像
      • FP16 推理:~0.62 毫秒 / 图像
      • INT8 推理:~0.52 毫秒 / 图像

    不同硬件配置的详细性能基准测试结果,请参阅性能部分。

    如需全面了解 TensorRT 性能,请参阅 Ultralytics 文档和我们的性能分析报告。

评论