TensorRT 教程 | 基于 8.6.1 版本 | 第一部分
2023-07-15 15:54 作者:bleedingfight | 我要投稿

代码仓库:
https://github.com/NVIDIA/trt-samples-for-hackathon-cn.git
TensorRT作用:
构建期功能:
- 模型解析:解析网络模型,可以通过其它模型文件的解析或者是使用tensorrt层重写网络结构。
- 计算图优化:横向,纵向融合。(Conv+add+Relu)
- 节点消除:去除无用节点,节点变换(Pad、slice,concat,shuffle之类)
- 多精度支持:FP32、FP16、INT8、TF32(可能插入reformat节点)
- 优选kernel/format:硬件有关优化
- 导入plugin:实现自定义操作
- 显存优化:显存池复用。
运行期:
- 运行时环境:对象生命周期管理,显存管理,异常处理
- 序列化反序列化:引擎保存为文件或者从文件中加载。
[TensorRT介绍](https://developer.nvidia.com/blog/production-deep-learning-nvidia-gpu-inference-engine/)
Explicit Batch和Implicit Batch的差别:Implicit Batch的所有的Tensor的Batch维度会显示包含在Tensor形状中。运行期执行execute的时候指定。Explicit Batch:网络中所有Tensor的Batch应该显式在Tensor维度中表现出来。
Explicit Batch能做Implicit Batch不能做:
- Batch Normalization
- Reshape、Transpose、Reduce Over batch dimension
- Dynamic shape模式
- Loop结构
- Layer的一些高级用法(入ShuffleLayer.set_input)
Dynamic Shape模式:
- 适用于输入Tensor形状在推理时决定的网络
- 除了Batch维,其它维也可以推理时决定
- 需要Explicit Batch模式
- 需要Optimizeation Profile帮助网络优化
- 需要context.set_input_shape绑定世纪输入数据形状。
FP16模式:
- 开启fp16模式:config.flag=1<<int(trt.BuilderFlag.FP16)
- 建立engine时间比FP32更长(更多kernel选择、需要插入reformat节点)
- Timeline中出现nchwTonchw调用
- 部分层可能精度导致下降导致较大误差
- 找到误差较大的层(使用polygraphy)
- 强制该层使用 FP32计算:
- config.set_flag(trt.BuilderFlag.OBEY_PRECISION_CONSTANTS)
- layer.precision=trt.float32
遇到TensorRT不支持的节点:
- 修改源模型
- 修改onnx计算图
- TensorRT中实现Plugin
- 修改Parser:修改TRT源码并重新编译TRT。