欢迎光临散文网 会员登陆 & 注册

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。




TensorRT 教程 | 基于 8.6.1 版本 | 第一部分的评论 (共 条)

分享到微博请遵守国家法律