17.TensorRT中文版开发教程-----TensorRT的命令行程序trtexec

TensorRT的命令行程序

在这里插入图片描述

点击此处加入NVIDIA开发者计划

A.3.1. trtexec

示例目录中包含一个名为trtexec的命令行包装工具。 trtexec是一种无需开发自己的应用程序即可快速使用 TensorRT 的工具。

trtexec工具有三个主要用途:

  • 它对于在随机或用户提供的输入数据上对网络进行基准测试很有用。
  • 它对于从模型生成序列化引擎很有用。
  • 它对于从构建器生成序列化时序缓存很有用。

A.3.1.1. Benchmarking Network

如果您将模型保存为 ONNX 文件、UFF 文件,或者如果您有 Caffe prototxt 格式的网络描述,则可以使用trtexec工具测试使用 TensorRT 在网络上运行推理的性能。 trtexec工具有许多选项用于指定输入和输出、性能计时的迭代、允许的精度和其他选项。

为了最大限度地提高 GPU 利用率, trtexec会提前将一个batch放入队列。换句话说,它执行以下操作:

enqueue batch 0 
-> enqueue batch 1 
-> wait until batch 0 is done 
-> enqueue batch 2 
-> wait until batch 1 is done 
-> enqueue batch 3 
-> wait until batch 2 is done 
-> enqueue batch 4 
-> ...

如果使用多流( --streams=N标志),则trtexec在每个流上分别遵循此模式。

trtexec工具打印以下性能指标。下图显示了trtexec运行的示例 Nsight 系统配置文件,其中标记显示了每个性能指标的含义。

Throughput

观察到的吞吐量是通过将执行数除以 Total Host Walltime 来计算的。如果这显着低于 GPU 计算时间的倒数,则 GPU 可能由于主机端开销或数据传输而未被充分利用。使用 CUDA 图(使用--useCudaGraph )或禁用 H2D/D2H 传输(使用--noDataTransfer )可以提高 GPU 利用率。当trtexec检测到 GPU 未充分利用时,输出日志提供了有关使用哪个标志的指导。

Host Latency

H2D 延迟、GPU 计算时间和 D2H 延迟的总和。这是推断单个执行的延迟。

Enqueue Time

将执行排入队列的主机延迟,包括调用 H2D/D2H CUDA API、运行主机端方法和启动 CUDA 内核。如果这比 GPU 计算时间长,则 GPU 可能未被充分利用,并且吞吐量可能由主机端开销支配。使用 CUDA 图(带有--useCudaGraph )可以减少排队时间。

H2D Latency

单个执行的输入张量的主机到设备数据传输的延迟。添加--noDataTransfer以禁用 H2D/D2H 数据传输。

D2H Latency

单个执行的输出张量的设备到主机数据传输的延迟。添加--noDataTransfer以禁用 H2D/D2H 数据传输。

GPU Compute Time

为执行 CUDA 内核的 GPU 延迟。

Total Host Walltime

从第一个执行(预热后)入队到最后一个执行完成的主机时间。

Total GPU Compute Time

所有执行的 GPU 计算时间的总和。如果这明显短于 Total Host Walltime,则 GPU 可能由于主机端开销或数据传输而未得到充分利用。

图 1. 在 Nsight 系统下运行的正常trtexec的性能指标(ShuffleNetBS=16,best,TitanRTX@1200MHz)

在这里插入图片描述

--dumpProfile标志添加到trtexec以显示每层性能配置文件,这使用户可以了解网络中的哪些层在 GPU 执行中花费的时间最多。每层性能分析也适用于作为 CUDA 图启动推理(需要 CUDA 11.1 及更高版本)。此外,使用--profilingVerbosity=detailed标志构建引擎并添加--dumpLayerInfo标志以显示详细的引擎信息,包括每层详细信息和绑定信息。这可以让你了解引擎中每一层对应的操作及其参数。

A.3.1.2. Serialized Engine Generation

如果您生成保存的序列化引擎文件,您可以将其拉入另一个运行推理的应用程序中。例如,您可以使用TensorRT 实验室以完全流水线异步方式运行具有来自多个线程的多个执行上下文的引擎,以测试并行推理性能。有一些警告;例如,如果您使用 Caffe prototxt 文件并且未提供模型,则会生成随机权重。此外,在 INT8 模式下,使用随机权重,这意味着 trtexec 不提供校准功能。

A.3.1.3. trtexec

如果您向--timingCacheFile选项提供时序缓存文件,则构建器可以从中加载现有的分析数据并在层分析期间添加新的分析数据条目。计时缓存文件可以在其他构建器实例中重用,以提高构建器执行时间。建议仅在相同的硬件/软件配置(例如,CUDA/cuDNN/TensorRT 版本、设备型号和时钟频率)中重复使用此缓存;否则,可能会出现功能或性能问题。

A.3.1.4. 常用的命令行标志

该部分列出了常用的trtexec命令行标志。

构建阶段的标志

  • --onnx=<model> :指定输入 ONNX 模型。

  • --deploy=<caffe_prototxt> :指定输入的 Caffe prototxt 模型。

  • --uff=<model> :指定输入 UFF 模型。

  • --output=<tensor> :指定输出张量名称。仅当输入模型为 UFF 或 Caffe 格式时才需要。

  • --maxBatch=<BS> :指定构建引擎的最大批量大小。仅当输入模型为 UFF 或 Caffe 格式时才需要。如果输入模型是 ONNX 格式,请使用--minShapes--optShapes--maxShapes标志来控制输入形状的范围,包括批量大小。

  • --minShapes=<shapes> , --optShapes=<shapes> , --maxShapes=<shapes> :指定用于构建引擎的输入形状的范围。仅当输入模型为 ONNX 格式时才需要。

  • --workspace=<size in MB> :指定策略允许使用的最大工作空间大小。该标志已被弃用。您可以改用--memPoolSize=<pool_spec>标志。

  • --memPoolSize=<pool_spec> :指定策略允许使用的工作空间的最大大小,以及 DLA 将分配的每个可加载的内存池的大小。

  • --saveEngine=<file> :指定保存引擎的路径。

  • --fp16--int8--noTF32--best :指定网络级精度。

  • --sparsity=[disable|enable|force] :指定是否使用支持结构化稀疏的策略。

    • disable :使用结构化稀疏禁用所有策略。这是默认设置。
    • enable :使用结构化稀疏启用策略。只有当 ONNX 文件中的权重满足结构化稀疏性的要求时,才会使用策略。
    • force :使用结构化稀疏启用策略,并允许 trtexec 覆盖 ONNX 文件中的权重,以强制它们具有结构化稀疏模式。请注意,不会保留准确性,因此这只是为了获得推理性能。
  • --timingCacheFile=<file> :指定要从中加载和保存的时序缓存。

  • --verbose :打开详细日志记录。

  • --buildOnly :在不运行推理的情况下构建并保存引擎。

  • --profilingVerbosity=[layer_names_only|detailed|none] :指定用于构建引擎的分析详细程度。

  • --dumpLayerInfo , --exportLayerInfo=<file> :打印/保存引擎的层信息。

  • --precisionConstraints=spec :控制精度约束设置。

    • none :没有限制。
    • prefer :如果可能,满足--layerPrecisions / --layerOutputTypes设置的精度约束。
    • obey:满足由--layerPrecisions / --layerOutputTypes设置的精度约束,否则失败。
  • --layerPrecisions=spec :控制每层精度约束。仅当PrecisionConstraints设置为服从或首选时才有效。规范是从左到右阅读的,后面的会覆盖前面的。 “ * ”可以用作layerName来指定所有未指定层的默认精度。

    • 例如: --layerPrecisions=*:fp16,layer_1:fp32将所有层的精度设置为FP16 ,除了 layer_1 将设置为 FP32
  • --layerOutputTypes=spec :控制每层输出类型约束。仅当PrecisionConstraints设置为服从或首选时才有效。规范是从左到右阅读的,后面的会覆盖前面的。 “ * ”可以用作layerName来指定所有未指定层的默认精度。如果一个层有多个输出,则可以为该层提供用“ + ”分隔的多种类型。

    • 例如: --layerOutputTypes=*:fp16,layer_1:fp32+fp16将所有层输出的精度设置为FP16 ,但 layer_1 除外,其第一个输出将设置为 FP32,其第二个输出将设置为 FP16

推理阶段的标志

  • --loadEngine=<file> :从序列化计划文件加载引擎,而不是从输入 ONNX、UFF 或 Caffe 模型构建引擎。
  • --batch=<N> :指定运行推理的批次大小。仅当输入模型为 UFF 或 Caffe 格式时才需要。如果输入模型是 ONNX 格式,或者引擎是使用显式批量维度构建的,请改用--shapes
  • --shapes=<shapes> :指定要运行推理的输入形状。
  • --warmUp=<duration in ms> , --duration=<duration in seconds> , --iterations=<N> : 指定预热运行的最短持续时间、推理运行的最短持续时间和推理运行的迭代。例如,设置--warmUp=0 --duration=0 --iterations允许用户准确控制运行推理的迭代次数。
  • --useCudaGraph :将推理捕获到 CUDA 图并通过启动图来运行推理。当构建的 TensorRT 引擎包含 CUDA 图捕获模式下不允许的操作时,可以忽略此参数。
  • --noDataTransfers :关闭主机到设备和设备到主机的数据传输。
  • --streams=<N> :并行运行多个流的推理。
  • --verbose :打开详细日志记录。
  • --dumpProfile, --exportProfile=<file> :打印/保存每层性能配置文件。

有关所有受支持的标志和详细说明,请参阅trtexec --help

有关如何构建此工具及其使用示例的详细信息,请参阅GitHub:trtexec/README.md文件。

<think>我们正在分析用户的问题:他想知道`trtexec --version`执行失败(显示FAILED)的原因,以及正常情况下成功执行的结果。 根据用户提供的错误信息:`trtexec --version执行结果显示FAILED TensorRT.trtexec [TensorRT v8402] # /data_1/TensorRT-8.4.2.4/bin/trtexec --version` 同时参考之前的引用内容,我们可以做如下分析: 1. 正常情况下,`trtexec --version`成功执行应该输出TensorRT的版本信息,例如:"TensorRT v8.4.2.4 ..."。 2. 用户遇到的情况是执行失败,输出中包含"FAILED"字样,并且后面还跟着一个版本标识(可能是内部版本号)[TensorRT v8402]。 3. 失败原因可能包括: a. 环境变量未正确设置,导致动态链接库找不到(如libnvinfer.so等)。 b. 系统中缺少必要的依赖库(如CUDA、cuDNN等)。 c. 权限问题,导致无法执行该二进制文件。 d. 二进制文件损坏或不完整。 4. 用户提供的引用中提到了设置PATH的方法(引用[1]),但没有设置LD_LIBRARY_PATH,而TensorRT运行时需要链接其库。 解决方案: 建议用户检查以下步骤: - 确保已经将TensorRT的lib目录添加到LD_LIBRARY_PATH中,例如: export LD_LIBRARY_PATH=/data_1/TensorRT-8.4.2.4/lib:$LD_LIBRARY_PATH - 确保CUDA和cuDNN已经正确安装,并且版本与TensorRT兼容(TensorRT 8.4.2.4通常需要CUDA 11.x)。 - 检查trtexec二进制文件是否具有可执行权限。 - 尝试直接运行绝对路径下的trtexec,并查看详细错误(可能有动态链接库的缺失提示)。 成功执行时的结果: 成功执行`trtexec --version`会显示TensorRT的版本信息,例如: TensorRT v8.4.2.4 (c) 2016-2022, NVIDIA CORPORATION. All rights reserved. 如果用户按照引用[1]设置了PATH,但未设置LD_LIBRARY_PATH,那么很可能是动态链接库找不到导致失败。 另外需要注意的是,用户提供的错误信息中有一个路径:`/data_1/TensorRT-8.4.2.4/bin/trtexec`,所以我们可以明确知道他在使用这个路径下的程序。 因此,在回答中,我们将先说明成功执行的结果,然后分析可能的原因和解决方法。 </think>### `trtexec --version` 执行结果分析 #### ✅ 正常执行结果 执行成功的标准输出应包含精确的 TensorRT 版本信息,格式如下: ```shell TensorRT v8.4.2.4 (c) 2016-2022, NVIDIA CORPORATION. All rights reserved. ``` **关键特征**: 1. **版本标识**:`vX.X.X.X` 格式(如 `v8.4.2.4`),与安装目录名严格匹配 2. **版权声明**:包含 NVIDIA 版权信息 3. **无错误提示**:无 `FAILED` 或其他错误标记 #### ️ 失败原因分析(显示 `FAILED TensorRT.trtexec`) 根据您的错误信息 `/data_1/TensorRT-8.4.2.4/bin/trtexec --version`,可能原因包括: ##### 1. 环境变量配置不完整 - **缺失 `LD_LIBRARY_PATH`**(最常见原因) TensorRT 依赖其动态链接库,需显式添加: ```bash export LD_LIBRARY_PATH=/data_1/TensorRT-8.4.2.4/lib:$LD_LIBRARY_PATH ``` - **PATH 未生效** 即使按引用[^1]配置 PATH,需确保执行 `source /etc/profile` 或重启终端 ##### 2. 依赖库缺失 - **CUDA/cuDNN 版本不兼容** TensorRT 8.4.2.4 需 CUDA 11.x + cuDNN 8.x,验证命令: ```bash nvcc --version # 验证CUDA cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2 # 验证cuDNN ``` ##### 3. 文件权限问题 ```bash chmod +x /data_1/TensorRT-8.4.2.4/bin/trtexec # 添加执行权限 ``` ##### 4. 安装包损坏 - 校验文件完整性: ```bash ls -lh /data_1/TensorRT-8.4.2.4/bin/trtexec # 正常大小应>50MB md5sum /data_1/TensorRT-8.4.2.4/bin/trtexec # 比对官网MD5 ``` #### 🔧 解决方案 按顺序执行以下命令: ```bash # 1. 配置环境变量 export PATH=/data_1/TensorRT-8.4.2.4/bin:$PATH export LD_LIBRARY_PATH=/data_1/TensorRT-8.4.2.4/lib:$LD_LIBRARY_PATH # 2. 验证依赖库 ldd /data_1/TensorRT-8.4.2.4/bin/trtexec | grep "not found" # 检查缺失库 # 3. 重新执行 trtexec --version ``` > 若仍有 `FAILED`,检查终端输出中的具体错误行(如 `undefined symbol: xxx`),通常指向特定库缺失[^1][^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扫地的小何尚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值