针对 YOLO26 模型进行 TensorRT 导出#
在高性能环境中部署computer vision模型时,通常需要使用能够最大限度提升速度和效率的格式。当你将模型部署到 NVIDIA GPU 上时尤其如此。
通过使用 TensorRT 导出格式,你可以增强 Ultralytics YOLO26 模型,使其在 NVIDIA 硬件上实现快速高效的推理。本指南将为你提供简单易懂的转换步骤,帮助你在deep learning项目中充分利用 NVIDIA 的先进技术。
TensorRT#
TensorRT 由 NVIDIA 开发,是一个专为高速深度学习推理而设计的先进软件开发工具包 (SDK)。它非常适合用于object detection等实时应用。
该工具包可针对 NVIDIA GPU 优化深度学习模型,从而实现更快、更高效的操作。TensorRT 模型会经历 TensorRT 优化过程,其中包括层融合、精度校准(INT8 和 FP16)、动态张量内存管理以及内核自动调优等技术。将深度学习模型转换为 TensorRT 格式,使开发者能够充分释放 NVIDIA GPU 的潜力。
TensorRT 以兼容各种模型格式而闻名,包括 TensorFlow、PyTorch 和 ONNX,为开发者集成和优化来自不同框架的模型提供了灵活的解决方案。这种多功能性使得在各种硬件和软件环境中进行高效的model deployment成为可能。
TensorRT 会在其构建 GPU 上对引擎进行配置文件和调优。请针对部署 GPU 架构进行构建并匹配 TensorRT/CUDA 运行时;切勿将 .engine 文件视为可移植的模型格式。对于边缘部署,Ultralytics Platform 提供了八种 Jetson 目标选择,并记录了每种选择的物理构建和验证状态,或者你也可以在目标设备上进行本地导出。
TensorRT 模型的主要特性#
TensorRT 模型提供了一系列核心特性,这些特性有助于提高其在高速深度学习推理中的效率和有效性:
-
精度校准:TensorRT 支持精度校准,允许根据特定的准确度要求对模型进行微调。这包括支持 INT8 和 FP16 等降低精度的格式,这些格式可以在保持可接受准确度水平的同时进一步提升推理速度。
-
层融合:TensorRT 优化过程包括层融合,即将neural network的多个层组合为单个操作。这通过最大限度地减少内存访问和计算,降低了计算开销并提高了推理速度。
-
动态张量内存管理:TensorRT 在推理过程中能高效管理张量内存使用,减少内存开销并优化内存分配。这带来了更高效的 GPU 内存利用率。
-
自动内核调优:TensorRT 采用自动内核调优来为模型的每一层选择最优的 GPU 内核。这种自适应方法确保模型能充分发挥 GPU 的计算能力。
TensorRT 中的部署选项#
在查看将 YOLO26 模型导出到 TensorRT 格式的代码之前,让我们先了解一下 TensorRT 模型通常的使用场景。
TensorRT 提供了多种部署选项,每种选项在集成便利性、性能优化和灵活性之间实现了不同的平衡:
- 在 TensorFlow 中部署:此方法将 TensorRT 集成到 TensorFlow 中,允许优化的模型在熟悉的 TensorFlow 环境中运行。这对于包含受支持层和不受支持层组合的模型非常有用,因为 TF-TRT 可以高效处理这些层。
-
独立 TensorRT Runtime API:提供细粒度控制,非常适合对性能要求苛刻的应用。它更为复杂,但允许自定义实现不受支持的算子。
-
NVIDIA Triton Inference Server:此选项支持来自各种框架的模型。它特别适用于云端或边缘推理,并提供并发模型执行和模型分析等功能。
支持的任务#
TensorRT 卶出支持所有七个 Ultralytics 仳务。语义分割和深度估计仅在 YOLO26 中可用,这是唯一提供这些头的产品系列。
将 YOLO26 模型导出至 TensorRT#
你可以通过将 YOLO26 模型转换为 TensorRT 格式来提高执行效率并优化性能。
安装#
要安装所需的软件包,请运行:
# Install the required package for YOLO26
pip install ultralytics有关安装过程的详细说明和最佳实践,请查看我们的YOLO26 Installation guide。在安装 YOLO26 所需的软件包时,如果遇到任何困难,请参考我们的Common Issues guide获取解决方案和提示。
用法#
在深入了解使用说明之前,请务必查看 YOLO26 models offered by Ultralytics。这将帮助你为你的项目需求选择最合适的模型。
TensorRT 格式支持Export、Predict 和 Validate 模式。推理和验证需要 NVIDIA GPU。导出模型,然后加载导出的模型以运行推理或验证其准确性。
from ultralytics import YOLO
# Load a YOLO26 model
model = YOLO("yolo26n.pt")
# Export the model to TensorRT format
model.export(format="engine") # creates 'yolo26n.engine'from ultralytics import YOLO
# Load the exported TensorRT model
model = YOLO("yolo26n.engine")
# Run inference
results = model("https://ultralytics.com/images/bus.jpg")from ultralytics import YOLO
# Load the exported TensorRT model
model = YOLO("yolo26n.engine")
# Validate accuracy on the COCO8 dataset
metrics = model.val(data="coco8.yaml")导出参数#
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
format | str | 'engine' | 导出模型的目标格式,定义了与各种部署环境的兼容性。 |
imgsz | int 或 tuple | 640 | 模型输入的所需图像大小。对于正方形图像可以是整数,或者对于特定尺寸可以是元组 (height, width)。 |
quantize | int 或 str | None | 量化精度:16 (FP16) 或 8 (INT8/PTQ;需要校准 data/fraction);32/未设置则为 FP32。替换了已废弃的 half/int8 标志。 |
dynamic | bool | False | 允许动态输入尺寸,增强处理不同图像尺寸时的灵活性。 |
simplify | bool | True | 使用 onnxslim 简化模型图,这可能会提高性能和兼容性。 |
opset | int | None | 为中间 ONNX 图指定 ONNX opset 版本。如果未设置,则使用支持的最新版本。 |
workspace | float 或 None | None | 设置 TensorRT 优化的最大工作空间大小(以 GiB 为单位),在内存使用和性能之间取得平衡;使用 None 可由 TensorRT 自动分配高达设备最大值的空间。 |
nms | bool | False | 添加非极大值抑制 (NMS),这是准确高效的检测后处理所必需的。 |
batch | int | 1 | 指定导出模型的批处理推理大小,或导出的模型在 predict 模式下同时处理的最大图像数量。 |
data | str | None | 数据集 YAML 的路径,对量化至关重要;分类任务则需要数据集目录或内置数据集名称。如果在使用 quantize=8 时省略此项,Ultralytics 将为模型任务选择默认的校准数据集。 |
fraction | float | 1.0 | 指定用于 INT8 量化校准的数据集比例。允许在完整数据集的一个子集上进行校准,这对实验或资源受限时非常有用。如果启用 INT8 但未指定,将使用完整数据集。 |
device | str | None | 指定用于导出的设备:GPU (device=0),用于 NVIDIA Jetson 的 DLA (device=dla:0 或 device=dla:1)。 |
请务必在导出到 TensorRT 时使用支持 CUDA 的 GPU。
TensorRT 11.0 不支持 DLA;对于 device=dla:0 或 device=dla:1,请使用 TensorRT 10.x,或者导出 TensorRT 11.0 GPU 引擎。
有关导出过程的更多详细信息,请访问 Ultralytics 关于导出的文档页面。
使用 INT8 量化导出 TensorRT#
使用具有 INT8 precision的 TensorRT 导出 Ultralytics YOLO 模型会执行训练后量化 (PTQ)。TensorRT 将校准用于 PTQ,当 YOLO 模型在代表性输入数据上处理推理时,它会测量每个激活张量内激活的分布,然后使用该分布来估计每个张量的缩放值。适合量化的每个激活张量都有一个由校准过程推导出的关联缩放。
TensorRT 11 移除了隐式量化和 IInt8Calibrator 接口。在 TensorRT 11 及更高版本上,Ultralytics 使用 NVIDIA ModelOpt 显式量化执行 INT8 量化,该量化在构建强类型引擎之前将 Q/DQ 节点插入 ONNX 图中,并且使用 ModelOpt AutoCast 混合精度转换应用 FP16。quantize=8、quantize=16 和 data 参数的工作方式相同;ModelOpt 在首次使用时会自动安装。在 TensorRT 7-10 上,改用下面描述的旧版校准器。
处理隐式量化网络时,TensorRT 会适时地使用 INT8 来优化层执行时间。如果某一层在 INT8 下运行更快且其数据输入和输出已分配量化尺度,则会为该层分配一个 INT8 精度的内核;否则,TensorRT 会根据哪种精度能为该层带来更快的执行时间,从 FP32 或 FP16 中选择一个内核精度。
必须确保使用与部署时相同的设备来执行 INT8 精度导出,这一点至关重要,因为校准结果在不同设备上可能会有所不同。
配置 INT8 导出#
在使用exportUltralytics YOLO 模型时提供的参数将极大影响导出模型的性能。它们还需要根据可用的设备资源进行选择,但对于大多数 Ampere(或更新的)NVIDIA 独显,默认参数应该可以正常工作。GPU 导出的使用校准算法为 "MINMAX_CALIBRATION",而 NVIDIA Jetson 上的 DLA 导出使用 "ENTROPY_CALIBRATION_2"。你可以在 TensorRT Developer Guide 中阅读有关可用选项的更多详细信息。Ultralytics 测试发现 "MINMAX_CALIBRATION" 是 GPU 导出的最佳选择,并且该算法是根据导出设备自动选择的。
-
workspace:控制转换模型权重时设备内存分配的大小(以 GiB 为单位)。-
根据你的校准需求和资源可用性调整
workspace值。虽然更大的workspace可能会增加校准时间,但它允许 TensorRT 探索更广泛的优化策略,从而可能提高模型性能和accuracy。相反,较小的workspace可以减少校准时间,但可能会限制优化策略,从而影响量化模型的质量。 -
默认值为
workspace=None,这将允许 TensorRT 自动分配内存。手动配置时,如果校准崩溃(无警告退出),可能需要增加此值。 -
如果
workspace的值大于设备可用内存,TensorRT 将在导出期间报告UNSUPPORTED_STATE,这意味着应该降低workspace的值或将其设置为None。 -
如果
workspace设置为最大值并且校准失败/崩溃,请考虑使用None进行自动分配,或者通过减小imgsz和batch的值来降低内存需求。 -
记住,INT8 的校准针对每个设备都是特定的,借用一台“高端”GPU 进行校准,可能会导致在另一台设备上进行推理时性能不佳。
-
-
batch:将用于推理的最大批次大小。在推理过程中可以使用较小的批次,但推理不接受大于指定大小的批次。
使用小批次可能会导致 INT8 校准期间缩放不准确。这是因为该过程根据它看到的数据进行调整。小批次可能无法捕获值的完整范围,从而导致最终校准出现问题。使用更大的batch size有助于确保更具代表性的校准结果。
NVIDIA 的实验表明,建议在进行 INT8 量化校准时,使用至少 500 张能够代表模型数据的校准图像。这只是一个指导原则,而不是硬性要求,你需要根据你的数据集表现来测试所需的内容。由于 TensorRT 的 INT8 校准需要校准数据,因此请务必在使用 TensorRT 的 quantize=8 时使用 data 参数,并使用 data="my_dataset.yaml",它将使用来自验证的图像进行校准。当导出到带有 INT8 量化的 TensorRT 时未传递 data 的值,默认情况下将使用基于模型任务的“小型”示例数据集之一,而不是抛出错误。
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.export(
format="engine",
dynamic=True, # (1)!
batch=8, # (2)!
workspace=4, # (3)!
quantize=8,
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")- 导出带有动态轴的内容,使用
quantize=8导出时将默认启用此功能,即使未明确设置也是如此。有关其他信息,请参阅export arguments。 - 为导出的模型和 INT8 校准设置最大批次大小为 8。
- 分配 4 GiB 内存,而不是在转换过程中占用整个设备内存。
- 使用 COCO dataset 进行校准,具体为用于validation的图像(共 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 结合使用的缺点#
-
评估指标下降:使用较低的精度意味着
mAP、Precision、Recall或任何用于评估模型性能的其他指标可能会变得更差。Sigmoid 层保持较高精度以保留得分校准,但 INT8 仍然可以改变置信度值,因此请从 INT8 模型自身的 F1 曲线中选择操作阈值。请参阅Performance results section,以比较在各种设备的小样本上使用 INT8 导出时的mAP50和mAP50-95之间的差异。 -
开发时间增加: 为特定数据集和设备寻找 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 个预训练类别。
显示了使用预训练权重 yolov8n.engine 进行每个测试的 mean、min(最快)和 max(最慢)的推理时间
| 精确率 | 评估测试 | 平均值 (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 |
消费级 GPU#
已在 Windows 10.0.19045 上测试,python 3.10.9、ultralytics==8.2.4、tensorrt==10.0.0b6
显示了使用预训练权重 yolov8n.engine 进行每个测试的 mean、min(最快)和 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 |
嵌入式设备#
已在 JetPack 6.0 (L4T 36.3) Ubuntu 22.04.4 LTS 上测试,python 3.10.12、ultralytics==8.2.16、tensorrt==10.0.1
显示了使用预训练权重 yolov8n.engine 进行每个测试的 mean、min(最快)和 max(最慢)的推理时间
| 精确率 | 评估测试 | 平均值 (ms) | 最小值 | 最大值 (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 |
请参阅我们的quickstart guide on NVIDIA Jetson with Ultralytics YOLO,以了解有关设置和配置的更多信息。
请参阅我们的quickstart guide on NVIDIA DGX Spark with Ultralytics YOLO,以了解有关设置和配置的更多信息。
评估方法#
展开下方部分,获取关于这些模型如何导出和测试的信息。
导出配置
有关导出配置参数的详细信息,请参阅export mode。
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, quantize=16)
# 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, quantize=8, data="coco8.yaml"
)预测循环
有关其他信息,请参阅predict mode。
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",
)验证配置
要了解有关验证配置参数的更多信息,请参阅The val mode。
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 模型的指南,请查看以下资源:
-
Deploy Ultralytics with a Triton Server:关于如何专门将 NVIDIA 的 Triton Inference(以前称为 TensorRT Inference)服务器与 Ultralytics YOLO 模型配合使用的指南。
-
Deploying Deep Neural Networks with NVIDIA TensorRT:本文介绍了如何使用 NVIDIA TensorRT 在基于 GPU 的部署平台上高效部署深度神经网络。
-
End-to-End AI for NVIDIA-Based PCs: NVIDIA TensorRT Deployment:这篇博文介绍了使用 NVIDIA TensorRT 在基于 NVIDIA 的电脑上优化和部署 AI 模型。
-
GitHub Repository for NVIDIA TensorRT::这是包含 NVIDIA TensorRT 源代码和文档的官方 GitHub 仓库。
总结#
在本指南中,我们重点介绍了将 Ultralytics YOLO26 模型转换为 NVIDIA 的 TensorRT 模型格式。此转换步骤对于提高 YOLO26 模型的效率和速度至关重要,使其在各种部署环境中更加有效和适用。
有关使用细节的更多信息,请查看 TensorRT official documentation。
如果你对其他 Ultralytics YOLO26 集成感到好奇,我们的integration guide page提供了丰富的信息资源和见解。
常见问题解答#
我该如何将 YOLO26 模型转换为 TensorRT 格式?#
要将你的 Ultralytics YOLO26 模型转换为 TensorRT 格式以进行优化的 NVIDIA GPU 推理,请遵循以下步骤:
-
安装所需软件包:
pip install ultralytics -
导出你的 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 Installation guide 和 export documentation。
使用 TensorRT 处理 YOLO26 模型有哪些好处?#
使用 TensorRT 优化 YOLO26 模型可提供以下几点优势:
- 更快的推理速度:TensorRT 可优化模型层并使用精度校准(INT8 和 FP16)来加速推理,且不会显著牺牲精度。
- 内存效率:TensorRT 动态管理张量内存,减少开销并提高 GPU 内存利用率。
- 层融合:将多个层合并为单个操作,从而降低计算复杂度。
- 内核自动调优:为每个模型层自动选择优化的 GPU 内核,以确保最佳性能。
要了解更多信息,请浏览 official TensorRT documentation from NVIDIA 以及我们的in-depth TensorRT overview。
我可以在 YOLO26 模型中使用 TensorRT 的 INT8 量化吗?#
可以,你可以使用带有 INT8 量化的 TensorRT 来导出 YOLO26 模型。此过程涉及训练后量化 (PTQ) 和校准:
-
使用 INT8 导出:
from ultralytics import YOLO model = YOLO("yolo26n.pt") model.export(format="engine", batch=8, workspace=4, quantize=8, data="coco.yaml") -
运行推理:
from ultralytics import YOLO model = YOLO("yolo26n.engine", task="detect") result = model.predict("https://ultralytics.com/images/bus.jpg")
有关更多详情,请参阅exporting TensorRT with INT8 quantization section。
如何将 YOLO26 TensorRT 模型部署到 NVIDIA Triton Inference Server 上?#
你可以使用以下资源将 YOLO26 TensorRT 模型部署到 NVIDIA Triton Inference Server 上:
- Deploy Ultralytics YOLO26 with Triton Server:有关设置和使用 Triton Inference Server 的分步指导。
- Deploying Deep Neural Networks with NVIDIA TensorRT:NVIDIA 关于使用 TensorRT 部署深度学习模型的指南,其中包含详细的部署选项和配置。
这些指南将帮助你在各种部署环境中高效地集成 YOLO26 模型。
将 YOLO26 模型导出到 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 毫秒/图像
有关不同硬件配置的详细性能基准,可以在 performance section 中找到。
有关 TensorRT 性能的更多全面见解,请参考 Ultralytics documentation 以及我们的性能分析报告。