https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#work_dynamic_shapes

文章目录

  • 7.处理动态形状
    • 7.1. Specifying Runtime Dimensions
    • 7.2. Optimization Profiles
      • 7.2.1。 多个优化配置文件的绑定
    • 7.3. Layer Extensions For Dynamic Shapes
    • 7.4. Restrictions For Dynamic Shapes 动态形状的限制
    • 7.5。 执行张量vs.形状张量
    • 7.6。 形状张量I / O(高级)
    • 7.7. INT8 Calibration With Dynamic Shapes
  • 13. Working With Deep Learning Frameworks
    • 13.2. Working With PyTorch And Other Frameworks

7.处理动态形状

动态形状是将某些或所有张量尺寸推迟到运行时的能力。

1、网络定义不得具有隐式批处理维度。

2、通过使用-1作为该维度的占位符,指定输入张量的每个运行时维度。

3、在构建时指定一个或多个优化概要文件,这些概要文件为具有运行时维度的输入指定允许的维度范围,以及自动调谐器应针对其进行优化的维度。 有关更多信息,请参见优化配置文件。

4、要使用引擎:

  • a与没有动态形状的情况一样,从引擎创建执行上下文。
  • b 从第3步中指定一个覆盖输入尺寸的优化配置文件之一。
  • c 指定执行上下文的输入维。 设置输入尺寸后,您可以获取TensorRT为给定输入尺寸计算的输出尺寸。
  • d 入队。

要更改运行时尺寸,请重复步骤4b和4c,直到输入尺寸更改后,才需要重复这些步骤。

7.1. Specifying Runtime Dimensions

构建网络时,使用-1表示输入张量的运行时维。 例如,要创建一个名为foo的3D输入张量,其中最后两个维将在运行时指定,而第一个维在构建时固定,请发出以下命令。

networkDefinition.addInput("foo", DataType::kFLOAT, Dims3(3, -1, -1))

在运行时,您需要在选择优化配置文件后设置输入尺寸(请参见优化配置文件)。 假设输入foo的bindingIndex为0,并且输入的尺寸为[3,150,250]。 在为上面的示例设置优化配置文件后,您将调用:

context.setBindingDimensions(0, Dims3(3, 150, 250))

在运行时,要求引擎提供绑定维度会返回用于构建网络的相同维度,这意味着您将为每个运行时维度得到-1。

    engine.getBindingDimensions(0) returns a Dims with dimensions {3, -1, -1}.

要获取特定于每个执行上下文的实际尺寸,请查询执行上下文:

context.getBindingDimensions(0) returns a Dims with dimensions {3, 150, 250}.

注意:输入的setBindingDimensions的返回值仅表示相对于为该输入设置的优化配置文件的一致性。 指定所有输入绑定尺寸后,可以通过查询网络输出绑定的尺寸来检查整个网络是否与动态输入形状一致,如下所示。

nvinfer1::Dims out_dim = context->getBindingDimensions(out_index);if (out_dim.nbDims == -1) {
gLogError << "Invalid network output, this might be caused by inconsistent input shapes." << std::endl;
// abort inference
}

7.2. Optimization Profiles

优化配置文件描述了每个网络输入的尺寸范围以及自动调谐器用于优化的尺寸。 使用运行时维度时,必须在构建时至少创建一个优化配置文件。 两个配置文件可以指定不相交或重叠的范围。

例如,一个配置文件可以指定最小尺寸为[3,100,200],最大尺寸为[3,200,300],优化尺寸为[3,150,250],而另一个配置文件可以指定最小,最大和优化尺寸为[3,200,100],[3,300,400], 和[3,250,250]。

要创建优化配置文件,请首先构造一个IOptimizationProfile。 然后设置最小尺寸,优化尺寸和最大尺寸,并将其添加到网络配置中。 优化配置文件定义的形状必须定义网络的有效输入形状。 以下是上述针对输入foo的第一个配置文件的调用:

IOptimizationProfile* profile = builder.createOptimizationProfile();
profile->setDimensions("foo", OptProfileSelector::kMIN, Dims3(3,100,200);
profile->setDimensions("foo", OptProfileSelector::kOPT, Dims3(3,150,250);
profile->setDimensions("foo", OptProfileSelector::kMAX, Dims3(3,200,300);config->addOptimizationProfile(profile)

在运行时,需要在设置输入尺寸之前设置优化配置文件。 概要文件按添加顺序进行编号,从0开始。要选择示例中的第一个优化概要文件,请使用:

call context.setOptimizationProfileAsync(0, stream)where stream is the CUDA stream that is used for the subsequent enqueue() or enqueueV2() invocation in this context.

如果关联的CUDA引擎具有动态输入,则必须使用唯一的配置文件索引至少设置一次优化配置文件,该配置文件索引不会被其他未破坏的执行上下文使用。对于为引擎创建的第一个执行上下文,概要文件0被隐式选择。

可以调用setOptimizationProfileAsync()在配置文件之间切换。必须在当前上下文中完成任何enqueue()或enqueueV2()操作后调用它。当多个执行上下文同时运行时,允许切换到以前使用但已由具有不同动态输入维的另一个执行上下文释放的配置文件。

setOptimizationProfileAsync()函数替换了API setOptimizationProfile()现已弃用的版本。使用setOptimizationProfile()在优化配置文件之间切换可能会在后续的enqueue()或enqueueV2()操作操作中导致GPU内存复制操作。为了避免在入队期间进行这些调用,请改用setOptimizationProfileAsync()API。

在由多个配置文件构建的引擎中,每个配置文件都有单独的绑定索引。第K个配置文件的输入/输出张量的名称后面附加了[profile K],其中K用十进制表示。例如,如果INetworkDefinition的名称为“ foo”,而bindingIndex指向优化配置文件中的索引为3的张量,engine.getBindingName(bindingIndex)将返回“ foo [profile 3]”。

同样,如果使用ICudaEngine :: getBindingIndex(name)获取超出第一个配置文件(K = 0)的配置文件K的索引,请在INetworkDefinition中使用的名称后附加“ [profile K]”。例如,如果在INetworkDefinition中将张量称为“ foo”,则engine.getBindingIndex(“ foo [profile 3]”)返回优化配置文件3中的Tensor“ foo”的绑定索引。

始终忽略K = 0的后缀。

7.2.1。 多个优化配置文件的绑定

TensorRT 7.1在绑定索引方面比其前身更加严格。 以前,可以容忍错误配置文件的绑定索引。

考虑一个具有四个输入,一个输出的网络,

在IBuilderConfig中具有三个优化配置文件。

引擎有15个绑定,每个优化配置文件有5个绑定,从概念上讲,它们按表格组织:
图13.优化概要


每行都是一个配置文件。 表中的数字表示结合索引。 第一个概要文件的绑定索引为0…4,第二个概要文件的绑定索引为5…9,第三个概要文件的绑定索引为10…14。 在版本7.1之前(其中指定或隐含了配置文件索引),TensorRT接受了错误配置文件的绑定号,仅使用绑定索引来确定列。 在TensorRT 7.1中,绑定索引必须正确,否则您将看到提到bindingIndexBelongsToProfile的API检查失败。

但是,出于向后半兼容的考虑,如果绑定属于第一个配置文件但指定了另一个配置文件,则接口具有“自动更正”功能。 在这种情况下,TensorRT将警告该错误,然后从同一列中选择正确的绑定索引。

7.3. Layer Extensions For Dynamic Shapes

一些层具有允许指定动态形状信息的可选输入,还有一个新层IShapeLayer用于在运行时访问张量的形状。

此外,某些层允许计算新形状。

以下是与动态形状结合使用时可能会发现有用的内容的摘要。

IShapeLayer输出包含输入张量尺寸的一维张量。例如,如果输入张量的尺寸为[2,3,5,7],则输出张量将为包含{2,3,5,7}的四元素一维张量。如果输入张量是标量,则它的尺寸为[],而输出张量将是包含{}的零元素一维张量。

IResizeLayer接受可选的第二个输入,其中包含所需的输出尺寸。
IShuffleLayer在应用第二个转置之前接受一个可选的第二个输入,其中包含重塑尺寸。例如,以下网络将张量Y整形为具有与X相同的尺寸:

        auto* reshape = networkDefinition.addShuffle(Y);reshape.setInput(1, networkDefintion.addShape(X)->getOutput(0));

如果仅在Shuffle 层中使用输入张量,并且该层的输入和输出张量不是网络的输入和输出张量,则将省略与对基础数据进行标识操作等效的Shuffle 操作。

TensorRT不再为此类操作执行其他内核或内存副本。

ISliceLayer accepts an optional second, third, and fourth inputs containing the start, size, and stride.

IConcatenationLayer, IElementWiseLayer, IGatherLayer, IIdentityLayer, andIReduceLayer

可用于对形状进行计算并创建新的形状张量。

7.4. Restrictions For Dynamic Shapes 动态形状的限制

出现以下图层限制是因为图层的权重具有固定的大小:

  • IConvolutionLayer和IDeconvolutionLayer要求通道尺寸为构建时常数。
  • IFullyConnectedLayer要求最后三个维是构建时常量。
  • Int8要求通道尺寸为建立时间常数。
  • 接受其他形状输入的图层(IResizeLayer,IShuffleLayer,ISliceLayer)要求其他形状输入与最小和最大优化配置文件的尺寸以及运行时数据输入的尺寸兼容,否则可能导致构建 -time或运行时错误。

必须是构建时常量的值不必是API级别的常量。 TensorRT的形状分析器通过进行形状计算的图层逐元素进行恒定传播。 常数传播发现一个值是一个构建时常数就足够了。

7.5。 执行张量vs.形状张量

使用动态形状的引擎采用两阶段执行策略。

  • 计算所有张量的形状
  • 将工作流传输到GPU。
    阶段1是隐式的,由需求驱动,例如要求输出尺寸时。第2阶段与TensorRT的先前版本相同。两阶段执行对动态性设置了一些必须理解的限制。

关键限制是:

张量的等级必须在构建时确定。
张量可以是执行张量,形状张量或两者都可以。分类为形状张量的张量受以下讨论的限制。

执行张量是传统的TensorRT张量。形状张量是与形状计算有关的张量。它必须为0D或1D,类型为Int32或Bool,并且其形状必须在构建时确定。例如,有一个IShapeLayer,其输出是包含输入张量尺寸的一维张量。输出是形状张量。 IShuffleLayer接受可选的第二个输入,该输入可以指定重塑尺寸。第二个输入必须是形状张量。

关于它们处理的张量的种类,某些层是“多态的”。例如,IElementWiseLayer可以对两个Int32执行张量求和或对两个Int32形状张量求和。张量的类型取决于其最终用途。如果将总和用于重塑另一个张量,那么它就是一个“形状张量”。

7.6。 形状张量I / O(高级)

有时需要为网络进行整形张量I / O。例如,考虑一个仅由IShuffleLayer组成的网络。 TensorRT将推断第二个输入是形状张量。 ITensor :: isShapeTensor将为此返回true。由于它是输入形状张量,因此TensorRT将需要两件事。

在构建时:形状张量的优化轮廓值。
在运行时:形状张量的值。

输入形状张量的形状在构建时始终是已知的。这些值可用于指定执行张量的尺寸,因此需要对其进行描述。

可以使用IOptimizationProfile :: setShapeValues设置优化配置文件值。与必须为运行张量的执行张量提供最小,最大和最优化尺寸类似,在构建时必须为形状张量提供最小,最大和最优化值。

相应的运行时方法是IExecutionContext :: setInputShapeBinding,该方法在运行时设置形状张量的值。

由于“执行张量”与“形状张量”的推论基于最终用途,因此TensorRT无法推断网络输出是否为形状张量。您必须通过方法INetworkDefinition :: markOutputForShapes告诉它。

除了允许您输出形状信息以进行调试之外,此功能对于组成引擎也很有用。例如,考虑构建三个引擎,每个子引擎分别用于子网A,B,C,其中从A到B或B到C的连接可能涉及形状张量。以相反的顺序构建网络:C,B和A。构建网络C后,可以使用ITensor :: isShapeTensor确定输入是否为形状张量,并使用INetworkDefinition :: markOutputForShapes标记网络中相应的输出张量B.然后检查B的哪些输入是形状张量,并在网络A中标记相应的输出张量。

网络边界处的形状张量必须具有Int32类型。他们不能具有布尔型。

7.7. INT8 Calibration With Dynamic Shapes

要对具有动态形状的网络运行INT8校准,必须设置校准优化配置文件。 使用配置文件的kOPT值执行校准。 校准输入数据大小必须与此配置文件匹配。
要创建校准优化配置文件,请首先以与常规优化配置文件相同的方式构造一个IOptimizationProfile。 然后将配置文件设置为配置:

config->setCalibrationProfile(profile)

校准配置文件必须有效或为nullptr。 kMIN和kMAX值将被kOPT覆盖。 要检查当前的校准配置文件,请使用IBuilderConfig :: getCalibrationProfile。

如果未设置校准配置文件,则此方法返回指向当前校准配置文件的指针或nullptr。 当对具有动态形状的网络运行校准时,getBatchSize()校准器方法必须返回1。

注意:如果未设置校准优化配置文件,则第一个网络优化配置文件将用作校准优化配置文件。

13. Working With Deep Learning Frameworks

借助Python API,可以使用使用TensorFlow,Caffe或ONNX兼容框架构建的现有模型,使用提供的解析器来构建NVIDIA®TensorRT™引擎。 Python API还支持以NumPy兼容格式存储层权重的框架,例如PyTorch。

13.2. Working With PyTorch And Other Frameworks

PyTorch模型可以导出到ONNX,然后由TensorRT使用。

如果无法进行ONNX导出,则可以通过使用TensorRT API复制网络体系结构,然后从PyTorch(或具有NumPy兼容权重的任何其他框架)中复制权重,来导出到TensorRT。 有关将TensorRT与PyTorch模型一起使用的更多信息,请参见使用PyTorch和Python的TensorRT的“ Hello World”示例(network_api_pytorch_mnist)。

【tensorRT文档翻译】7. Working With Dynamic Shapes相关推荐

  1. 【tensorrt之dynamic shapes】

    1.  背景 Dynamic shapes指的是我们可以在runtime(推理)阶段来指定some或者all输入数据的维度,同时,提供C++和Python两种接口.一般需要指定为dynamic的是ba ...

  2. TensorRT文档翻译

    1 首先声明,我也是刚开始研究这个TensorRT的自定义层,之前试了很多方法,下了官方例程,看不懂ORZ.然后也去找了一些别的资料,也没能复现.特别是把NVIDIA的官方例子face_recongn ...

  3. NVIDA-TensorRT部署(一)

    TensorRT是一个高性能的深度学习推理(Inference)优化器,可以为深度学习应用提供低延迟.高吞吐率的部署推理.TensorRT可用于超大规模数据中心.嵌入式平台或自动驾驶平台进行推理加速. ...

  4. Technology Document Guide of TensorRT

    Technology Document Guide of TensorRT Abstract 本示例支持指南概述了GitHub和产品包中包含的所有受支持的TensorRT 7.2.1示例.Tensor ...

  5. Python API vs C++ API of TensorRT

    Python API vs C++ API of TensorRT 本质上,C++ API和Python API应该在支持您的需求方面接近相同.pythonapi的主要优点是数据预处理和后处理都很容易 ...

  6. tensorrt动态输入分辨率尺寸

    本文只有 tensorrt python部分涉动态分辨率设置,没有c++的. 目录 pytorch转onnx: onnx转tensorrt: python tensorrt推理: 知乎博客也可以参考: ...

  7. onnx格式转tensorRT

    自己写的onnx转trt的代码. 此处记录几点: 模型的输入须为numpy格式,所以直接从DataLoader取出的数据是不能直接扔进模型的 模型的输入是多个的时候,如输入多张图片时,可以通过下面这种 ...

  8. TensorRT详细入门指南

    前言 大名鼎鼎的TensorRT有多牛逼就不多说了,因为确实很好用. 作为在英伟达自家GPU上的推理库,这些年来一直被大力推广,更新也非常频繁,issue反馈也挺及时,社区的负责人员也很积极,简直不要 ...

  9. TensorRT 命令行程序trtexec常用用法

    安装TensorRT后,进入到/usr/src/tensorrt/bin目录下,可以看到有个trtexec二进制可执行文件,执行 ./trtexec --help可以看到命令行支持的所有参数项: == ...

  10. 使用TensorRT对AlphaPose模型进行加速

    最近刚完成使用TensorRT对AlphaPose人体姿态估计网络的加速处理,在这里记录一下大概的流程,具体代码我放在这里了. 目前主要有三种方式构建TensorRT的engine模型. (1) 第一 ...

最新文章

  1. 云南大学网络课程作业计算机,云南大学842计算机程序设计考研复习经验
  2. docker部署springboot_创建SpringBoot项目部署到docker全过程
  3. invoke方法_JVM是如何执行方法调用的?
  4. 学习重要,还是学会学习重要
  5. 大数据可视化技术价值体现在哪方面
  6. ios模拟器 安装ipa_用iOS模拟器安装App的方法
  7. 计算机网络(入门知识点最全整理)
  8. win10怎么快捷锁定计算机,win10一键快速锁屏快捷键的两种使用方法
  9. 一眼万年:AI眼底筛查为什么能够成为AI医疗中的“落地之王”
  10. 苹果开发者公司账号的申请步骤
  11. 数据库sql优化总结之5--数据库SQL优化大总结
  12. 【算法java版11】:实现求s = a + aa + aaa + aaaa + aa...a 的值,其中a是一个数字,几个数相加由键盘控制
  13. 后台配置商品规格sku(vue+element)
  14. navicat怎么查看mysql版本_navicat怎么看版本
  15. python从零开始搭建fdtd架构-1原理
  16. 换脸算法之DeepFaceLab
  17. 关键绩效指标与平衡计分卡(KPI/BSC)实战
  18. ZeppelinSpark Zeppelin开发spark
  19. nba2konline2 竞品分析
  20. PTA 7-228 加法口诀表

热门文章

  1. 利用composer搭建PHP框架(五.自动加载)
  2. FFmpeg入门知识(二):Windows环境下编译FFMPEG源码
  3. 数据结构--------二叉排序树
  4. DCFEE: A Document-level Chinese Financial Event Extraction System based on Automatically Labeled Tra
  5. Flutter实战之图片圆角和圆形简单实现
  6. VSCode 上竟然也能约会,谈对象了???
  7. python基础篇——元组
  8. python可迭代对象相关的内建函数_python之函数闭包、可迭代对象和迭代器
  9. javaweb java代码写在哪里_写了那么多年 Java 代码,终于 debug 到 JVM 了
  10. php判断平板,一种 PHP 判断设备是否是手机/平板的方法