跳至内容

TensorRT 导出YOLOv8 模型

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

通过使用TensorRT 导出格式,您可以增强您的 Ultralytics YOLOv8模型,以便在NVIDIA 硬件上快速高效地进行推理。本指南将为您提供简单易懂的转换步骤,帮助您在深度学习项目中充分利用NVIDIA 的先进技术。

TensorRT

TensorRT 概述

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

该工具包可针对NVIDIA GPU 优化深度学习模型,从而实现更快、更高效的操作。TensorRT 模型经过TensorRT 优化,其中包括层融合、精度校准(INT8 和 FP16)、动态tensor 内存管理和内核自动调整等技术。将深度学习模型转换为TensorRT 格式,可以让开发人员充分发挥NVIDIA GPU 的潜力。

TensorRT 以兼容各种模型格式而著称,包括TensorFlow 、 PyTorch和ONNX ,为开发人员整合和优化不同框架的模型提供了灵活的解决方案。这种多功能性使模型能够在不同的硬件和软件环境中高效部署

TensorRT 机型的主要特点

TensorRT 模型具有一系列关键特性,有助于提高其在高速深度学习推理中的效率和有效性:

  • 精度校准:TensorRT 支持精度校准,允许针对特定精度要求对模型进行微调。这包括对 INT8 和 FP16 等降低精度格式的支持,这可以进一步提高推理速度,同时保持可接受的精度水平。

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

TensorRT 层融合

  • 动态Tensor 内存管理:TensorRT 在推理过程中有效管理tensor 内存使用情况,减少内存开销并优化内存分配。这使得GPU 的内存使用效率更高。

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

中的部署选项TensorRT

在了解将YOLOv8 模型导出为TensorRT 格式的代码之前,我们先来了解一下TensorRT 模型通常用在什么地方。

TensorRT 提供多种部署选项,每种选项都在易于集成、性能优化和灵活性之间取得了不同的平衡:

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

TensorRT 概述

  • 独立的TensorRT RuntimeAPI:提供细粒度控制,是性能关键型应用的理想选择。它比较复杂,但允许自定义执行不支持的操作符。

  • NVIDIA Triton 推理服务器:支持各种框架模型的选项。它特别适用于云推理或边缘推理,提供并发模型执行和模型分析等功能。

将YOLOv8 模型导出到TensorRT

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

安装

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

安装

# Install the required package for YOLOv8
pip install ultralytics

有关安装过程的详细说明和最佳实践,请查阅我们的YOLOv8 安装指南。在安装YOLOv8 所需的软件包时,如果遇到任何困难,请查阅我们的常见问题指南,了解解决方案和技巧。

使用方法

在了解使用说明之前,请务必查看 Ultralytics 提供的一系列YOLOv8 型号。这将有助于您根据项目要求选择最合适的型号。

使用方法

from ultralytics import YOLO

# Load the YOLOv8 model
model = YOLO("yolov8n.pt")

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

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

# Run inference
results = tensorrt_model("https://ultralytics.com/images/bus.jpg")
# Export a YOLOv8n PyTorch model to TensorRT format
yolo export model=yolov8n.pt format=engine  # creates 'yolov8n.engine''

# Run inference with the exported model
yolo predict model=yolov8n.engine source='https://ultralytics.com/images/bus.jpg'

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

使用 INT8 量化输出TensorRT

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

在处理隐式量化网络时,TensorRT 会择机使用 INT8 来优化层的执行时间。如果某层在 INT8 下运行速度更快,且其数据输入和输出已指定量化比例,则会为该层指定一个具有 INT8 精度的内核,否则TensorRT 会为内核选择 FP32 或 FP16 精度,以加快该层的执行时间。

提示

确保使用TensorRT 模型权重进行部署的同一设备用于导出 INT8 精确度至关重要,因为不同设备的校准结果可能不同。

配置 INT8 输出

使用 出口 Ultralytics YOLO 模型将 大为 会影响导出模型的性能。这些参数也需要根据可用的设备资源进行选择,但默认参数为 对大多数 安培(或更新)NVIDIA 独立图形处理器.使用的校准算法是 "ENTROPY_CALIBRATION_2" 您还可以阅读有关可用选项的更多详细信息 TensorRT 开发人员指南Ultralytics 测试发现 "ENTROPY_CALIBRATION_2" 是最好的选择,因此出口固定使用这种算法。

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

    • 调整 workspace 请根据校准需求和可用资源情况选择合适的值。虽然较大的 workspace 可能会增加校准时间,但它允许TensorRT 探索范围更广的优化策略,从而可能提高模型性能和 精确度.反之,较小的 workspace 可以缩短校准时间,但可能会限制优化策略,影响量化模型的质量。

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

    • TensorRT 将报告 UNSUPPORTED_STATE 如果 workspace 的值大于设备的可用内存,这意味着 workspace 应降低或设置为 None.

    • 如果 workspace 设置为最大值,并且校准失败/崩溃,可考虑使用 None 进行自动分配,或通过降低 imgszbatch 以减少内存需求。

    • 请记住INT8 的校准是针对每个设备的,借用 "高端 "GPU 进行校准,可能会导致在其他设备上运行推理时性能不佳。

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

备注

在校准过程中,两次 batch 将使用所提供的尺寸。使用小批量生产可能会导致校准过程中的刻度不准确。这是因为程序会根据所看到的数据进行调整。小批量生产可能无法捕捉到完整的数值范围,从而导致最终校准出现问题。 batch 大小会自动加倍。如果没有 批量大小 指定 batch=1校准将在 batch=1 * 2 以减少校准比例误差。

NVIDIA 的实验结果表明,他们建议至少使用 500 张校准图像,这些图像应能代表您模型的数据,并使用 INT8 量化校准。这只是一个指南,而不是 艰苦 要求,以及 您需要根据自己的数据集来尝试如何实现良好的性能 由于 INT8 校准时需要校准数据TensorRT ,因此一定要使用 dataint8=True 用于TensorRT 和使用 data="my_dataset.yaml"的图像。 核实 进行校准。如果没有为 data 导出到TensorRT 并进行 INT8 量化时,默认情况下将使用 基于模型任务的 "小型 "示例数据集 而不是出错。

示例

from ultralytics import YOLO

model = YOLO("yolov8n.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("yolov8n.engine", task="detect")

# Run inference
result = model.predict("https://ultralytics.com/images/bus.jpg")
  1. 使用动态轴导出时,默认情况下将启用该功能。 int8=True 即使没有明确设置。参见 出口参数 以获取更多信息。
  2. 设置导出模型的最大批量大小为 8,该模型用 batch = 2 * 8 以避免校准过程中出现比例误差。
  3. 分配 4 GiB 内存,而不是为转换过程分配整个设备。
  4. 使用COCO 数据集进行校准,特别是用于验证的图像(共 5000 张)。
# Export a YOLOv8n PyTorch model to TensorRT format with INT8 quantization
yolo export model=yolov8n.pt format=engine batch=8 workspace=4 int8=True data=coco.yaml  # creates 'yolov8n.engine''

# Run inference with the exported TensorRT quantized model
yolo predict model=yolov8n.engine source='https://ultralytics.com/images/bus.jpg'
校准缓存

TensorRT 将生成校准 .cache 可以重复使用,以加快未来使用相同数据导出模型权重的速度。 batch 值发生巨大变化。在这种情况下,现有的 .cache 应重新命名并移至其他目录或完全删除。

使用YOLO 和TensorRT INT8 的优势

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

  • 功耗更低:与 FP32 模型相比,INT8 导出的YOLO 模型降低了精度操作,因此功耗更低,尤其适用于电池供电的设备。

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

推理速度说明

使用导出到TensorRT INT8 的模型进行最初几次推理调用时,预处理、推理和/或后处理时间可能会比平时长。当改变 imgsz 在推理过程中,尤其是当 imgsz 与导出时指定的内容不同(导出 imgsz 设置为TensorRT "最佳 "配置文件)。

使用YOLO 和TensorRT INT8 的缺点

  • 评估指标减少: 使用较低的精度意味着 mAP, Precision, Recall 或任何 用于评估模型性能的其他指标 可能会更糟一些。参见 性能结果部分 以比较 mAP50mAP50-95 在各种设备的小样本上使用 INT8 导出时。

  • 增加开发时间:为数据集和设备找到 INT8 校准的 "最佳 "设置需要大量的测试。

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

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 个预先训练的类别。

备注

所示推理时间为 mean, min (最快),以及 max (在每次测试中使用预先训练的权重(最慢的 yolov8n.engine

精度 评估测试 平均
(ms)
min | max
(ms)
mAPval
50(B)
mAPval
50-95(B)
batch 尺寸
(像素)
FP32 预测 0.52 0.51 | 0.56 8 640
FP32 COCOval 0.52 0.52 0.37 1 640
FP16 预测 0.34 0.34 | 0.41 8 640
FP16 COCOval 0.33 0.52 0.37 1 640
INT8 预测 0.28 0.27 | 0.31 8 640
INT8 COCOval 0.29 0.47 0.33 1 640

有关在COCO 上训练的这些模型的使用示例,请参阅 "分割文档",其中包括 80 个预先训练的类别。

备注

所示推理时间为 mean, min (最快),以及 max (在每次测试中使用预先训练的权重(最慢的 yolov8n-seg.engine

精度 评估测试 平均
(ms)
min | max
(ms)
mAPval
50(B)
mAPval
50-95(B)
mAPval
50(M)
mAPval
50-95(M)
batch 尺寸
(像素)
FP32 预测 0.62 0.61 | 0.68 8 640
FP32 COCOval 0.63 0.52 0.36 0.49 0.31 1 640
FP16 预测 0.40 0.39 | 0.44 8 640
FP16 COCOval 0.43 0.52 0.36 0.49 0.30 1 640
INT8 预测 0.34 0.33 | 0.37 8 640
INT8 COCOval 0.36 0.46 0.32 0.43 0.27 1 640

有关在ImageNet 上训练的这些模型的使用示例,请参见分类文档,其中包括 1000 个预训练的类别。

备注

所示推理时间为 mean, min (最快),以及 max (在每次测试中使用预先训练的权重(最慢的 yolov8n-cls.engine

精度 评估测试 平均
(ms)
min | max
(ms)
第一名 前五名 batch 尺寸
(像素)
FP32 预测 0.26 0.25 | 0.28 8 640
FP32 ImageNetval 0.26 0.35 0.61 1 640
FP16 预测 0.18 0.17 | 0.19 8 640
FP16 ImageNetval 0.18 0.35 0.61 1 640
INT8 预测 0.16 0.15 | 0.57 8 640
INT8 ImageNetval 0.15 0.32 0.59 1 640

有关在COCO 上训练的这些模型的使用示例,请参见姿势估计文档,其中包括一个预训练类别 "人"。

备注

所示推理时间为 mean, min (最快),以及 max (在每次测试中使用预先训练的权重(最慢的 yolov8n-pose.engine

精度 评估测试 平均
(ms)
min | max
(ms)
mAPval
50(B)
mAPval
50-95(B)
mAPval
50(P)
mAPval
50-95(P)
batch 尺寸
(像素)
FP32 预测 0.54 0.53 | 0.58 8 640
FP32 COCOval 0.55 0.91 0.69 0.80 0.51 1 640
FP16 预测 0.37 0.35 | 0.41 8 640
FP16 COCOval 0.36 0.91 0.69 0.80 0.51 1 640
INT8 预测 0.29 0.28 | 0.33 8 640
INT8 COCOval 0.30 0.90 0.68 0.78 0.47 1 640

有关在DOTAv1 上训练的这些模型的使用示例,请参见定向检测文档,其中包括 15 个预先训练的类别。

备注

所示推理时间为 mean, min (最快),以及 max (在每次测试中使用预先训练的权重(最慢的 yolov8n-obb.engine

精度 评估测试 平均
(ms)
min | max
(ms)
mAPval
50(B)
mAPval
50-95(B)
batch 尺寸
(像素)
FP32 预测 0.52 0.51 | 0.59 8 640
FP32 DOTAv1val 0.76 0.50 0.36 1 640
FP16 预测 0.34 0.33 | 0.42 8 640
FP16 DOTAv1val 0.59 0.50 0.36 1 640
INT8 预测 0.29 0.28 | 0.33 8 640
INT8 DOTAv1val 0.32 0.45 0.32 1 640

消费级 GPU

检测性能(COCO)

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

备注

所示推理时间为 mean, min (最快),以及 max (在每次测试中使用预先训练的权重(最慢的 yolov8n.engine

精度 评估测试 平均
(ms)
min | max
(ms)
mAPval
50(B)
mAPval
50-95(B)
batch 尺寸
(像素)
FP32 预测 1.06 0.75 | 1.88 8 640
FP32 COCOval 1.37 0.52 0.37 1 640
FP16 预测 0.62 0.75 | 1.13 8 640
FP16 COCOval 0.85 0.52 0.37 1 640
INT8 预测 0.52 0.38 | 1.00 8 640
INT8 COCOval 0.74 0.47 0.33 1 640

使用 Windows 10.0.22631 进行了测试、 python 3.11.9, ultralytics==8.2.4, tensorrt==10.0.1

备注

所示推理时间为 mean, min (最快),以及 max (在每次测试中使用预先训练的权重(最慢的 yolov8n.engine

精度 评估测试 平均
(ms)
min | max
(ms)
mAPval
50(B)
mAPval
50-95(B)
batch 尺寸
(像素)
FP32 预测 1.76 1.69 | 1.87 8 640
FP32 COCOval 1.94 0.52 0.37 1 640
FP16 预测 0.86 0.75 | 1.00 8 640
FP16 COCOval 1.43 0.52 0.37 1 640
INT8 预测 0.80 0.75 | 1.00 8 640
INT8 COCOval 1.35 0.47 0.33 1 640

使用 Pop!_OS 22.04 LTS 进行了测试、 python 3.10.12, ultralytics==8.2.4, tensorrt==8.6.1.post1

备注

所示推理时间为 mean, min (最快),以及 max (在每次测试中使用预先训练的权重(最慢的 yolov8n.engine

精度 评估测试 平均
(ms)
min | max
(ms)
mAPval
50(B)
mAPval
50-95(B)
batch 尺寸
(像素)
FP32 预测 2.84 2.84 | 2.85 8 640
FP32 COCOval 2.94 0.52 0.37 1 640
FP16 预测 1.09 1.09 | 1.10 8 640
FP16 COCOval 1.20 0.52 0.37 1 640
INT8 预测 0.75 0.74 | 0.75 8 640
INT8 COCOval 0.76 0.47 0.33 1 640

嵌入式设备

检测性能(COCO)

使用 JetPack 6.0 (L4T 36.3) Ubuntu 22.04.4 LTS 测试、 python 3.10.12, ultralytics==8.2.16, tensorrt==10.0.1

备注

所示推理时间为 mean, min (最快),以及 max (在每次测试中使用预先训练的权重(最慢的 yolov8n.engine

精度 评估测试 平均
(ms)
min | max
(ms)
mAPval
50(B)
mAPval
50-95(B)
batch 尺寸
(像素)
FP32 预测 6.11 6.10 | 6.29 8 640
FP32 COCOval 6.17 0.52 0.37 1 640
FP16 预测 3.18 3.18 | 3.20 8 640
FP16 COCOval 3.19 0.52 0.37 1 640
INT8 预测 2.30 2.29 | 2.35 8 640
INT8 COCOval 2.32 0.46 0.32 1 640

评估方法

有关如何导出和测试这些模型的信息,请展开以下章节。

导出配置

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

from ultralytics import YOLO

model = YOLO("yolov8n.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("yolov8n.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("yolov8n.engine")
results = model.val(
    data="data.yaml",  # COCO, ImageNet, or DOTAv1 for appropriate model task
    batch=1,
    imgsz=640,
    verbose=False,
    device="cuda",
)

部署导出的YOLOv8 TensorRT 模型

成功将Ultralytics YOLOv8 模型导出为TensorRT 格式后,现在就可以部署它们了。有关在各种设置中部署TensorRT 模型的深入说明,请参阅以下资源:

摘要

在本指南中,我们重点介绍了如何将Ultralytics YOLOv8 模型转换为NVIDIA 的TensorRT 模型格式。这一转换步骤对于提高YOLOv8 模型的效率和速度,使其更有效并适用于不同的部署环境至关重要。

有关使用细节的更多信息,请参阅TensorRT 官方文档

如果您想了解Ultralytics YOLOv8 集成方面的其他信息,我们的集成指南页面提供了大量信息资源和见解。

常见问题

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

要将Ultralytics YOLOv8 模型转换为TensorRT 格式,以优化NVIDIA GPU 推论,请按以下步骤操作:

  1. 安装所需的软件包

    pip install ultralytics
    
  2. 导出YOLOv8 模型

    from ultralytics import YOLO
    
    model = YOLO("yolov8n.pt")
    model.export(format="engine")  # creates 'yolov8n.engine'
    
    # Run inference
    model = YOLO("yolov8n.engine")
    results = model("https://ultralytics.com/images/bus.jpg")
    

更多详情,请访问YOLOv8 安装指南出口文件

在YOLOv8 模型中使用TensorRT 有什么好处?

使用TensorRT 优化YOLOv8 模型有几个好处:

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

如需了解更多信息,请点击此处查看 TensorRT 的详细功能,并阅读我们的TensorRT 概述部分

对于YOLOv8 模型,能否使用TensorRT 的 INT8 量化?

是的,您可以使用TensorRT 和 INT8 量化导出YOLOv8 模型。这一过程涉及训练后量化 (PTQ) 和校准:

  1. 使用 INT8 输出

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

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

更多详情,请参阅使用 INT8 量化导出TensorRT 部分

如何在NVIDIA Triton Inference Server 上部署YOLOv8 TensorRT 模型?

在NVIDIA Triton Inference Server 上部署YOLOv8 TensorRT 模型可使用以下资源:

这些指南将帮助您在各种部署环境中有效集成YOLOv8 模型。

YOLOv8 模型导出到TensorRT 后,性能提高了多少?

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

📅 Created 10 months ago ✏️ Updated 17 days ago

评论