跳至内容

TensorRT 导出YOLOv8 模型

在高性能环境中部署计算机视觉模型需要一种能最大限度提高速度和效率的格式。在英伟达™(NVIDIA®)图形处理器上部署模型时尤其如此。

通过使用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:提供细粒度控制,是性能关键型应用的理想选择。它比较复杂,但允许自定义执行不支持的操作符。

  • 英伟达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=4 (GiB),如果校准崩溃(无警告退出),可能需要增加该值。

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

    • 如果 workspace 设置为最大值,并且校准失败/崩溃时,可考虑减小 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)!
)

model = YOLO("yolov8n.engine", task="detect") # load the model
  1. 使用动态轴导出时,默认情况下将启用该功能。 int8=True 即使没有明确设置。参见 出口参数 以获取更多信息。
  2. 设置导出模型的最大批量大小为 8,该模型用 batch = 2 *×* 8 以避免校准过程中出现比例误差。
  3. 分配 4 GiB 内存,而不是为转换过程分配整个设备。
  4. 使用COCO 数据集进行校准,特别是用于验证的图像(共 5000 张)。
校准缓存

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 出口业绩

英伟达 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 0.35 0.61 8 640
FP32 ImageNetval 0.26 1 640
FP16 预测 0.18 0.17 | 0.19 0.35 0.61 8 640
FP16 ImageNetval 0.18 1 640
INT8 预测 0.16 0.15 | 0.57 0.32 0.59 8 640
INT8 ImageNetval 0.15 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 5.1.3 (L4T 35.5.0) Ubuntu 20.04.6 进行测试、 python 3.8.10, ultralytics==8.2.4, tensorrt==8.5.2.2

备注

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

精度 评估测试 平均
(ms)
min | max
(ms)
mAPval
50(B)
mAPval
50-95(B)
batch 尺寸
(像素)
FP32 预测 6.90 6.89 | 6.93 8 640
FP32 COCOval 6.97 0.52 0.37 1 640
FP16 预测 3.36 3.35 | 3.39 8 640
FP16 COCOval 3.39 0.52 0.37 1 640
INT8 预测 2.32 2.32 | 2.34 8 640
INT8 COCOval 2.33 0.47 0.33 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
out = model.export(
    format="engine",
    imgsz:640,
    dynamic:True,
    verbose:False,
    batch:8,
    workspace:2,
    int8=True,
    data:"data.yaml"  # COCO, ImageNet, or DOTAv1 for appropriate model task
)
预测回路

更多信息请参见预测模式

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 模型转换为英伟达的TensorRT 模型格式。这一转换步骤对于提高YOLOv8 模型的效率和速度至关重要,可使其更加有效并适用于各种部署环境。

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

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



创建于 2024-01-28,更新于 2024-05-08
作者:Burhan-Q(1),glenn-jocher(1),abirami-vina(1)

评论