跳至内容

TensorRT 导出YOLOv8 模型

Deploying computer vision models in high-performance environments can require a format that maximizes speed and efficiency. This is especially true when you are deploying your model on NVIDIA GPUs.

By using the TensorRT export format, you can enhance your Ultralytics YOLOv8 models for swift and efficient inference on NVIDIA hardware. This guide will give you easy-to-follow steps for the conversion process and help you make the most of NVIDIA's advanced technology in your deep learning projects.

TensorRT

TensorRT 概述

TensorRT, developed by NVIDIA, is an advanced software development kit (SDK) designed for high-speed deep learning inference. It's well-suited for real-time applications like object detection.

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

TensorRT is known for its compatibility with various model formats, including TensorFlow, PyTorch, and ONNX, providing developers with a flexible solution for integrating and optimizing models from different frameworks. This versatility enables efficient model deployment across diverse hardware and software environments.

TensorRT 机型的主要特点

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

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

  • Layer Fusion: The TensorRT optimization process includes layer fusion, where multiple layers of a neural network are combined into a single operation. This reduces computational overhead and improves inference speed by minimizing memory access and computation.

TensorRT 层融合

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

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

中的部署选项TensorRT

在我们查看导出代码之前 YOLOv8 模型到 TensorRT 格式,让我们了解在哪里 TensorRT 通常使用模型。

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

  • Deploying within TensorFlow: This method integrates TensorRT into TensorFlow, allowing optimized models to run in a familiar TensorFlow environment. It's useful for models with a mix of supported and unsupported layers, as TF-TRT can handle these efficiently.

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

Exporting Ultralytics YOLO models using TensorRT with INT8 precision executes post-training quantization (PTQ). TensorRT uses calibration for PTQ, which measures the distribution of activations within each activation tensor as the YOLO model processes inference on representative input data, and then uses that distribution to estimate scale values for each tensor. Each activation tensor that is a candidate for quantization has an associated scale that is deduced by a calibration process.

在处理隐式量化网络时,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 may increase calibration time, it allows TensorRT to explore a wider range of optimization tactics, potentially enhancing model performance and accuracy. Conversely, a smaller workspace 可以减少校准时间,但可能会限制优化策略,影响量化模型的质量。

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

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

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

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

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

备注

在校准过程中,两次 batch 将使用所提供的尺寸。使用小批量生产可能会导致校准过程中比例不准确。这是因为程序会根据所看到的数据进行调整。小批量生产可能无法捕捉到完整的数值范围,从而导致最终校准出现问题。 batch size is doubled automatically. If no batch size is specified 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

信息

有关设置和配置的更多信息,请参阅 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. 安装所需的软件包

    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 8 months ago ✏️ Updated 7 days ago

评论