tensorRT介绍

1-什么是算力

TOPS是Tera Operations Per Second的缩写
1TOPS代表处理器每秒钟可进行一万亿次(10^12)操作
GOPS(Giga Operations Per Second:1GOPS代表处理器每秒钟可进行十亿次(10^9)操作
MOPS(Million Operation Per Second):1MOPS代表处理器每秒钟可进行一百万次(10^6)操作

一个MFLOPS(megaFLOPS)等于每秒一百万(=10^6)次的浮点运算
一个GFLOPS(gigaFLOPS)等于每秒十亿(=10^9)次的浮点运算
一个TFLOPS(teraFLOPS)等于每秒一万亿(=10^12)次的浮点运算,(1太拉)
一个PFLOPS(petaFLOPS)等于每秒一千万亿(=10^15)次的浮点运算

2-什么TensorRT

高吞吐率、低响应时间、低资源消耗以及简便的部署流程要求,因此TensorRT就是用来解决推理所带来的挑战以及影响的部署级的解决方案。TensorRT 是nvidia 自己开发的,主要作用就是对算法进行优化,然后进行了部署

TensorRT 部署流程:


第一步

第二步

TensorRT的部署分为两个部分:

  • 优化训练好的模型并生成计算流图
  • 使用TensorRT Runtime部署计算流图
TensorRT支持类型
  • 输入篇之网络框架:TensorRT3支持所有常见的深度学习框架包括Caffe、Chainer、CNTK、MXnet、PaddlePaddle、Pytorch、TensorFlow以及Theano。
  • 输入篇之接口方式:TensorRT3支持模型导入方式包括C++ API、Python API、NvCaffeParser和NvUffParser
  • 输出篇之支持系统平台:TensorRT3支持的平台包括Linux x86、Linux aarch64、Android aarch64和QNX aarch64。
  • 输出篇之支持硬件平台:TensorRT3可以运行在每一个GPU平台,从数据中心的Tesla P4/V100到自动驾驶和嵌入式平台的DrivePX及TX1/TX2。

3-TensorRT优化方式

  • 层间融合或张量融合(Layer & Tensor Fusion)
    如下图左侧是GoogLeNetInception模块的计算图。这个结构中有很多层,在部署模型推理时,这每一层的运算操作都是由GPU完成的,但实际上是GPU通过启动不同的CUDA(Compute unified device architecture)核心来完成计算的,CUDA核心计算张量的速度是很快的,但是往往大量的时间是浪费在CUDA核心的启动和对每一层输入/输出张量的读写操作上面,这造成了内存带宽的瓶颈和GPU资源的浪费。TensorRT通过对层间的横向或纵向合并(合并后的结构称为CBR,意指 convolution, bias, and ReLU layers are fused to form a single layer),使得层的数量大大减少。横向合并可以把卷积、偏置和激活层合并成一个CBR结构,只占用一个CUDA核心。纵向合并可以把结构相同,但是权值不同的层合并成一个更宽的层,也只占用一个CUDA核心。合并之后的计算图(图4右侧)的层次更少了,占用的CUDA核心数也少了,因此整个模型结构会更小,更快,更高效。


  • 数据精度校准(Weight &Activation Precision Calibration)
    大部分深度学习框架在训练神经网络时网络中的张量(Tensor)都是32位浮点数的精度(Full 32-bit precision,FP32),一旦网络训练完成,在部署推理的过程中由于不需要反向传播,完全可以适当降低数据精度,比如降为FP16或INT8的精度。更低的数据精度将会使得内存占用和延迟更低,模型体积更小。
    如下表为不同精度的动态范围:
    Precision Dynamic Range
    FP32
    FP16
    INT8

INT8只有256个不同的数值,使用INT8来表示 FP32精度的数值,肯定会丢失信息,造成性能下降。不过TensorRT会提供完全自动化的校准(Calibration )过程,会以最好的匹配性能将FP32精度的数据降低为INT8精度,最小化性能损失。关于校准过程,后面会专门做一个探究。

  • Kernel Auto-Tuning
    网络模型在推理计算时,是调用GPU的CUDA核进行计算的。TensorRT可以针对不同的算法,不同的网络模型,不同的GPU平台,进行 CUDA核的调整(怎么调整的还不清楚),以保证当前模型在特定平台上以最优性能计算。
    TensorRT will pick the implementation from a library of kernels that delivers the best performance for the target GPU, input data size, filter size, tensor layout, batch size and other parameters.

  • Dynamic Tensor Memory
    在每个tensor的使用期间,TensorRT会为其指定显存,避免显存重复申请,减少内存占用和提高重复使用效率。

  • Multi-Stream Execution
    Scalable design to process multiple input streams in parallel,这个应该就是GPU底层的优化了。

优化结果:

4-TensorRT运行一个demo

使用了nvidia 板子,使用了sdkmanager 安装,板子已经安装了下面软件


遇到问题:
第一步:
cd /usr/src/tensorrt/samples/sampleMNIST
查看README.md,在该目录下make
生产的bin 的路径是:
/usr/src/tensorrt/bin/sample_mnist
执行指令:
sudo ./sample_mnist [-h] [–datadir=/usr/src/tensorrt/data/mnist] [–useDLA=1] [–int8]

上面指令运行错误,找不到*.pgm
cd  /usr/src/tensorrt/data/mnist/
sudo python3 download_pgms.py
没有任何响应,稍等之后,下载有*.pgm

可能遇到的错误:
pip install pillow
Traceback (most recent call last):
  File "download_pgms.py", line 2, in 
    from PIL import Image
ModuleNotFoundError: No module named 'PIL

处理方式:
nvidia@nvidia-desktop:/usr/bin$ ls -l python
lrwxrwxrwx 1 root root 9 9?. 24 19:42 python -> python3.6
nvidia@nvidia-desktop:/usr/bin$ python -V
Python 3.6.9
下面运行指令可以安装pillow:
pip install pillow

sudo apt-get install python-pip
sudo apt-get install python3-pip

运行结果:


REF:
https://mp.weixin.qq.com/s/E5qbMsuc7UBnNmYBzq__5Q##
https://arleyzhang.github.io/articles/7f4b25ce/
https://www.pianshen.com/article/3389187425/
https://zhuanlan.zhihu.com/p/84125533
nvidia 官方参考文档:
https://docs.nvidia.com/deeplearning/tensorrt/quick-start-guide/index.html

你可能感兴趣的:(tensorRT介绍)