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

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

3天内不再提示

NVIDIA TensorRT支持矩阵中的流控制结构层部分

星星科技指导员 来源:NVIDIA 作者:Ken He 2022-05-13 16:57 次阅读

NVIDIA TensorRT 支持循环结构,这对于循环网络很有用。 TensorRT 循环支持扫描输入张量、张量的循环定义以及“扫描输出”和“最后一个值”输出。

10.1. Defining A Loop

循环由循环边界层(loop boundary layers)定义。

ITripLimitLayer指定循环迭代的次数。

IIteratorLayer使循环能够迭代张量。

IRecurrenceLayer指定一个循环定义。

ILoopOutputLayer指定循环的输出。

每个边界层都继承自类ILoopBoundaryLayer ,该类有一个方法getLoop()用于获取其关联的ILoop 。 ILoop对象标识循环。具有相同ILoop的所有循环边界层都属于该循环。

下图描绘了循环的结构和边界处的数据流。循环不变张量可以直接在循环内部使用,例如 FooLayer 所示。

一个循环可以有多个IIteratorLayer 、 IRecurrenceLayer和ILoopOutputLayer ,并且最多可以有两个ITripLimitLayer ,如后面所述。没有ILoopOutputLayer的循环没有输出,并由 TensorRT 优化。

NVIDIA TensorRT 支持矩阵中的流控制结构层部分描述了可用于循环内部的 TensorRT 层。

内部层可以自由使用在循环内部或外部定义的张量。内部可以包含其他循环(请参阅嵌套循环)和其他条件构造(请参阅条件嵌套)。

要定义循环,首先,使用INetworkDefinition ::addLoop方法创建一个ILoop对象。然后添加边界层和内部层。本节的其余部分描述了边界层的特征,使用loop表示INetworkDefinition ::addLoop返回的ILoop* 。

ITripLimitLayer支持计数循环和 while 循环。

loop -》addTripLimit( t ,TripLimit::kCOUNT)创建一个ITripLimitLayer ,其输入t是指定循环迭代次数的 0D INT32 张量。

loop -》addTripLimit( t ,TripLimit::kWHILE)创建一个ITripLimitLayer ,其输入t是一个 0D Bool 张量,用于指定是否应该进行迭代。通常t要么是IRecurrenceLayer的输出,要么是基于所述输出的计算。

一个循环最多可以有一种限制。

IIteratorLayer支持在任何轴上向前或向后迭代。

loop -》addIterator( t )添加一个IIteratorLayer ,它在张量t的轴 0 上进行迭代。例如,如果输入是矩阵:

2 3 5

4 6 8

第一次迭代的一维张量{2, 3, 5}和第二次迭代的{4, 6, 8} 。超出张量范围的迭代是无效的。

loop -》addIterator( t , axis )类似,但该层在给定的轴上迭代。例如,如果 axis=1 并且输入是矩阵,则每次迭代都会传递矩阵的一列。

loop -》addIterator( t , axis,reverse )类似,但如果reverse =true ,则该层以相反的顺序产生其输出。

ILoopOutputLayer支持三种形式的循环输出:

loop -》addLoopOutput( t, LoopOutput::kLAST_VALUE)输出t的最后一个值,其中t必须是IRecurrenceLayer的输出。

loop-》 addLoopOutput( t ,LoopOutput::kCONCATENATE, axis )将每次迭代的输入串联输出到t 。例如,如果输入是一维张量,第一次迭代的值为{ a,b,c} ,第二次迭代的值为{d,e,f} , axis =0 ,则输出为矩阵:

a b c

d e f

如果axis =1 ,则输出为:

a d

b e

c f

loop-》 addLoopOutput( t ,LoopOutput::kREVERSE, axis )类似,但颠倒了顺序。 kCONCATENATE和kREVERSE形式都需要第二个输入,这是一个 0D INT32 形状张量,用于指定新输出维度的长度。当长度大于迭代次数时,额外的元素包含任意值。第二个输入,例如u ,应使用ILoopOutputLayer::setInput(1, u )设置。

最后,还有IRecurrenceLayer 。它的第一个输入指定初始输出值,第二个输入指定下一个输出值。第一个输入必须来自循环外;第二个输入通常来自循环内部。例如,这个 C++ 片段的 TensorRT 模拟

for (int32_t i = j; 。..; i += k) 。..

可以通过这些调用创建,其中j和k是ITensor* 。

ILoop* loop = n.addLoop();

IRecurrenceLayer* iRec = loop-》addRecurrence(j);

ITensor* i = iRec-》getOutput(0);

ITensor* iNext = addElementWise(*i, *k,

ElementWiseOperation::kADD)-》getOutput(0);

iRec-》setInput(1, *iNext);

第二个输入是TensorRT允许后沿的唯一情况。如果删除了这些输入,则剩余的网络必须是非循环的。

10.2. Formal Semantics

TensorRT 具有应用语义,这意味着除了引擎输入和输出之外没有可见的副作用。因为没有副作用,命令式语言中关于循环的直觉并不总是有效。本节定义了 TensorRT 循环结构的形式语义。

形式语义基于张量的惰性序列(lazy sequences)。循环的每次迭代对应于序列中的一个元素。循环内张量X的序列表示为〈 X 0, X 1, X 2, 。.. 〉 。序列的元素被懒惰地评估,意思是根据需要。

IIteratorLayer(X)的输出是〈 X[0], X[1], X[2], 。.. 〉其中X[i]表示在IIteratorLayer指定的轴上的下标。

IRecurrenceLayer(X,Y)的输出是〈 X, Y0, Y1, Y2, 。.. 〉 。 的输入和输出取决于LoopOutput的类型。

kLAST_VALUE :输入是单个张量X ,对于 n-trip 循环,输出是X n 。

kCONCATENATE :第一个输入是张量X,第二个输入是标量形状张量Y。结果是X0, X1, X2, 。.. Xn-1与后填充(如有必要)连接到Y指定的长度。如果Y 《 n则为运行时错误。 Y是构建时间常数。注意与IIteratorLayer的反比关系。 IIteratorLayer将张量映射到一系列子张量;带有kCONCATENATE的ILoopOutputLayer将一系列子张量映射到一个张量。

kREVERSE :类似于kCONCATENATE ,但输出方向相反。

ILoopOutputLayer的输出定义中的n值由循环的ITripLimitLayer确定:

对于计数循环,它是迭代计数,表示ITripLimitLayer的输入。

对于 while 循环,它是最小的 n 使得$X_n$为假,其中X是ITripLimitLayer的输入张量的序列。

非循环层的输出是层功能的顺序应用。例如,对于一个二输入非循环层F(X,Y) = 〈 f(X 0 , Y 0 ), f(X 1 , Y 1 ), f(X 2 , Y 2 )。.. 〉 。如果一个张量来自循环之外,即是循环不变的,那么它的序列是通过复制张量来创建的。

10.3. Nested Loops

TensorRT 从数据流中推断出循环的嵌套。例如,如果循环 B 使用在循环 A 中定义的值,则 B 被认为嵌套在 A 中。

TensorRT 拒绝循环没有干净嵌套的网络,例如如果循环 A 使用循环 B 内部定义的值,反之亦然。

10.4. Limitations

引用多个动态维度的循环可能会占用意外的内存量。 在一个循环中,内存的分配就像所有动态维度都取任何这些维度的最大值一样。例如,如果一个循环引用两个维度为[4,x,y]和[6,y]的张量,则这些张量的内存分配就像它们的维度是[4,max(x,y),max(x ,y)]和[6,max(x,y)] 。

带有kLAST_VALUE的LoopOutputLayer的输入必须是IRecurrenceLayer的输出。 循环 API 仅支持 FP32 和 FP16 精度。

10.5. Replacing IRNNv2Layer With Loops

IRNNv2Layer在 TensorRT 7.2.1 中已弃用,并将在 TensorRT 9.0 中删除。使用循环 API 合成循环子网络。例如,请参阅sampleCharRNN方法SampleCharRNNLoop::addLSTMCell 。循环 API 让您可以表达一般的循环网络,而不是局限于IRNNLayer和IRNNv2Layer中的预制单元。

关于作者

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

审核编辑:郭婷

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

    关注

    14

    文章

    4588

    浏览量

    101702
  • gpu
    gpu
    +关注

    关注

    27

    文章

    4415

    浏览量

    126652
  • 人工智能
    +关注

    关注

    1776

    文章

    43824

    浏览量

    230581
收藏 人收藏

    评论

    相关推荐

    利用NVIDIA组件提升GPU推理的吞吐

    本实践中,唯品会 AI 平台与 NVIDIA 团队合作,结合 NVIDIA TensorRTNVIDIA Merlin HierarchicalKV(HKV)将推理的稠密网络和热
    的头像 发表于 04-20 09:39 150次阅读

    Torch TensorRT是一个优化PyTorch模型推理性能的工具

    那么,什么是Torch TensorRT呢?Torch是我们大家聚在一起的原因,它是一个端到端的机器学习框架。而TensorRT则是NVIDIA的高性能深度学习推理软件工具包。Torch Te
    的头像 发表于 01-09 16:41 386次阅读
    Torch <b class='flag-5'>TensorRT</b>是一个优化PyTorch模型推理性能的工具

    半导体芯片结构分析

    SEM+EDS 可以实现对芯片结构层的测量和元素分析。 机械研磨和氩离子研磨测试对比:离子研磨制样可避免机械研磨制样会造成划痕和软质金属的延展性形变问题的影响,离子研磨CP(氩离子抛光切割)可以避免在研磨过程
    发表于 01-02 17:08

    NVIDIA DOCA 2.5 长期支持版本发布

    正值 NVIDIA DOCA 面世三周年之际,NVIDIA 于近日发布了适用于 NVIDIA BlueField-3 网络平台的 NVIDIA DOCA 2.5 长期
    的头像 发表于 12-26 18:25 197次阅读
    <b class='flag-5'>NVIDIA</b> DOCA 2.5 长期<b class='flag-5'>支持</b>版本发布

    矩阵式变换器的拓扑结构和工作原理 矩阵式变换器的控制策略和仿真分析

    在目前各领域对于电能转换特别是高效变频装置存在迫切需求的背景下,在详细分析模块化的矩阵式变流器的拓扑结构、开关状态和工作原理的基础上,设计了一套矩阵式变流器的控制策略。采用编程实现了数
    的头像 发表于 12-26 14:07 1082次阅读
    <b class='flag-5'>矩阵</b>式变换器的拓扑<b class='flag-5'>结构</b>和工作原理 <b class='flag-5'>矩阵</b>式变换器的<b class='flag-5'>控制</b>策略和仿真分析

    如何在 NVIDIA TensorRT-LLM 中支持 Qwen 模型

    背景介绍 大语言模型正以其惊人的新能力推动人工智能的发展,扩大其应用范围。然而,由于这类模型具有庞大的参数规模,部署和推理的难度和成本极高,这一挑战一直困扰着 AI 领域。此外,当前存在大量支持模型
    的头像 发表于 12-04 20:25 527次阅读
    如何在 <b class='flag-5'>NVIDIA</b> <b class='flag-5'>TensorRT</b>-LLM 中<b class='flag-5'>支持</b> Qwen 模型

    4进4出HDMI矩阵的都支持哪几种控制切换方式?

    4进4出HDMI矩阵的都支持哪几种控制切换方式? 4进4出HDMI矩阵是一种多功能视频切换设备,它可以将多个HDMI输入信号切换到不同的HDMI输出,或将一个HDMI输入信号切换到多个
    的头像 发表于 12-04 15:13 365次阅读

    现已公开发布!欢迎使用 NVIDIA TensorRT-LLM 优化大语言模型推理

    能。该开源程序库现已作为 NVIDIA NeMo 框架的一部分,在 /NVIDIA/TensorRT-LLM GitHub 资源库中免费提供。 大语言模型彻底改变了人工智能领域,并创造
    的头像 发表于 10-27 20:05 523次阅读
    现已公开发布!欢迎使用 <b class='flag-5'>NVIDIA</b> <b class='flag-5'>TensorRT</b>-LLM 优化大语言模型推理

    阿里云 &amp; NVIDIA TensorRT Hackathon 2023 决赛圆满收官,26 支 AI 团队崭露头角

    2023 年 9 月 29 日,由阿里云、NVIDIA 联合主办,阿里云天池平台承办的 “NVIDIA TensorRT Hackathon 2023 生成式 AI 模型优化赛” 圆满落幕。该赛事
    的头像 发表于 10-17 03:20 352次阅读
    阿里云 &amp; <b class='flag-5'>NVIDIA</b> <b class='flag-5'>TensorRT</b> Hackathon 2023 决赛圆满收官,26 支 AI 团队崭露头角

    学习资源 | NVIDIA TensorRT 全新教程上线

    NVIDIA TensorRT   是一个用于高效实现已训练好的深度学习模型推理过程的软件开发工具包,内含推理优化器和运行环境两部分,其目的在于让深度学习模型能够在 GPU 上以更高吞吐量和更低
    的头像 发表于 08-04 17:45 467次阅读
    学习资源 | <b class='flag-5'>NVIDIA</b> <b class='flag-5'>TensorRT</b> 全新教程上线

    讯维高清混合矩阵的技术原理和结构

    高清混合矩阵的技术原理是将多个视频信号源进行混合和处理,并将处理后的信号输出到多个显示设备上。其结构包括输入接口、输出接口、控制面板、处理器等部分组成。   1.智能化:随着人工智能、
    的头像 发表于 07-28 10:10 234次阅读

    即刻报名第三届 NVIDIA TensorRT Hackathon 生成式 AI 模型优化赛

    近日,由阿里云及 NVIDIA 联合举办的 “NVIDIA TensorRT Hackathon 2023 生成式 AI 模型优化赛”已正式启动。此大赛是由阿里云天池组织运营,TensorRT
    的头像 发表于 07-17 19:45 335次阅读
    即刻报名第三届 <b class='flag-5'>NVIDIA</b> <b class='flag-5'>TensorRT</b> Hackathon 生成式 AI 模型优化赛

    NVIDIA TensorRT与Apache Beam SDK的集成

    使用 NVIDIA TensorRT 在 Apache Beam 中简化和加速机器学习预测
    的头像 发表于 07-05 16:30 274次阅读

    NVIDIA Hopper GPU上的新cuBLAS12.0功能和矩阵乘法性能

    NVIDIA Hopper GPU 上的新 cuBLAS 12.0 功能和矩阵乘法性能
    的头像 发表于 07-05 16:30 1755次阅读
    <b class='flag-5'>NVIDIA</b> Hopper GPU上的新cuBLAS12.0功能和<b class='flag-5'>矩阵</b>乘法性能

    NVIDIA 招聘 | NVIDIA 最新热招岗位!一起迎接未来加速计算!

    NVIDIA 计算架构团队和  NVIDIA 计算专家团队正在热招! 如果你对加速计算领域充满热情,并且希望与优秀的技术专家一起合作,那么这个机会将是你展现才华的优质平台,快来 加入
    的头像 发表于 06-14 18:35 658次阅读