TensorRT 自学笔记001 基础知识点和学习资源

发布时间:2024年01月07日

TensorRT 自学笔记001 基础知识点和学习资源

各位大佬,这是我的自学笔记,如有错误请指正,也欢迎在评论区学习交流,谢谢!

TensorRT简介:

TensorRT 是一套可用于高效实现DL模型推理的SDK,它内含infer优化器和运行环境,能让DL模型在更低的资源占用的条件下,以更快的的运行。在TensorRT中,我们可以用API手动地一个Layer一个Layer地搭建Network,也可以直接使用来自ONNX的模型,如果使用后者,就不需要一层一层地搭建模型。

各种链接

Jetpack SDK
TensorRT文档
C++ API文档
Python API
TensoRT 下载
B站课程示例代码
B站官方课程链接

TensorRT的工作流程

构建期

加载模型,并优化模型,计算图优化,将多个层合并为一个层,消除无用层,导入用户自定义的plugin(可选)
注:上述这些操作都是为了,加快模型的推理速度,同时降低模型的资源消耗(CPU资源,内存资源)。

运行期

维护运行环境,然后序列化和反序列化engine

名词解释

下面是一些名词和功能的解释

显存池复用:

数据存在同一片显存中,可快速复用,以此避免内存的反复分配和释放。

logger

日志记录器,可以从详细到简略设置不同记录等级的日志。

builder

引擎构建器模型搭建的入口,构建模型的核心,可以用于创建TensorRT对象,创建用于Dyanmic Shape输入的配置器。

builderconfig

网络属性选项,用于设置模型的属性,如设置数据精度类型,设置explicit batch,设置Dynamic Shape等。

explicit batch显性批次和implicit batch隐性批次

explicit batch 即显式地指定张量的batch,explicit batch为主流开发方法,也支持更多功能

Dynamic Shape

实际开发时,我们会对模型输入不同的shape的数据,这要求模型每次接受的shape,batch等不同。所以提供了Dynamic Shape适用于输入张量shape在infer时才确定的情况,它不仅支持输入输出的调整,还可以在数据的不同批次的推理间随时做调整,几乎所有维度都动态可变。

Layer和Tensor

我们可以把Layer看作为计算节点,Tensor可以看作数据节点。
Tensor数据节点可作为一个Layer计算节点的输入输出节点,换句话说我们时用Layer计算节点和Tensor数据节点搭建出了整个网络。

Network

网络具体构造,网络主体,实际开发时,我们需要不断的用network添加各种网络层,标记输入输出张量和设置层属性。

context

类比cpu中的进程,用于设置张量的shape,用于执行真正的推理计算。

CUDA异构计算

开始推理时,我们需同时准备CPU和GPU内存,然后数据从内存copy至显存,在GPU端计算,然后将计算结果copy回内存

序列化和反序列化

将引擎保存下来即为序列化,加载以前保存好的引擎即为反序列化,这样就不用每次推理之前都构建一次引擎,直接加载使用即可。
注意,跨平台甚至是跨版本的序列化和反序列化是不可以的,甚至是相同平台,相同版本,不同时间构建的engine都可能是不同的

模型的TensorRT部署方式

将ONNX格式模型部署于设备上推理,有三种方式

1, 使用原框架自带的TRT接口
性能稍差,但易用性高,难度低,开发速度快
2, 使用Parser,将模型转换到TRT再使用
性能高,但需要改network和写适配的plugin,兼顾了效率和性能,是最推荐的开发方式
3, 使用TRT重建整个Network,再使用
性能最高,资源消耗最少,能精细控制Network,但是易用性和开发效率低

文章来源:https://blog.csdn.net/weixin_43111445/article/details/135432135
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。