0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

NVIDIA TensorRT的命令行程序

星星科技指导员 来源:NVIDIA 作者:Ken He 2022-05-20 14:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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的性能指标(ShuffleNet,BS=16,best,TitanRTX@1200MHz)

pYYBAGKHO4qAREEbAAGiRSxfZKk173.png

将--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》 :打印/保存每层性能配置文件。

关于作者

Ken He 是 NVIDIA 企业级开发者社区经理 & 高级讲师,拥有多年的 GPU 和人工智能开发经验。自 2017 年加入 NVIDIA 开发者社区以来,完成过上百场培训,帮助上万个开发者了解人工智能和 GPU 编程开发。在计算机视觉,高性能计算领域完成过多个独立项目。并且,在机器人无人机领域,有过丰富的研发经验。对于图像识别,目标的检测与跟踪完成过多种解决方案。曾经参与 GPU 版气象模式GRAPES,是其主要研发者。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NVIDIA
    +关注

    关注

    14

    文章

    5732

    浏览量

    110363
  • gpu
    gpu
    +关注

    关注

    28

    文章

    5339

    浏览量

    136286
  • 人工智能
    +关注

    关注

    1821

    文章

    50552

    浏览量

    267988
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux运维工程师必备的30个高频命令

    生产环境中,Linux 命令行是运维工程师最常用的工具。很多时候,故障排查的第一步就是登录服务器敲命令,而不是打开监控面板。监控能告诉你什么时候出了问题,但定位根因往往需要你手动执行一系列命令去验证假设。
    的头像 发表于 05-25 11:00 370次阅读

    ROC rk3588s PC的uboot命令行的启动

    到了 Ubuntu 启动流程。根据您的 Wiki 指导,我曾尝试在启动时通过串口终端反复按下 Ctrl+C、空格等按键,但始终无法进入 U-Boot 命令行。我怀疑是 U-Boot 环境变量中的 bootdelay
    发表于 04-06 21:40

    涂鸦CLI正式开源:让AI Agent一行命令管理3000+品类智能设备

    最近,CLI(命令行工具)正在成为AIAgent时代的基础设施。飞书、企业微信、钉钉等多家主流办公协作平台,相继开源了各自的CLI工具,将消息、文档、日程等产品能力封装为命令行接口,供开发者
    的头像 发表于 04-02 18:10 489次阅读
    涂鸦CLI正式开源:让AI Agent一行<b class='flag-5'>命令</b>管理3000+品类智能设备

    运维工程师必须掌握的10个系统命令

    系统命令是运维工程师与服务器交互的基础工具。虽然现代运维工作有大量的自动化工具和平台,但掌握核心系统命令仍然必要。命令行工具响应速度快、不依赖图形界面、可以组合使用应对复杂场景。在服务器故障的紧急情况下,
    的头像 发表于 03-23 10:28 378次阅读

    Kubernetes kubectl命令行工具详解

    kubectl是Kubernetes官方提供的命令行工具,作为与Kubernetes集群交互的主要接口,它通过调用Kubernetes API Server实现对集群资源的全面管理。在生产环境中,运维工程师需要熟练掌握kubectl命令来完成日常的集群运维、应用部署、故障
    的头像 发表于 02-02 16:40 705次阅读

    命令行阿里千问搭建过程

    克隆千问仓库,安装依赖; 下载模型权重; 命令行执行启动脚本,配置参数后运行推理。
    发表于 12-24 10:35

    NVIDIA TensorRT LLM 1.0推理框架正式上线

    TensorRT LLM 作为 NVIDIA 为大规模 LLM 推理打造的推理框架,核心目标是突破 NVIDIA 平台上的推理性能瓶颈。为实现这一目标,其构建了多维度的核心实现路径:一方面,针对需
    的头像 发表于 10-21 11:04 1583次阅读

    使用AT组件命令行可以发送成功,但是在程序里发送总是超时,怎么解决?

    自己的问题自己解决,最后发现AT命令是在URC的回调函数中发送的,就是因为这个导致的问题。应该使用at_client_send()发送命令。 /* * 程序清单:AT Client 发送
    发表于 09-23 07:14

    所见即所得——Luban-Lite VS Code插件让开发实现“命令行自由”

    NEWS所见即所得!Luban-LiteVSCode插件指南亲爱的开发者朋友们,你是否还在为嵌入式开发中频繁切换命令行而抓狂?配置环境参数如“走迷宫”,编译烧录还需切换AiBurn?今天,匠芯创为您
    的头像 发表于 08-07 15:38 1324次阅读
    所见即所得——Luban-Lite VS Code插件让开发实现“<b class='flag-5'>命令行</b>自由”

    解析K8S实用命令

    前言: 作为运维工程师,掌握 Kubernetes 命令行工具是日常工作的核心技能。本文将深入解析 K8S 最实用的命令,从基础操作到高级技巧,助你成为容器化集群管理专家。
    的头像 发表于 07-24 14:07 1128次阅读

    USB串行配置实用程序是否有可用的命令行版本?

    USB串行配置实用程序是否有可用的命令行版本?
    发表于 07-22 08:09

    如何在魔搭社区使用TensorRT-LLM加速优化Qwen3系列模型推理部署

    TensorRT-LLM 作为 NVIDIA 专为 LLM 推理部署加速优化的开源库,可帮助开发者快速利用最新 LLM 完成应用原型验证与产品部署。
    的头像 发表于 07-04 14:38 2577次阅读

    labview通过JKL.net发送cmd命令行问题

    请问通过电脑直接发ssh命令,能正常输出,但通过JKL.net发送,提示\'\'ssh\'\'不是内部命令,如何解决?
    发表于 07-02 21:11

    浅谈wsl --update` 命令行选项无效的解决方案

    PS C:\Users\Administrator> wsl --update >> 命令行选项无效: --update
    的头像 发表于 06-27 10:28 1.2w次阅读

    使用NVIDIA Triton和TensorRT-LLM部署TTS应用的最佳实践

    针对基于 Diffusion 和 LLM 类别的 TTS 模型,NVIDIA Triton 和 TensorRT-LLM 方案能显著提升推理速度。在单张 NVIDIA Ada Lovelace
    的头像 发表于 06-12 15:37 2205次阅读
    使用<b class='flag-5'>NVIDIA</b> Triton和<b class='flag-5'>TensorRT</b>-LLM部署TTS应用的最佳实践