Ultralytics YOLO27:

YOLO26 模型的 TensorRT 导出#

在高性能环境中部署计算机视觉模型时,可能需要一种能够最大限度提升速度和效率的格式。当你在 NVIDIA GPU 上部署模型时,尤其如此。

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

TensorRT#

NVIDIA TensorRT optimization workflow

由 NVIDIA 开发的 TensorRT 是一种面向高速深度学习推理的高级软件开发套件(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 支持精度校准,使模型能够针对特定的精度要求进行微调。这包括对 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 运行时 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

# Load a YOLO26 model
model = YOLO("yolo26n.pt")

# Export the model to TensorRT format
model.export(format="engine")  # creates 'yolo26n.engine'
Predict
from ultralytics import YOLO

# Load the exported TensorRT model
model = YOLO("yolo26n.engine")

# Run inference
results = model("https://ultralytics.com/images/bus.jpg")
验证
from ultralytics import YOLO

# Load the exported TensorRT model
model = YOLO("yolo26n.engine")

# Validate accuracy on the COCO8 dataset
metrics = model.val(data="coco8.yaml")

导出参数#

参数类型默认值描述
formatstr'engine'导出模型的目标格式,用于定义其与各种部署环境的兼容性。
imgszinttuple640模型输入所需的图像尺寸。可以使用表示正方形图像的整数,也可以使用元组 (height, width) 指定具体尺寸。
quantizeintstrNone量化精度:16 (FP16) 或 8 (INT8/PTQ;需要校准 data/fraction);32/未设置则为 FP32。使用 quantize=8 训练的检查点会直接从其携带的范围导出 INT8,无需校准。替换了已废弃的 half/int8 标志。
dynamicboolFalse允许使用动态输入尺寸,从而提高处理不同图像尺寸时的灵活性。
simplifyboolTrue使用 onnxslim 简化模型图,从而可能提升性能和兼容性。
opsetintNone指定中间 ONNX 图的 ONNX 算子集版本。如果未设置,则使用最新的受支持版本。
workspacefloatNoneNone设置 TensorRT 优化的最大工作空间大小(以 GiB 为单位),在内存使用量和性能之间进行平衡;使用 None 可由 TensorRT 自动分配内存,最大不超过设备上限。
nmsbool,可选None选择原始输出(None,默认)、嵌入式 NMS(True)或无 NMS 的头部(False)。
batchint1指定导出模型的批量推理大小,或指定导出模型在 predict 模式下并发处理的最大图像数量。
datastrNone数据集 YAML 的路径,对量化至关重要;而分类则接受数据集目录或内置数据集名称。如果在使用 quantize=8 时省略,Ultralytics 会为模型任务选择默认的校准数据集;使用 quantize=8 训练的检查点则不需要数据集。
fractionfloatintlist1.0校准子集可以按比例、图像数量或 [train, val, test] 的比例/数量指定。包含两个项目的列表会保留 test 的完整内容,同时跳过 0
devicestrNone指定导出设备:GPU(device=0)、NVIDIA Jetson 上的 DLA(device=dla:0device=dla:1)。
提示

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

JetPack 与 DLA 兼容性

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

如需详细了解导出流程,请访问 Ultralytics 导出文档页面

使用 INT8 量化导出 TensorRT#

使用带有 INT8 精度的 TensorRT 导出 Ultralytics YOLO 模型会执行训练后量化 (PTQ)。TensorRT 对 PTQ 使用校准,当 YOLO 模型在代表性输入数据上处理推理时,校准会测量每个激活张量内部的激活分布,然后使用该分布来估计每个张量的缩放值。每个作为量化候选的激活张量都有一个通过校准过程推导出的关联缩放。通过量化感知训练微调的带有 quantize=8 的检查点已经携带了其 INT8 范围,因此其导出操作会直接使用这些范围并跳过校准。

TensorRT 11 量化

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

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

提示

必须务必确保使用实际部署 TensorRT 模型权重的同一设备,以 INT8 精度执行导出,因为不同设备上的校准结果可能有所不同。

配置 INT8 导出#

使用 export 导出 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 进行自动分配,或者减小 imgszbatch 的值,以降低内存需求。

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

  • batch:推理时使用的最大 batch 大小。推理期间可以使用更小的 batch,但推理不接受大于指定大小的 batch。

注意

使用较小的 batch 可能导致 INT8 校准期间缩放不准确。这是因为该过程会根据所看到的数据进行调整。较小的 batch 可能无法覆盖完整的数值范围,从而导致最终校准出现问题。使用更大的批次大小有助于确保校准结果更具代表性。

NVIDIA 的实验表明,他们建议在进行 INT8 量化校准时,使用至少 500 张能够代表你的模型数据的校准图像。这只是一个指导原则,并非硬性要求,你需要通过实验来确定在你的数据集上表现良好所需的内容由于使用 TensorRT 进行 INT8 校准需要校准数据,因此在导出未在 quantize=8 处使用 quantize=8(训练后量化)进行 TensorRT 训练的检查点时,请务必使用 data 参数,并使用 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)!
)

# Load the exported TensorRT INT8 model
model = YOLO("yolo26n.engine", task="detect")

# Run inference
result = model.predict("https://ultralytics.com/images/bus.jpg")
  1. 使用动态轴导出;dynamic 保持为 False,除非显式设置。有关更多信息,请参阅导出参数
  2. 将导出模型和 INT8 校准的最大 batch 大小设置为 8。
  3. 为转换过程分配 4 GiB 内存,而不是占用整个设备。
  4. 使用 COCO 数据集进行校准,具体使用验证中的图像(共 5,000 张)。
校准缓存

TensorRT 会生成校准 .cache,使用相同数据时可以重新利用它来加快后续模型权重的导出,但如果数据差异很大,或 batch 的值发生大幅变化,可能会导致校准效果不佳。在这些情况下,应重命名现有的 .cache 并将其移动到其他目录,或彻底删除。

将 YOLO 与 TensorRT INT8 结合使用的优势#

  • **模型大小减小:**从 FP32 量化为 INT8 可以将模型大小缩小 4 倍(在磁盘或内存中),从而加快下载速度、降低存储需求,并在部署模型时减少内存占用。

  • **功耗更低:**与 FP32 模型相比,INT8 导出 YOLO 模型的低精度运算耗电量更少,尤其适用于电池供电设备。

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

关于推理速度的说明

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

将 YOLO 与 TensorRT INT8 结合使用的缺点#

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

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

  • **硬件依赖:**校准和性能增益可能高度依赖硬件,并且模型权重的可迁移性较低。

Ultralytics YOLO TensorRT 导出性能#

NVIDIA A100#

性能

在 Ubuntu 22.04.3 LTS、python 3.10.12ultralytics==8.2.4tensorrt==8.6.1.post1 上测试

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

注意

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

精确率评估测试平均
(毫秒)
最小值 | 最大值
(毫秒)
mAPval
50(B)
mAPval
50-95(B)
batch尺寸
(像素)
FP32Predict0.520.51 | 0.568640
FP32COCOval0.520.520.371640
FP16Predict0.340.34 | 0.418640
FP16COCOval0.330.520.371640
INT8Predict0.280.27 | 0.318640
INT8COCOval0.290.470.331640

消费级 GPU#

检测性能(COCO)

在 Windows 10.0.19045、python 3.10.9ultralytics==8.2.4tensorrt==10.0.0b6 上测试

注意

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

精确率评估测试平均
(毫秒)
最小值 | 最大值
(毫秒)
mAPval
50(B)
mAPval
50-95(B)
batch尺寸
(像素)
FP32Predict1.060.75 | 1.888640
FP32COCOval1.370.520.371640
FP16Predict0.620.75 | 1.138640
FP16COCOval0.850.520.371640
INT8Predict0.520.38 | 1.008640
INT8COCOval0.740.470.331640

嵌入式设备#

检测性能(COCO)

在 JetPack 6.0(L4T 36.3)Ubuntu 22.04.4 LTS、python 3.10.12ultralytics==8.2.16tensorrt==10.0.1 上测试

注意

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

精确率评估测试平均
(毫秒)
最小值 | 最大值
(毫秒)
mAPval
50(B)
mAPval
50-95(B)
batch尺寸
(像素)
FP32Predict6.116.10 | 6.298640
FP32COCOval6.170.520.371640
FP16Predict3.183.18 | 3.208640
FP16COCOval3.190.520.371640
INT8Predict2.302.29 | 2.358640
INT8COCOval2.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 with calibration `data` (i.e. COCO, ImageNet, or DOTAv1 for appropriate model task)
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 of the same image
        verbose=False,
        device="cuda",
    )
验证配置

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

from ultralytics import YOLO

model = YOLO("yolo26n.engine")
results = model.val(
    data="data.yaml",  # COCO, ImageNet, or DOTAv1 for appropriate model task
    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")  # creates 'yolo26n.engine'
      
      # Run inference
      model = YOLO("yolo26n.engine")
      results = model("https://ultralytics.com/images/bus.jpg")

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

  • 使用 TensorRT 优化 YOLO26 模型可以带来多项优势:

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

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

  • 可以,你可以使用带有 INT8 量化的 TensorRT 导出 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 带来的性能提升可能因所使用的硬件而异。以下是一些典型基准测试结果:

    • NVIDIA A100

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

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

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

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

评论