目录
- 前言
- 1. tensorRT基础概述
- 2. tensorRT补充知识
- 2.1 什么是tensorRT?
- 2.2 tensorRT特性
- 2.3 tensorRT工作流程
- 2.4 常见方案
- 2.5 tensorRT库文件
- 总结
前言
杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。
本次课程学习 tensorRT 基础-概述
课程大纲可看下面的思维导图
1. tensorRT基础概述
关于 tensorRT 你需要知道:
- TensorRT 的核心在于对模型算子的优化(合并算子、利用 GPU 特性选择特定核函数等策略),通过 tensorRT 能够在 NVIDIA 系列 GPU 上获得最好的性能
- 因此 tensorRT 的模型,需要在目标 GPU 上实际运行的方式选择最优算法和配置
- 也因此 tensorRT 生成的模型只能在特定条件下运行(编译的 trt 版本、cuda 版本、编译时的 GPU 型号)
- 主要知识点,是模型结构定义方式、编译过程配置、推理过程实现、插件实现、onnx 理解
参考文章:https://www.cnblogs.com/qccz123456/p/11767858.html
参考视频:https://www.bilibili.com/video/BV1Xw411f7FW/
2. tensorRT补充知识
2.1 什么是tensorRT?
tensorRT 是一个 SDK(Software Development Kit) 即软件开发工具包,用于优化经过训练的深度学习模型以实现高性能推理
2.2 tensorRT特性
tensorRT 为什么能加速推理过程,它是如何优化的?主要体现在以下几个方面:
- 算子融合 Conv+Bias+ReLU -> CBR
- 量化
- INT8 或 FP16 以及 TF32
- 存储优势、计算优势、通信优势
- 内核自动调整
- 根据不同显卡架构、SM数量、内核频率等选择不同的优化策略以及计算方式,寻找最适合当前架构的计算方式
- Kernel可以更加不同大小的batch和问题的复杂度去选择最合适的算法,TensorRT预先写了很多GPU实现,有一个自动选择的过程
- 动态张量线程WorkSpace
- 多流执行
下图展示了 tensorRT 的内部优化,它主要通过算子合并,降低数据扭转来加速推理过程
2.3 tensorRT工作流程
tensorRT 是如何构建模型呢?主要通过两种方式
1. 通过 TRT API 一层层搭建模型
-
tensorRT 提供基于 C++ 接口构建模型的方式,见下图,参考自TensorRT/samples/sampleMNISTAPI/sampleMNISTAPI.cpp
-
tensorRT 也提供基于 Python 接口构建模型的方式,见下图,参考自TensorRT/samples/python/engine_refit_mnist/sample.py
2. NVIDIA 官方也提供另外三种途径实现更加方便的封装,如下图所示
-
直接调用接口非常繁琐。出现问题难以调试,权重描述也比较麻烦,因此 也提供了更高级的方式
-
UFF 格式的文件,通过
libnvparsers.so
可以调用 TRT API 去解析 UFF 文件从而构建模型(tensorflow采用的方案) -
ONNX 格式的文件,通过
libnvonnxparser.so
可以调用 TRT API 去解析 ONNX 文件从而构建模型(pytorch采用的方案) -
Caffe 格式的文件,通过
libnvcaffe_parser.so
可以调用 TRT API 去解析 Caffe 文件从而构建模型(使用较少)
2.4 常见方案
基于 tensorRT 的发布,又有人在这之上做了工作,https://github.com/wang-xinyu/tensorrtx,该 repo 为每个模型写硬代码,并已写好了大量的常见模型代码
常用方案的模型构建的方式采用的硬代码,灵活度差。新模型需要自己一个 layer 一个 layer 的写 C++ 代码构建,不具有通用性,移植性差;而且硬代码方式过于灵活,需要控制的细节太多,部署时也无法查看网络结构进行分析和排查
本课程主要学习以 onnx 路线的模型编译、推理和部署,原因主要有:
若使用 onnx 则导出或者修改好的 onnx 模型,可以轻易的移植到其它引擎上,例如 ncnn、rknn,这一点硬代码无法做到。并且用于排查错误,修改调整时也非常方便
本课程的工作流程如下图所示:
2.5 tensorRT库文件
最后我们再来了解下 tensorRT 的库文件
总结
本次课程为 tensorRT 基础的概述,主要讲解了 tensorRT 的特性,它是 NVIDIA 推出的一个软件工具包,用来优化经过训练的深度学习模型以实现高性能推理,值得注意的是,由于 tensorRT 的模型,需要在目标 GPU 上以实际运行的方式选择最优算法和配置,也因此 tensorRT 生成的模型是与其设备强绑定的,与其编译时的 trt 版本、cuda 版本、GPU 型号相关联。
同时我们还了解了 tensorRT 的工作流程,主要分为两种,一种是通过 C++ 或者 Python 接口来写硬代码,这种方法过于灵活,不方便移植,同时部署错误很难排查。另外一种是通过更高级的封装,通过一些库文件来解析 caffe、uff 或者 onnx 模型,这种方法易于修改调整排查错误,也方便移植,因此本次课程采用第二种方式,