0%

关于TensorRT和TF-TRT的一些事儿

近期一直在研究TensorRT的加速原理,对于层融合起先一直不理解,现在总算是知道加速的原理了,所以就把自己理解到的结合网上找到的一些资料进行整理汇总,最后我贴出自己整写的一个关于TensorRT加速原理的PPT,有需要的同学可以自己下载下来看看

TensorRT简介

TensorRT是NVIDIA 推出的基于CUDA和cudnn的进行高性能推理(Inference)加速引擎。

●曾用名:GPU Inference Engine(GIE)

●Tensor:表示数据流动以张量的形式

●RT:Runtime

训练阶段优化方法

  1. 外部数据:数据增强

    其中具体方式有:平移、 翻转、噪声、对比度、缩放、尺度变换

  2. 内部网络:

    1. 一阶优化:

      1. 梯度下降:随机梯度下降、批量梯度下降、小批量梯度下降
      2. 权重初始化
      3. 批规范化
      4. Dropout
      5. 动量法:AdaGrad RMSProp AdaDeita Adam
    2. 分治法:

      1. 坐标下降法
      2. SMO
      3. 分阶段优化
    3. 二阶优化:

      1. 牛顿法

      2. 拟牛顿法

      3. 可信域牛顿

训练优化

推理阶段优化方法

  1. 模型压缩:

    1. 前端压缩:
      1. 知识蒸馏
      2. 模型紧凑结构化
      3. 滤波器剪枝
    2. 后端压缩:
      1. 低秩近似:矩阵分解、分组卷积、卷积分解
      2. 网络二值化
      3. 参数量化
      4. 随机剪枝:突触剪枝、神经元剪枝、权重矩阵剪枝
  2. 优化推理引擎

    1. TVM

    2. TensorRT

    3. OpenVINO

推理优化

TensorRT加速原理

TensorRT优化方式

  1. 权重与激活精度校准:通过将模型量化为 INT8 来更大限度地提高吞吐量,同时保持高准确度
  2. 层与张量融合:通过融合内核中的节点,优化 GPU 显存和带宽的使用
  3. 内核自动调整:基于目标 GPU 平台选择最佳数据层和算法
  4. 动态张量显存:更大限度减少显存占用,并高效地为张量重复利用内存
  5. 多流执行:用于并行处理多个输入流的可扩展设计

优化方式的可行性分析

  1. 样本数据中存在角度、目标位置、目标姿态以及数据噪声,通过训练,我们获得具有强鲁棒性的模型,该模型对噪声有一定的容忍度。所以当进行推理时,我们便可以将FP32数据转低精度执行,引起的误差视为引入噪声,噪声引进的变动同样会使各个层的激活值输出发生变动,然而却对结果影响不大,所以以低精度推理是可行的;
  2. 推理中的时间消耗主要集中在:
    1. 每次启动CUDA核心需要大量时间
    2. 每一层输入/输出张量的读写耗时
      所以按照一般推理工作流,数据流经每一层都需要输入输出以及调用,势必造成时间线越拉越长,因此层与张量融合就是通过聚合具有足够相似参数和相同源张量的operations,减少调用CUDA次数,将零碎数据整理到一起传输,减少向CPU传输次数,最终实现减少横向时间
  3. 在每个tensor的使用期间,TensorRT会为其指定显存,避免显存重复申请,减少内存占用和提高重复使用效率
  4. TensorRT里边调用了一些方法,以一个最合理的方式去调用、操作这些数据
  5. CUDA多流执行把数据在传输过程中进行计算,隐藏了传输部分

TensorRT & TF-TRT

  1. TensorRT是由NVIDIA开发,而TF-TRT是由NVIDIA和Google TensorFlow团队共同开发

  2. TensorRT的当前版本支持3种“解析器”:Caffe,UFF和ONNX。根据TensorRT 7.0.0发行说明中的“弃用Caffe解析器和UFF解析器”,不建议使用Caffe和UFF解析器,首选ONNX解析器

  3. 为了优化TensorFlow模型,您可以选择将pb转换为UFF或ONNX,然后转换为TensorRT引擎。如果模型中的某些层不被TensorRT支持(请查看此表),则可以:

    1. 用插件替换这些层;
    2. 在构建TensorRT引擎时不要包括这些层,而是获取TensorRT引擎输出并进行处理以后再完成这些层的功能
  4. TF-TRT的优缺点:

    ​ 优点:

    1. API易于使用;
    2. 无需担心插件。

    ​ 缺点:

    1. 需要将整个TensorFlow库存储在平台中(这对部署环境不利)
    2. 需要在运行时将TensorFlow加载到内存中
    3. 通常比纯TensorRT引擎运行慢
  5. UFF TensorRT引擎的运行速度通常比TF-TRT优化图快得多,原因可能如下:

    1. 在整个图上进行优化,而不仅仅是在图的单个节点或部分上。TF-TRT是针对部分优化,而TensorRT是对整个计算图做优化;

    2. 基于计算图不同的优化方式,所以在后续选择版精度FP16甚至INT8时,在TF-TRT情况下也仅在图形的某些优化部分上进行FP16/INT8计算

    3. TensorRT在对CUDA内核的选取上有自己设计的优化机制,可以根据数据size\shape自动选取适合的CUDA内核,所以相较TF-TRT也是节省了时间

点击下载TensorRT原理简析PPT

参考链接

  1. 高性能深度学习支持引擎实战——TensorRT
  2. TensorRT 与 TF-TRT的区别
  3. Hardware for Deep Learning. Part 3: GPU
  4. Speed up TensorFlow Inference on GPUs with TensorRT
  5. 一文看懂深度学习模型压缩和加速