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

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

3天内不再提示

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

jf_pmFSk4VX 来源:GiantPandaCV 2024-01-09 16:41 次阅读

大纲

Torch TensorRT介绍

JIT编译与AOT编译方法

两种方法的异同点

详细要点

1. Torch TensorRT介绍

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

它结合了PyTorch和NVIDIA的TensorRT

2. 两种编译方法

JIT编译:灵活,支持动态图和Python代码

AOT编译:支持序列化,固定输入shape

3. 编译流程

图转换、优化、划分、TensorRT转换

获得高性能优化模型

4. JIT编译细节

通过torch.compile调用

支持动态输入和条件判断

5. AOT编译细节

通过trace和compile API实现

使用inputAPI支持动态shape

支持序列化模型

6. 两种方法的异同

核心是基于同一图优化机制

JIT支持动态,AOT支持序列化

大家好,我叫乔治。嗨,我是迪拉杰,我们都是NVIDIA的深度学习软件工程师。今天我们在这里讨论使用Torch TensorRT加速PyTorch推断。首先,我们会给大家简短介绍一下Torch TensorRT是什么,然后乔治将深入介绍我们优化PyTorch模型的用户工作流程。最后,我们将比较这两种方法,并讨论一些正在进行的未来工作。现在我将把话筒交给乔治。

那么,什么是Torch TensorRT呢?Torch是我们大家聚在一起的原因,它是一个端到端的机器学习框架。而TensorRT则是NVIDIA的高性能深度学习推理软件工具包。Torch TensorRT就是这两者的结合。我们所做的是以一种有效且易于使用的方式将这两个框架结合起来,可以适用于各种用例和模型。Torch TensorRT是优化PyTorch模型的一种路径。

我将在今天的用例中分享一些方法,包括Model performance和core implementation。这意味着,如果你有一个单一的模型,并且你用我们的两种方法之一进行优化,你可以得到相似的性能和核心软件实现。现在你可能会问,为什么我要选择其中之一?因为不同的部署场景需要不同的方法。

8ab6f19a-ae25-11ee-8b88-92fbcf53809c.png

今天我们将介绍的两种方法是Flexible JIT方法和Serializable AOT方法。如果您的模型具有复杂逻辑,需要即时编译,并且可能需要Python严格部署,那么灵活的JIT方法可能对您来说是最好的选择。如果您需要整个图形捕获,需要对模型进行一些序列化,或者进行C++部署,那么AOT方法可能更适合您的用例。所以考虑到这一点,让我们走一遍这两个用户流程共享的内部路径。

为了优化PyTorch模型,从模型创建开始一直到优化,所以我们只需要用户提供一个预训练模型和一些编译设置。这些传递给编译器,即Torch TensorRT。现在,在这个绿色虚线框中的所有操作都是在幕后完成的,由编译器来处理。但是这有助于理解我们如何获得性能提升。

以下是一般的内部构造:

8aca5b22-ae25-11ee-8b88-92fbcf53809c.png

我们使用ATEN trace将graph转换过来。实际上,这意味着我们将torch操作符转换成ATEN表示,这只是以一种稍微容易处理的方式来表示相同的操作符。之后,我们进行lowering处理,包括常数折叠和融合以提高性能。然后我们进入划分阶段partitioning。Torch TensorRT会选择运行哪些操作,哪些操作在Torch中运行,从而生成您在右侧看到的分段图形。最后是转换阶段,对于在右侧看到的每个TensorRT图形,他们从其ATEN操作转换为等效的TensorRT layer,最后得到优化后的模型。

所以在谈到这个一般方法后,即针对两种用例的一般路径,我们将稍微深入了解JIT工作流程.,Dheeraj将讨论提前工作流程.,JIT方法使您享受到了Torch.compile的好处.,其中包括复杂的Python代码处理、自动图形分割.,.,NVIDIA的TensorRT的优化能力.,层张量融合、内核自动调优,以及您选择层精度的能力.,

8ae0d8ac-ae25-11ee-8b88-92fbcf53809c.png

在该方法的浏览版中,我们能够在不到一秒钟的时间内对稳定扩散的文本到图像进行基准测试.(4090 16fp 50epoch),那么,JIT方法背后的真正原理是什么?,嗯,从一开始就开始吧.,然后用户只需要在该模型上调用torch.compile,并指定TensorRT作为后端.,现在从这里开始的一切都是在幕后进行的,.,但有助于解释正在发生的事情.

8afea8aa-ae25-11ee-8b88-92fbcf53809c.png

因此,在这之后,Torch.compile将会将您的模型代码进行拆分,然后是一个dynamo guard(什么是 dynamo guard?请参考:TorchDynamo 源码剖析 04 - Guard, Cache, Executionhttps://zhuanlan.zhihu.com/p/630722214[1] ,可以简单理解为dynamo后到python代码的中间层),再然后是另一个graph。之所以会出现这个guard,是因为在代码中有一个条件语句。实际上,大多数机器学习模型的跟踪器都无法处理这样的条件语句,因为这个条件取决于输入的值。但是Torch Compile能够处理它,因为这个guard在Python中运行,并且会在条件的值发生变化时触发自动图形重新编译。

此外,还需注意其他因素也可能导致重新编译,例如如果您传入了不同形状的张量或者改变了其他参数。因此,这个graph / guard / graph构造现在进入了Torch Tensorrt后端,它将按照之前幻灯片中展示的相同过程进行处理。右上角的每个图形都会被转换为右下角您看到的Torch TensorRT优化版本。有效地将其分成TensorRT组件和Torch组件。需要注意的关键是Dynamo Guard保持完好。因为他提供了图分区的强大支持。第一级是在复杂Python代码的Python级别上。第二级是运算符级别上分区,在TensorRT中可以进一步加速的运算符以及可以在Torch中加速的其他运算符。

总结用法,用户只需对模型调用torch compile,指定后端tensorRT,并可选择一些选项,然后传递一些输入,它将实时进行编译。这种编译方法对用户来说非常可定制。您可以通过精度关键字参数选择层精度。您可以指定在TensorRT引擎块中所需的最小运算符数量,等等。

8b19b5a0-ae25-11ee-8b88-92fbcf53809c.png

就这些,接下来就交给Dheeraj讨论AOT方法。现在让我们来看看Torch TensorRT的AOT方法。

给定一个nn module的PyTorch图形,我们首先将其转换为Exported program。Exported program是在PyTorch 2.1中引入的一种新表示形式,它包含了Torch FX图形和状态字典两部分。其中,Torch FX图形包含了模型的张量计算,状态字典用于存储参数和缓冲区。这个转换是通过使用Dynamo.trace API来完成的。此API是对Torch.export的封装,并且除此之外,它还支持静态和动态输入。我们的追踪器API还执行一些附加的分解操作,以便将您的模型优化转换为TensorRT格式。

一旦我们获得了Exported program,我们AOT方法的主要API就是Dynamo.compile。这个API将这些Exported program转换为优化的TensorRT图形模块。在幕后,这个API执行lowering、分区和转换为TensorRT的操作,这些都是我们编译器的核心组件,正如您在演示的开头所看到的。一旦编译完成,输出的结果是一个包含TensorRT图形模块的TorchFX模块。

下面的代码段列出了该API的简单用法。一旦您声明了您的模型,只需将其传递给dynamo.trace,然后是dynamo.compile,该函数将返回优化后的TensorRT图模块。

8b44ac2e-ae25-11ee-8b88-92fbcf53809c.png

TensorRT期望图中每个动态输入都有一系列形状。

8b6bcfac-ae25-11ee-8b88-92fbcf53809c.png

在右边的图中,您可以看到我们可以使用torch_tensorrt.input API提供这些形状范围。与刚刚看到的jit流程的区别是您可以提供这个形状范围。这样做的好处是,如果输入形状在提供的范围内发生更改,您无需重新编译即可进行推理。静态是序列化的主要好处之一。

为了总结我们到目前为止所见到的内容,根据您的PyTorch图形,我们使用我们的trace API生成导出的程序,然后使用Dynamo.compile API进行编译。最后,您将获得一个TorchFX图模块,其中包含TensorRT优化的引擎。现在,您可以使用Dynamo.Serialize API,将这些图形模块对象转换为编程脚本或导出程序的表示形式,并随后保存到磁盘上。同样,右侧的代码片段非常易于使用。一旦您从Dynamo.compile中获得了TensorRT模型,只需使用模型及其输入调用serialize API即可。

8b87371a-ae25-11ee-8b88-92fbcf53809c.png

以下是我们目前所见的内容的概述。我们能够处理复杂的Python代码。通过重新编译支持动态形状,将已编译的模块序列化。此外,我们还能够通过我们的输入API支持动态形状,并且将它们序列化为.script或导出的程序,但它无法处理任何图形断点。

然而,这两者之间存在一些重要的相似之处。它们都经历类似的图形优化以进行高性能推断。Torch TensorRT在PyTorch框架中以两个关键路径提供了优化的推理方式。

8b9f5fe8-ae25-11ee-8b88-92fbcf53809c.png

结论和未来工作
Torch-TensorRT通过两个关键路径在PyTorch中提供了优化的推理:

对于JIT工作流和复杂模型,采用基于torch.compile的方法

对于AoT工作流和序列化,采用强大的基于Exported program的方法

未来的工作:

在两个路径上提供对动态形状的全面支持

改进对编译Exported program的序列化支持

通过支持额外的精度和优化,提高模型性能

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

    关注

    1

    文章

    2704

    浏览量

    47691
  • 机器学习
    +关注

    关注

    66

    文章

    8126

    浏览量

    130571
  • pytorch
    +关注

    关注

    2

    文章

    762

    浏览量

    12836

原文标题:9- Accelerated Inference in PyTorch 2.X with Torch tensorrt

文章出处:【微信号:GiantPandaCV,微信公众号:GiantPandaCV】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    NVIDIA扩大AI推理性能领先优势,首次在Arm服务器上取得佳绩

    最新MLPerf基准测试表明,NVIDIA已将其在AI推理性能和能效方面的高标准扩展到Arm以及x86计算机。
    发表于 09-23 14:18 2533次阅读
    NVIDIA扩大AI<b class='flag-5'>推理性能</b>领先优势,首次在Arm服务器上取得佳绩

    NVIDIA打破AI推理性能记录

     NVIDIA凭借A100进一步扩大了在MLPerf基准测试中的领先优势,实现了比CPU快237倍的AI推理性能,助力企业将AI研究转化为生产力。
    发表于 10-22 14:07 729次阅读

    Pytorch模型训练实用PDF教程【中文】

    优化器,从而给大家带来清晰的机器学习结构。通过本教程,希望能够给大家带来清晰的模型训练结构。当模型训练遇到问题时,需要通过可视化
    发表于 12-21 09:18

    怎样使用PyTorch Hub去加载YOLOv5模型

    PyTorch Hub 加载预训练的 YOLOv5s 模型,model并传递图像进行推理。'yolov5s'是最轻最快的 YOLOv5 型号。有关所有可用模型的详细信息,请参阅自述文
    发表于 07-22 16:02

    Arm Neoverse V1的AWS Graviton3在深度学习推理工作负载方面的作用

    类型在运行两种常见的 FP32 ML 模型时的 ML 推理性能。我们将在以后的博客中介绍量化推理 (INT8) 的性能。工作负载[MLCommons]在其[MLPerf
    发表于 08-31 15:03

    求助,为什么将不同的权重应用于模型会影响推理性能

    生成两 IR文件(相同的 .xml 文件,但不同的 .bin 文件) 具有不同重量的类似模型,以不同的 fps (27fps 和 6fps) 运行 更多样化的权重是否会影响 Myriad X 上的推理性能
    发表于 08-15 07:00

    如何提高YOLOv4模型推理性能

    使用 PyTorch 对具有非方形图像的 YOLOv4 模型进行了训练。 将 权重转换为 ONNX 文件,然后转换为中间表示 (IR)。 无法确定如何获得更好的推理性能
    发表于 08-15 06:58

    pytorch模型转换需要注意的事项有哪些?

    什么是JIT(torch.jit)? 答:JIT(Just-In-Time)是组编译工具,用于弥合PyTorch研究与生产之间的差距。它允许创建可以在不依赖Python解释器的情况
    发表于 09-18 08:05

    Xavier的硬件架构特性!Xavier推理性能评测

    Xavier主要用于边缘计算的深度神经网络推理,其支持Caffe、Tensorflow、PyTorch等多种深度学习框架导出的模型。为进一步提高计算效率,还可以使用TensorRT对训
    的头像 发表于 04-17 16:55 1.8w次阅读
    Xavier的硬件架构特性!Xavier<b class='flag-5'>推理性能</b>评测

    使用NVIDIA TensorRT优化T5和GPT-2

    在这篇文章中,我们向您介绍了如何将拥抱脸 PyTorch T5 和 GPT-2 模型转换为优化TensorRT 推理引擎。
    的头像 发表于 03-31 17:25 3124次阅读
    使用NVIDIA <b class='flag-5'>TensorRT</b><b class='flag-5'>优化</b>T5和GPT-2

    最新MLPerf v3.1测试结果认证,Gaudi2在GPT-J模型推理性能惊人

    英特尔产品在全新MLCommons AI推理性能测试中尽显优势 今日,MLCommons公布针对 60 亿参数大语言模型及计算机视觉与自然语言处理模型GPT-J的 MLPerf推理v3
    的头像 发表于 09-12 17:54 235次阅读
    最新MLPerf v3.1测试结果认证,Gaudi2在GPT-J<b class='flag-5'>模型</b>上<b class='flag-5'>推理性能</b>惊人

    Nvidia 通过开源库提升 LLM 推理性能

    加利福尼亚州圣克拉拉——Nvidia通过一个名为TensorRT LLM的新开源软件库,将其H100、A100和L4 GPU的大型语言模型(LLM)推理性能提高了一倍。 正如对相同硬件一轮又一轮改进
    的头像 发表于 10-23 16:10 325次阅读

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

    NVIDIA 于 2023 年 10 月 19 日公开发布 TensorRT-LLM ,可在 NVIDIA GPU 上加速和优化最新的大语言模型(Large Language Models)的
    的头像 发表于 10-27 20:05 536次阅读
    现已公开发布!欢迎使用 NVIDIA <b class='flag-5'>TensorRT</b>-LLM <b class='flag-5'>优化</b>大语言<b class='flag-5'>模型</b><b class='flag-5'>推理</b>

    用上这个工具包,大模型推理性能加速达40倍

    作者: 英特尔公司 沈海豪、罗屿、孟恒宇、董波、林俊 编者按: 只需不到9行代码, 就能在CPU上实现出色的LLM推理性能。 英特尔  Extension for Transformer 创新工具
    的头像 发表于 12-01 20:40 642次阅读
    用上这个<b class='flag-5'>工具</b>包,大<b class='flag-5'>模型</b><b class='flag-5'>推理性能</b>加速达40倍

    自然语言处理应用LLM推理优化综述

    当前,业界在将传统优化技术引入 LLM 推理的同时,同时也在探索从大模型自回归解码特点出发,通过调整推理过程和引入新的模型结构来进一步提升
    发表于 04-10 11:48 81次阅读
    自然语言处理应用LLM<b class='flag-5'>推理</b><b class='flag-5'>优化</b>综述