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 模型提供了一系列核心功能,有助于提高其在高速深度学习推理中的效率和有效性:

  • 精度校准: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:一个支持来自不同框架模型的选项。特别适用于云端或边缘推理,它提供了并发模型执行和模型分析等功能。

将 YOLO26 模型导出到 TensorRT

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

安装

要安装所需的包,请运行:

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

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

使用方法

在深入了解使用说明之前,请务必查看 Ultralytics 提供的各种 YOLO26 模型。这将有助于你选择最符合项目需求的模型。

使用方法
from ultralytics import YOLO

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

# Export the model to TensorRT format
model.export(format="engine")  # creates 'yolo26n.engine'

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

# Run inference
results = tensorrt_model("https://ultralytics.com/images/bus.jpg")

导出参数

参数类型默认值描述
formatstr'engine'导出模型的目标格式,定义与各种部署环境的兼容性。
imgszinttuple640模型输入的所需图像尺寸。可以是正方形图像的整数,也可以是特定维度的元组 (height, width)
halfboolFalse启用 FP16(半精度)量化,减小模型大小并可能在受支持的硬件上加快推理速度。
int8boolFalse激活 INT8 量化,进一步压缩模型并以极小的准确性损失加快推理速度,主要适用于边缘设备。
dynamicboolFalse允许动态输入大小,提高了处理不同图像尺寸的灵活性。
simplifyboolTrue通过 onnxslim 简化模型图,从而潜在地提高性能和兼容性。
workspacefloatNoneNone设置 TensorRT 优化的最大工作空间大小(单位为 GiB),以平衡内存使用和性能;使用 None 可让 TensorRT 自动分配,直到达到设备的最大值。
nmsboolFalse添加非极大值抑制(NMS),这对于准确且高效的检测后处理至关重要。
batchint1指定导出模型的批量推理大小,或者导出模型在 predict 模式下将同时处理的最大图像数量。
datastr'coco8.yaml'数据集配置文件的路径(默认:coco8.yaml),这对量化至关重要。
fractionfloat1.0指定用于 INT8 量化校准的数据集比例。允许在完整数据集的子集上进行校准,这对于实验或资源受限时非常有用。如果在启用 INT8 时未指定,将使用完整数据集。
devicestrNone指定导出的设备:GPU (device=0),NVIDIA Jetson 的 DLA (device=dla:0device=dla:1)。
提示

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

有关导出过程的更多详细信息,请访问 Ultralytics 导出文档页面

通过 INT8 量化导出 TensorRT

使用带有 INT8 精度 的 TensorRT 导出 Ultralytics YOLO 模型会执行训练后量化 (PTQ)。TensorRT 使用校准进行 PTQ,该过程在 YOLO 模型对代表性输入数据进行推理处理时,测量每个激活张量内的激活分布,然后利用该分布来估计每个张量的缩放值。每个属于量化候选对象的激活张量都有一个通过校准过程推导出的关联缩放值。

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

提示

确保用于部署 TensorRT 模型权重的设备与执行 INT8 精度导出的设备相同至关重要,因为校准结果可能会因设备而异。

配置 INT8 导出

使用 export 对 Ultralytics YOLO 模型进行导出时提供的参数将 极大 地影响导出模型的性能。这些参数也需要根据可用的设备资源进行选择,不过默认参数 应该 适用于大多数 Ampere(或更新)架构的 NVIDIA 独立 GPU。所使用的校准算法是 "MINMAX_CALIBRATION",你可以在 TensorRT 开发者指南 中阅读有关可用选项的更多详细信息。Ultralytics 测试发现 "MINMAX_CALIBRATION" 是最佳选择,因此导出固定使用此算法。

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

    • 根据你的校准需求和资源可用性调整 workspace 值。虽然更大的 workspace 可能会增加校准时间,但它允许 TensorRT 探索更广泛的优化策略,从而可能增强模型性能和 准确度。相反,较小的 workspace 可以减少校准时间,但可能会限制优化策略,从而影响量化模型的质量。

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

    • TensorRT will report UNSUPPORTED_STATE during export if the value for workspace is larger than the memory available to the device, which means the value for workspace should be lowered or set to None.

    • 如果 workspace 设置为最大值但校准仍然失败或崩溃,请考虑使用 None 进行自动分配,或者通过减小 imgszbatch 的值来降低内存需求。

    • 请记住,INT8 的校准是特定于每个设备的,借用一台“高端”GPU 进行校准,可能会导致在另一台设备上进行推理时性能不佳。

  • batch:将用于推理的最大批大小。在推理过程中可以使用较小的批,但推理不接受大于指定数量的批。

注意

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

Experimentation by NVIDIA led them to recommend using at least 500 calibration images that are representative of the data for your model, with INT8 quantization calibration. This is a guideline and not a hard requirement, and you will need to experiment with what is required to perform well for your dataset. Since the calibration data is required for INT8 calibration with TensorRT, make certain to use the data argument when int8=True for TensorRT and use data="my_dataset.yaml", which will use the images from validation to calibrate with. When no value is passed for data with export to TensorRT with INT8 quantization, the default will be to use one of the "small" example datasets based on the model task instead of throwing an error.

示例
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.export(
    format="engine",
    dynamic=True,  # (1)!
    batch=8,  # (2)!
    workspace=4,  # (3)!
    int8=True,
    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. 带有动态轴的导出,当使用 int8=True 导出时,即使未明确设置,此功能也会默认启用。有关更多信息,请参阅 导出参数
  2. 将导出模型和 INT8 校准的最大批大小设置为 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 或任何 用于评估模型性能的其他指标 很可能会略有变差。请参阅 性能结果部分,比较在各种设备上以 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 环境下测试

See Detection Docs for usage examples with these models trained on COCO, which include 80 pretrained classes.

注意

Inference times shown for mean, min (fastest), and max (slowest) for each test using pretrained weights yolov8n.engine

精度评估测试平均值
(ms)
最小 | 最大
(ms)
mAPval
50(B)
mAPval
50-95(B)
batch尺寸
(像素)
FP32预测0.520.51 | 0.568640
FP32COCOval0.520.520.371640
FP16预测0.340.34 | 0.418640
FP16COCOval0.330.520.371640
INT8预测0.280.27 | 0.318640
INT8COCOval0.290.470.331640

消费级 GPU

检测性能 (COCO)

使用 Windows 10.0.19045、python 3.10.9ultralytics==8.2.4tensorrt==10.0.0b6 进行测试

注意

Inference times shown for mean, min (fastest), and max (slowest) for each test using pretrained weights yolov8n.engine

精度评估测试平均值
(ms)
最小 | 最大
(ms)
mAPval
50(B)
mAPval
50-95(B)
batch尺寸
(像素)
FP32预测1.060.75 | 1.888640
FP32COCOval1.370.520.371640
FP16预测0.620.75 | 1.138640
FP16COCOval0.850.520.371640
INT8预测0.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 进行测试

注意

Inference times shown for mean, min (fastest), and max (slowest) for each test using pretrained weights yolov8n.engine

精度评估测试平均值
(ms)
最小 | 最大
(ms)
mAPval
50(B)
mAPval
50-95(B)
batch尺寸
(像素)
FP32预测6.116.10 | 6.298640
FP32COCOval6.170.520.371640
FP16预测3.183.18 | 3.208640
FP16COCOval3.190.520.371640
INT8预测2.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, half=True)

# 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, int8=True, 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 集成感兴趣,我们的集成指南页面提供了丰富的资源和见解。

常见问题 (FAQ)

如何将 YOLO26 模型转换为 TensorRT 格式?

要将你的 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 优化 YOLO26 模型具有以下几点好处:

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

要了解更多信息,请浏览 NVIDIA 提供的官方 TensorRT 文档 以及我们的深度 TensorRT 概览

我可以使用 TensorRT 为 YOLO26 模型进行 INT8 量化吗?

可以,你可以使用带有 INT8 量化的 TensorRT 导出 YOLO26 模型。此过程涉及训练后量化 (PTQ) 和校准:

  1. 使用 INT8 导出

    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    model.export(format="engine", batch=8, workspace=4, int8=True, 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 部分

如何将 YOLO26 TensorRT 模型部署到 NVIDIA Triton 推理服务器上?

你可以使用以下资源将 YOLO26 TensorRT 模型部署到 NVIDIA Triton 推理服务器上:

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

导出为 TensorRT 的 YOLO26 模型能观察到哪些性能提升?

TensorRT 带来的性能提升会根据所使用的硬件而有所不同。以下是一些典型的基准测试结果:

  • 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 文档以及我们的性能分析报告。

评论