发行说明#
这些发行说明描述了 TensorRT 发布产品包的主要功能、软件增强和改进以及已知问题。
要查看以前版本的 TensorRT 文档,请参阅 TensorRT 存档文档。
要查看 TensorRT 10.8.0 及更高版本的文档,请从左下角的导航选择器切换中选择一个版本。
TensorRT 10.8.0#
这些是 TensorRT 10.8.0 发行说明,适用于 x86 Linux 和 Windows 用户,以及 Linux 上服务器基本系统架构 (SBSA) 用户的基于 Arm 的 CPU 核心。此版本包括之前 TensorRT 版本的多个修复程序和其他更改。
公告
此版本支持 NVIDIA Blackwell GPU,例如 GeForce 50 系列。B200 和 GB200 NVL 在此版本中支持有限,应被视为早期访问版本。
从 TensorRT 10.8 开始,Linux x86_64 构建的最低 glibc 版本为 2.28。TensorRT 10.8 预计与 RedHat 8.x(及其衍生版本)和更新的 RedHat 发行版兼容。它还预计与 Ubuntu 20.04 和更新的 Ubuntu 发行版兼容。这与 CUDA 对 glibc 最低版本的类似更改保持一致,CUDA 从 12.8 版本开始进行了类似的更改。
所有平台的 TensorRT CUDA 12.8 构建均使用较新的 GCC C++11 ABI 编译。我们预计此更改对客户不可见,并且不会影响 TensorRT API 或 ABI 兼容性。
主要特性和增强功能
此 TensorRT 版本包括以下主要特性和增强功能。
增加了对 NVIDIA Blackwell GPU 上使用显式量化的 E2M1 FP4 数据类型的支持。有关更多信息,请参阅 使用量化类型 部分。
增加了对平铺优化的支持,该优化支持跨内核平铺推理。有关更多信息,请参阅 平铺优化 部分。
添加了一个新的层类型
ICumulativeLayer
,它计算张量轴上的连续缩减。添加了一个新的示例 sampleEditableTimingCache,用于演示如何修改时间缓存以构建具有所需策略的引擎。有关更多信息,请参阅 使用可编辑时间缓存创建确定性构建 部分。
破坏 ABI 更改
INetworkDefinition 中存在 ABI 破坏。链接到先前版本 TensorRT 10.x 的应用程序(使用
INetworkDefinition
API)可能无法在 TensorRT 10.8 中正常工作,除非重新链接。这将在下一个版本中修复,该版本将与 10.x 版本(10.8 除外)ABI 兼容。
兼容性
TensorRT 10.8.0 已使用以下项进行测试
PyTorch >= 2.0(请参阅每个示例的
requirements.txt
文件)
此 TensorRT 版本支持 NVIDIA CUDA
此 TensorRT 版本需要至少 NVIDIA 驱动程序 r450(在 Linux 上)或 r452(在 Windows 上),这是 CUDA 11.0(此 TensorRT 版本支持的最低 CUDA 版本)的要求。
限制
使用
markDebug
API 将多个图形输入张量标记为调试张量时,存在已知问题。组卷积和深度可分离卷积没有优化的 FP8 卷积。因此,对于包含这些卷积运算的 ConvNet,仍然建议使用 INT8。
FP8 卷积仅支持 16 的倍数的输入/输出通道。否则,TensorRT 将回退到非 FP8 卷积。
FP8 卷积不支持大于 32 的内核大小,例如 7x7 卷积,并且将使用 FP16 或 FP32 回退内核,性能欠佳。因此,为了获得更好的性能,请勿在具有大内核大小的卷积之前添加 FP8 Q/DQ 运算。
FP8 MHA 中批量 GEMMS 的累积
dtype
必须为 FP32。这可以通过在批量 GEMM 之前添加 Cast(转换为 FP32)运算,以及在批量 GEMM 之后添加 Cast(转换为 FP16)运算来实现。
或者,您可以使用 TensorRT Model Optimizer 转换您的 ONNX 模型,它会自动添加 Cast 运算。
在 FP8 MHA 中,第一个批量 GEMM 和 softmax 之间不能有任何逐点运算,例如具有注意力掩码。这将在未来的 TensorRT 版本中得到改进。
FP8 MHA 融合仅支持 16 的倍数的头大小。如果 MHA 的头大小不是 16 的倍数,请勿在 MHA 中添加 Q/DQ 运算,以回退到 FP16 MHA 以获得更好的性能。
在 QNX 上,分段为大量 DLA 可加载项的网络在推理期间可能会失败。
DLA 编译器可以删除恒等转置,但不能将多个相邻的转置层融合为单个转置层(重塑也是如此)。例如,给定一个 TensorRT
IShuffleLayer
,它由两个非平凡转置和一个中间的恒等重塑组成,除非用户预先在模型定义中手动合并转置,否则 shuffle 层将被转换为两个连续的 DLA 转置层。在隐式批处理模式下,不支持
IUnaryLayer
的nvinfer1::UnaryOperation::kROUND
或nvinfer1::UnaryOperation::kSIGN
操作。对于包含归一化层的网络,特别是当以混合精度部署时,请以包含相应函数运算的最新 ONNX opset 为目标,例如 LayerNormalization 的 opset 17 或 GroupNormalization 的 opset 18。对于归一化层,使用函数运算的数值精度优于使用原始运算的相应实现。
权重流式传输目前主要支持基于 GEMM 的网络,如 Transformers。基于卷积的网络可能只有少量权重可以流式传输。
当两个具有 INT8-QDQ 和残差加法的卷积共享相同的权重时,不会发生常量权重融合。复制共享权重以获得更好的性能。
在 Windows 上构建
nonZeroPlugin
示例时,您可能需要修改vcxproj
文件中BuildCustomizations
路径中指定的 CUDA 版本,以匹配已安装的 CUDA 版本。如果
QuantizeLayer
与输出 FP4 数据类型一起使用,则比例因子必须是构建时常量。INT4 仅权重化 (WoQ) 中使用的权重无法重新拟合。
当阻塞轴不是最内层维度时,
DynamicQuantizeLayer
会失败。FP4 双量化中使用的高精度权重不可重新拟合。
已弃用 API 生命周期
在 TensorRT 10.8 中弃用的 API 将保留到 2026 年 2 月。
在 TensorRT 10.7 中弃用的 API 将保留到 2025 年 12 月。
在 TensorRT 10.6 中弃用的 API 将保留到 2025 年 11 月。
在 TensorRT 10.5 中弃用的 API 将保留到 2025 年 10 月。
在 TensorRT 10.4 中弃用的 API 将保留到 2025 年 9 月。
在 TensorRT 10.3 中弃用的 API 将保留到 2025 年 8 月。
在 TensorRT 10.2 中弃用的 API 将保留到 2025 年 7 月。
在 TensorRT 10.1 中弃用的 API 将保留到 2025 年 5 月。
在 TensorRT 10.0 中弃用的 API 将保留到 2025 年 3 月。
请参阅 API 文档(C++、Python),以获取有关更新代码以删除已弃用功能的使用的说明。
已弃用和已删除的功能
以下功能已在 TensorRT 10.8.0 中弃用或删除。
弃用了算法选择器 API,包括
IAlgorithmIOInfo
IAlgorithmVariant
IAlgorithmContext
IAlgorithm
IAlgorithmSelector
setAlgorithmSelector
getAlgorithmSelector
请改用
ITimingCache
中的可编辑模式。删除了 sampleAlgorithmSelector 示例。
在 NVIDIA Blackwell 及更高版本的平台上,TensorRT 将在以下插件类别中放弃 cuDNN 支持
用户编写的
IPluginV2Ext
、IPluginV2DynamicExt
和IPluginV2IOExt
插件,这些插件依赖于 TensorRT 提供的 cuDNN 句柄(通过attachToContext()
API)。TensorRT 标准插件,它们使用 cuDNN,具体来说是
InstanceNormalization_TRT
(版本 1、2 和 3)GroupNormalizationPlugin
(版本 1)
注意
TensorRT 的原生
INormalizationLayer
取代了这些归一化插件。TensorRT 对 cuDNN 相关插件的支持在 Blackwell 之前的平台上保持不变。弃用了
INetworkDefinition::addPluginV3
和IPluginV2Layer
。这些分别被INetworkDefinition::addPluginV3
和IPluginV3Layer
取代。
已修复的问题
当
IConstantLayer
之后是ICastLayer
时,可能会发生错误。此问题已修复。解决了 TensorRT 10.x 相对于 TensorRT 8.6 在涉及数据相关形状的网络(例如非最大值抑制或非零运算)方面的性能下降问题。
如果输入或输出张量具有超过 2^30 个元素,则某些 TF32 卷积策略可能导致 CUDA 非法内存访问错误。解决方法是禁用 TF32 并使用不同的精度,如 FP32 或 FP16。此问题已修复。
如果最大序列长度远大于 Hopper GPU 上优化配置文件中设置的最佳序列长度,则使用动态序列长度构建的融合多头注意力 (MHA) 内核与使用静态序列长度构建的融合 MHA 内核之间存在高达 30% 的性能差距。此问题已修复。
已知问题
功能性
在 H20 GPU 上运行 OSS demoBERT FP16 推理时,给定相同的输入值,不同的批大小可能会生成不同的输出。这可以通过使用固定的批大小来解决。
在 NVIDIA HGX H20 上运行某些网络时,存在已知的精度问题。
IRecurrenceLayer
的输入必须始终具有相同的形状。这意味着循环的递归输入更改形状的 ONNX 模型将被拒绝。如果使用 Python 包索引 (PyPI) 安装了 TensorRT 8.6 或 9.x,则无法使用 PyPI 将 TensorRT 升级到 10.x。您必须首先使用
pip uninstall tensorrt tensorrt-libs tensorrt-bindings
卸载 TensorRT,然后使用pip install tensorrt
重新安装 TensorRT。这将删除以前的 TensorRT 版本并安装最新的 TensorRT 10.x。此步骤是必需的,因为后缀 -cuXX 已添加到 Python 包名称中,这会阻止升级正常工作。CUDA 计算清理器可能会报告某些旧内核的 racecheck 危害。但是,相关的内核在运行时没有功能问题。
在 NVIDIA Hopper GPU 上运行 TensorRT 应用程序时,计算清理器
initcheck
工具可能会标记误报Uninitialized __global__ memory read
错误。这些错误可以安全地忽略,并将在即将发布的 CUDA 版本中修复。如果头数较少,则多头注意力融合可能不会发生并影响性能。
CUDA 12.1 中已修复 NVRTC 中发生的 use-after-free 问题。当将 CUDA 12.0 中的 NVRTC 与 TensorRT 静态库一起使用时,在某些情况下可能会遇到崩溃。链接 CUDA 12.1 或更高版本中的 NVRTC 和 PTXJIT 编译器将解决此问题。
Valgrind 内存泄漏检查工具在检测 TensorRT 应用程序中潜在的内存泄漏时报告了已知问题。抑制这些问题的建议是在运行 Valgrind 内存泄漏检查工具时提供包含以下内容的 Valgrind 抑制文件。在 Valgrind 命令行中添加选项
--keep-debuginfo=yes
以抑制这些错误。{ Memory leak errors with dlopen. Memcheck:Leak match-leak-kinds: definite ... fun:*dlopen* ... } { Memory leak errors with nvrtc Memcheck:Leak match-leak-kinds: definite fun:malloc obj:*libnvrtc.so* ... }
SM 7.5 及更早版本的设备可能没有适用于所有带有 Q/DQ 节点的层的 INT8 实现。在这种情况下,在构建引擎时,您会遇到
could not find any implementation
错误。要解决此问题,请删除量化失败层的 Q/DQ 节点。安装
cuda-compat-11-4
包可能会干扰 CUDA 增强的兼容性,并导致 TensorRT 即使在驱动程序为 r465 时也失败。解决方法是删除cuda-compat-11-4
包或将驱动程序升级到 r470。对于某些网络,使用 4096 的批大小可能会导致 DLA 上的精度下降。
对于在 DLA 上运行的广播逐元素层,并且启用了 GPU 回退,以及一个 NxCxHxW 输入和一个 Nx1x1x1 输入,如果至少一个输入以
kDLA_LINEAR
格式使用,则存在已知的精度问题。建议将此类逐元素层的输入格式显式设置为不同的张量格式。不支持使用
kAVERAGE
池化的独占填充。由于 Windows 10 中的错误,调试张量功能的、用户定义的
processDebugTensor
函数中不支持异步 CUDA 调用。quickly_deployable_plugins
Python 示例的inplace_add
迷你示例可能会在 Windows 上产生不正确的输出。这将在未来的版本中修复。当使用 RedHat
gcc-toolset-11
或更早版本的编译器链接libcudart_static.a
时,您可能会遇到异常处理不起作用的问题。当发生 throw 或异常时,catch 会被忽略,并引发 abort,从而终止程序。这可能与导致eh_frame_hdr
ELF 段为空的链接器错误有关。您可以使用新的链接器来解决此问题,例如来自gcc-toolset-13
的链接器。在 NVIDIA Blackwell 平台上,PluginV3 的
onShapeChange
和enqueue
函数的PluginTensorDesc
参数中的format
属性为kLinear(0)
;但是,张量的物理格式是正确的(如在configurePlugin
和setTactic
中配置的那样)。从 NVIDIA Blackwell 平台上的 PluginV3 的
enqueue
抛出的异常可能会逃脱异常处理例程。如果发生任何相关的 abort 或崩溃,解决方法是使用 try-catch 块作为 WAR。如果为 RoiAlign 插件 (
ROIAlign_TRT
) 提供了无效值的输入,TensorRT 可能会退出,尤其是在batch_indices
输入中指定的索引与使用的实际批大小不一致的情况下。当处理具有空索引的
ScatterND
操作时,引擎构建过程可能会遇到故障。当 TensorRT 在 Blackwell 之前的 GPU 上构建引擎时,Valgrind Memcheck 工具可能会报告内存泄漏,尤其是在模型包含卷积层的情况下。
当 TensorRT 构建引擎时,线程清理器工具可能会报告 CPU 线程的数据竞争。
在 NVIDIA Blackwell 平台上,当具有数据相关形状的张量传递到
IShuffleLayer
以进行重塑、具有动态轴的ISliceLayer
、IGatherLayer
或张量的数据相关维度将受到算术或逻辑运算影响的层时,引擎构建可能会失败。不支持使用非最内层块轴的动态量化。
当默认 GCC 版本为 7.5.0 时,sampleEditableTimingCache 示例可能无法在 SLES 15 上编译。这是由于缺少 <charconv> 头文件,该文件是完全 C++17 支持所必需的。可以通过安装 GCC 11 并将默认编译器切换到 GCC 11 来解决此问题。以下命令(以 root 身份运行)可能有助于您更改默认 GCC 版本。
# install gcc11 development tools zypper install gcc11 gcc11-c++ # add gcc11 as an alternative compiler update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 60 update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 60 # change the default compiler to gcc11 update-alternatives --config gcc update-alternatives --config g++
卷积/反卷积不支持具有非零空间输出维度和相应零输入维度。TensorRT 无法检测到此问题。当模型包含此类卷积/反卷积操作时,用户可能会看到崩溃,但没有相应的错误消息。
性能
由于某些 GEMM 和其他层之间的融合中断,GPU 内存有所增加。我们将进一步评估这种增加是否真的有利于 TensorRT 10.9 中的性能。
与 TensorRT 10.7 相比,Ampere GPU 上的
roberta_base
引擎存在已知的 CPU 峰值内存使用率下降问题。VIT 的推理性能下降高达 10%,GEMMs 选择找不到最佳内核。解决方法是将
setMaxNbTactics
编号增加到200
以添加更多策略,使用 trtexec 可以通过添加--maxTactics=200
来进行 WAR。与 CUDA 12.8 环境中的 TensorRT 10.7 相比,Hopper 精度 GPU 上的
cortanaasr_s128_bunk_e128
网络的推理性能下降高达 37%。与 Hopper GPU 上 CRNN(卷积循环神经网络)模型的 TensorRT 8.6 相比,上下文内存大小下降高达 100 MB。推理性能不受影响。
与 CUDA 11.8 环境中的 TensorRT 10.6 相比,Hopper GPU 上 FP16 精度下
StableDiffusion
v2.0/2.1 VAE 网络的推理性能下降高达 9%。可以通过将 CUDA 升级到 12.6 来解决此问题。与 Ampere GPU 上 TensorRT 8.6 相比,对于每组 N 个通道的组卷积(其中 N 不是 2 的幂),性能下降高达 60%。这可以通过将 N 填充到下一个 2 的幂来解决。
与 Ampere GPU 上 TensorRT 10.5 相比,INT8 精度下 HiFi-GAN 网络的上下文内存大小下降高达 22%。
与 H100 GPU 上 BS1 和 Seq128 的 TensorRT 10.6 相比,FP16 精度下 Megatron 网络的性能下降高达 7%。
与 A16 GPU 上 BS1 和 Seq128 的 TensorRT 10.4 相比,FP16 精度下从 TensorFlow2 导出的 BERT 网络的性能下降高达 10%。
由于必要的功能修复,与 TensorRT 10.3 相比,H100 GPU 上 FP8 精度下
StableDiffusion
XL VAE 网络的上下文内存使用率下降高达 16%。与 TensorRT 10.0 相比,包含 InstanceNorm 和 Activation 运算的网络上下文内存使用率下降高达 15%。
与 TensorRT 10.2 相比,NVIDIA Ada Lovelace GPU 上 FP16 精度和 OOTB 模式下 mbart-cnn/mamba-370m 的 CPU 内存使用率下降高达 15%。
与 H100 GPU 上 BS1 和 Seq128 的 TensorRT 10.2 相比,FP16 精度下 BERT/Megatron 网络的性能下降高达 6%。
与 H100 GPU 上 TensorRT 10.2 相比,FP16 精度下双向 LSTM 的性能下降高达 6%。
在不使用注意力插件的情况下运行 TensorRT-LLM 时,性能下降高达 25%。目前的建议是在使用 TensorRT-LLM 时始终启用注意力插件。
在启用 REFIT 构建的引擎和禁用 REFIT 构建的引擎之间存在已知的性能差距。
由于策略之间不稳定的策略选择,Orin 上 BERT-Large INT8-QDQ 模型的引擎大小波动高达 60 MB。
与 TensorRT 9.3 相比,INT8 精度下 BasicUNet、DynUNet 和 HighResNet 的性能下降高达 16%。
在 NVIDIA Hopper GPU 上,BART 网络的引擎构建时间最多增加 40 秒。
在 NVIDIA Ampere GPU 上,某些大型语言模型 (LLM) 的引擎构建时间最多增加 20 秒。
由于有更多策略可用于评估,某些类 Bert 模型的构建时间与 TensorRT 9.0 相比最多增加 2.5 倍。
与 TensorRT 8.5 相比,NVIDIA Ampere GPU 上 CortanaASR 模型的性能下降高达 13%。
与 TensorRT 8.5.1 相比,A30/A40 上 ShuffleNet 模型的性能下降高达 18%。
在具有隐式数据相关形状的张量上进行卷积运算可能比在相同大小的其他张量上运行慢得多。有关隐式数据相关形状的定义,请参阅 术语表。
对于在 FP16 精度下使用稀疏性的网络,性能下降高达 5%。
与 NVIDIA A10 GPU 上 FP16 精度下的 TensorRT 8.5 相比,OpenRoadNet 的性能下降高达 6%。
与 L4 GPU 上禁用 FP16 的 INT8 精度下的 BERT 网络上的 TensorRT 8.6 相比,性能下降高达 70%。在构建器配置中启用 FP16 并禁用 INT8 以解决此问题。
在显式量化网络中,预计在组卷积之前有一个 Q/DQ 对,但在之后没有 Q/DQ 对的情况下,以 INT8-IN-FP32-OUT 混合精度运行。但是,如果输入通道计数较小,NVIDIA Hopper 可能会回退到 FP32-IN-FP32-OUT。
与非重新拟合引擎相比,kREFIT 和 kREFIT_IDENTICAL 在分支或循环中存在卷积层且精度为 FP16/INT8 时,存在性能下降。此问题将在未来的版本中解决。