Skip to content

YOLOv8模型的TensorRT导出

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

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

TensorRT

TensorRT概述

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

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

TensorRT以其与各种模型格式的兼容性而闻名,包括TensorFlow、PyTorch和ONNX,为开发者提供了一个灵活的解决方案,用于集成和优化来自不同框架的模型。这种多功能性使得在各种硬件和软件环境中实现高效的模型部署成为可能。

TensorRT模型的关键特性

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

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

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

TensorRT层融合

  • 动态张量内存管理:TensorRT在推理过程中高效管理张量内存使用,减少内存开销并优化内存分配。这导致更高效的GPU内存利用率。

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

TensorRT中的部署选项

在我们查看将YOLOv8模型导出为TensorRT格式的代码之前,让我们先了解一下TensorRT模型通常的使用场景。

TensorRT提供了几种部署选项,每种选项在集成便捷性、性能优化和灵活性之间有不同的平衡:

  • TensorFlow中部署:这种方法将TensorRT集成到TensorFlow中,允许优化模型在熟悉的TensorFlow环境中运行。对于包含支持和不支持层的混合模型,TF-TRT可以高效处理这些层。

TensorRT概述

  • 独立TensorRT运行时API:提供细粒度控制,非常适合性能关键型应用。虽然更复杂,但允许自定义实现不支持的运算符。

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

将YOLOv8模型导出为TensorRT

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

安装

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

安装

# 安装 YOLOv8 所需的包
pip install ultralytics

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

使用

在深入使用说明之前,请务必查看 Ultralytics 提供的 YOLOv8 模型范围。这将帮助您为项目需求选择最合适的模型。

使用

from ultralytics import YOLO

# 加载 YOLOv8 模型
model = YOLO("yolov8n.pt")

# 将模型导出为 TensorRT 格式
model.export(format="engine")  # 创建 'yolov8n.engine'

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

# 运行推理
results = tensorrt_model("https://ultralytics.com/images/bus.jpg")
# 将 YOLOv8n PyTorch 模型导出为 TensorRT 格式
yolo export model=yolov8n.pt format=engine  # 创建 'yolov8n.engine'

# 使用导出的模型进行推理
yolo predict model=yolov8n.engine source='https://ultralytics.com/images/bus.jpg'

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

使用 INT8 量化导出 TensorRT

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

在处理隐式量化网络时,TensorRT 会机会性地使用 INT8 来优化层执行时间。如果一个层在 INT8 中运行得更快,并且在其数据输入和输出上分配了量化比例,那么该层将被分配一个 INT8 精度的内核,否则 TensorRT 将根据哪个精度在该层上导致更快的执行时间来选择 FP32 或 FP16 精度。

Tip

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

配置 INT8 导出

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

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

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

    • 默认值为 workspace=4(GiB),如果校准崩溃(无警告退出),可能需要增加此值。

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

    • 如果 workspace 设置为最大值且校准失败/崩溃,请考虑减少 imgszbatch 的值以减少内存需求。

    • 记住 INT8 校准是针对每个设备的,借用“高端”GPU 进行校准,可能在推理运行在另一设备时导致性能不佳。
  • batch : 推理时将使用的最大批次大小。推理期间可以使用较小的批次,但推理不会接受任何大于指定值的批次。

Note

在校准期间,将使用所提供 batch 大小的两倍。使用小批次可能导致校准期间缩放不准确。这是因为该过程根据其看到的数据进行调整。小批次可能无法捕捉到完整的值范围,导致最终校准出现问题,因此 batch 大小会自动加倍。如果没有指定 批次大小batch=1,校准将在 batch=1 * 2 运行,以减少校准缩放错误。

NVIDIA 的实验使他们建议使用至少 500 张代表模型数据的校准图像进行 INT8 量化校准。这是一个指导方针,而不是一个 硬性 要求,并且 你需要根据你的数据集进行实验,以确定所需的性能 由于校准数据是使用 TensorRT 进行 INT8 校准所必需的,因此在 int8=True 时使用 TensorRT 并使用 data="my_dataset.yaml" 时,请确保使用 data 参数,这将使用来自 验证 的图像进行校准。当使用 INT8 量化导出到 TensorRT 时,如果没有为 data 传递值,默认将使用基于模型任务的 "小" 示例数据集 之一,而不是抛出错误。

Example

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)!
)

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

# 运行推理
result = model.predict("https://ultralytics.com/images/bus.jpg")
  1. 使用动态轴导出,即使未明确设置,当 int8=True 时默认启用。有关更多信息,请参见 导出参数
  2. 设置导出模型的最大批次大小为 8,校准时使用 batch = 2 * 8 以避免校准期间的缩放错误。
  3. 分配 4 GiB 内存而不是为转换过程分配整个设备。
  4. 使用 COCO 数据集 进行校准,特别是用于 验证 的图像(总共 5,000 张)。
# 将 YOLOv8n PyTorch 模型导出为 TensorRT 格式,并进行 INT8 量化
yolo export model=yolov8n.pt format=engine batch=8 workspace=4 int8=True data=coco.yaml  # 创建 'yolov8n.engine'

# 使用导出的 TensorRT 量化模型进行推理
yolo predict model=yolov8n.engine source='https://ultralytics.com/images/bus.jpg'
校准缓存

TensorRT 将生成一个校准 .cache,可以重新用于使用相同数据加速未来模型权重的导出,但这可能导致数据差异很大或 batch 值发生显著变化时的校准不佳。在这些情况下,应将现有的 .cache 重命名并移动到不同的目录或完全删除。

使用 YOLO 与 TensorRT INT8 的优势

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

  • 降低功耗: INT8 导出的 YOLO 模型在减少精度操作时可以比 FP32 模型消耗更少的功率,尤其是在电池供电的设备上。

  • 提高推理速度: TensorRT 针对目标硬件优化模型,可能在 GPU、嵌入式设备和加速器上实现更快的推理速度。

关于推理速度的说明

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

使用 YOLO 与 TensorRT INT8 的缺点

  • 精度损失: 量化到 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 环境下测试

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

Note

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

精度 评估测试 平均
(ms)
最小 | 最大
(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 个预训练类别。

Note

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

精度 评估测试 平均
(ms)
最小 | 最大
(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 个预训练类别。

Note

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

精度 评估测试 平均
(毫秒)
最小 | 最大
(毫秒)
top-1 top-5 批量 尺寸
(像素)
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上训练的使用示例,请参阅姿态估计文档,其中包括一个预训练的类别“人”。

注意

推理时间显示了使用预训练权重yolov8n-pose.engine进行每次测试的平均最小(最快)和最大(最慢)时间。

精度 评估测试 平均
(毫秒)
最小 | 最大
(毫秒)
mAPval
50(B)
mAPval
50-95(B)
mAPval
50(P)
mAPval
50-95(P)
批量 尺寸
(像素)
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个预训练的类别。

注意

推理时间显示了使用预训练权重yolov8n-obb.engine进行每次测试的平均最小(最快)和最大(最慢)时间。

精度 评估测试 平均
(毫秒)
最小 | 最大
(毫秒)
mAPval
50(B)
mAPval
50-95(B)
批量 尺寸
(像素)
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.9ultralytics==8.2.4tensorrt==10.0.0b6

注意

推理时间

使用预训练权重 yolov8n.engine 进行每个测试的 meanmin(最快)和 max(最慢)的推理时间显示如下:

精度 评估测试 平均
(ms)
最小 | 最大
(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.9ultralytics==8.2.4tensorrt==10.0.1

注意

使用预训练权重 yolov8n.engine 进行每个测试的 meanmin(最快)和 max(最慢)的推理时间显示如下:

精度 评估测试 平均
(ms)
最小 | 最大
(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.12ultralytics==8.2.4tensorrt==8.6.1.post1

注意

使用预训练权重 yolov8n.engine 进行每个测试的 meanmin(最快)和 max(最慢)的推理时间显示如下:

精度 评估测试 平均
(ms)
最小 | 最大
(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.12ultralytics==8.2.16tensorrt==10.0.1

注意

使用预训练权重 yolov8n.engine 进行每个测试的 meanmin(最快)和 max(最慢)的推理时间显示如下:

精度 评估测试 平均
(ms)
最小 | 最大
(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

| 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 |

Info

请参阅我们的NVIDIA Jetson 上的 Ultralytics YOLO 快速入门指南,了解更多关于设置和配置的信息。

评估方法

展开以下部分以获取有关这些模型如何导出和测试的信息。

导出配置

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

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. 安装所需的包:

```bash
pip install ultralytics
```
  1. 导出你的 YOLOv8 模型:

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

更多详情,请访问 YOLOv8 安装指南导出文档

使用 TensorRT 优化 YOLOv8 模型有哪些好处?

使用 TensorRT 优化 YOLOv8 模型提供了以下几个好处:

  • 更快的推理速度:TensorRT 优化了模型层,并使用精度校准(INT8 和 FP16)来加速推理,而不会显著牺牲准确性。
  • 内存效率:TensorRT 动态管理张量内存,减少开销并提高 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 推理服务器上部署 YOLOv8 TensorRT 模型?

在 NVIDIA Triton 推理服务器上部署 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 8 months ago ✏️ Updated 11 days ago

Comments