tensorRT 5.1.5.0 工作总结

第一章 产品介绍

就是GIE(GPU Inference Engine),利用GPU进行推理的引擎,做一系列优化(优化Model结构&优化cuda内核计算)使使用TensorRT后比常规的model前馈更快。其中,tensor表示数据流动以张量的形式,RT代表runtime。
在研发者手册上很清楚的介绍了tensorRT,TensorRT Developer Guide.
更多的了解,详见高性能深度学习支持引擎实战——TensorRT
有个相关的qq讨论群,关于tensorRT,群号:483063470

第二章 工作时间线

第一周 6.11-6.16

  1. 在服务器上安装TensorRT4.x,配置服务器的环境。
    其中,服务器192.168.4.247上的显卡为Tesl P4,环境为Ubuntu14.04,所以最高cuda版本为8.0,对应的最高tensorRT版本为4.x。
    细节:TensorRT安装 & 环境配置.

第二周 6.17-6.23

  1. 在服务器上跑通tensorRT4.x的两个demo,跑出了官方demo下的加速数据对比。
  2. 了解TensorRT的原理
  3. 发现了TensorRT4.x的问题,决定在本机的GTX1080+Ubuntu16.04上配置TensorRT5.1.5.0,使用最新版本的RT。

第三周 6.24-6.30

  1. TensorRT5.x入门,跑通sampleSSD等写好的demo,了解tensorRT5.x的具体流程。
  2. 尝试解决公司提出测试shufflenet前馈时间的需求**(因为需要自定义层shuffle层,至今未解决)**
  3. 研究caffe+tensorRT的自定义层方法,所以研究samplePlugin这个demo。这个demo其实是重载tensorRT写好的类,创建一个自定义类来实现“层”的自定义,具体为TensorRT5.1入门 samplePlugin.
  4. 开始研究官方给的测试时间的基准demo: trtexec。并尝试着,将samplePlugin这个示例中的自定义层方法嵌入到trtexec这个方法中。详情见留下的/boyun_yx/trtexec/工程。(这个是嵌入自定义层的版本,原版本请在/TensorRT5.1.5.0/sample/trtexec/中寻找)
  5. 还总结了一下trtexec相关的一些参数,详情见TensorRT5.1入门 trtexec.

第四周 7.1-7.7

  1. 研究自定义全连接层的方法:TensorRT5.1实践 自定义的FC层的方法.具体自定义的全连接层的写法,是根据samplePlugin这个官方的demo修改的,可以参考留下的/boyun_yx/test_net工程。
  2. 研究自定义Upsample层的方法:这个是自己找的资源实现的自定义Upsample层,具体请看TensorRT5.1实践 自定义的Upsample层的方法,代码体现在/boyun_yx/trtexec/工程中,详情见readme。

第五周 7.8-7.14

处于caffe-tensorRT到onnx-tensorRT的过渡期间,整理了一些官方demo,整体的浏览了一下tensorRT5.1.5.0发展者手册,积累了一些github上的工程资源,并且进行了一些研究。包括一下两个工程

  1. tensorrt-object-detection-master(未调通,有bug,但是其自定义层的方法可以看一下)
  2. TensorRT-Yolov3-master_old(调通,自定义了upsample和最后的yolo层)

详见/boyun_yx/下的两个工程。

第六周 7.15-7.21

开始研究pytorch和TensorRT之间的转换方法。

  1. 研究直接由pytorch转TensorRT的方法,通读开发者手册中关于pytorch的部分
  2. 研究onnx格式转TensorRT的过程
  3. 通读开发者手册中关于onnx的部分
    这一部分总结在TensorRT 5.1.5.0入门 Pytorch & ONNX中。
    博文中总结了,pytorch和onnx在TensorRT5.1.5.0开发者手册中的出现部分,以及demo个数及名称。
    本周主要看了一下onnx-tensorRT理论的东西,顺带总结之前caffe-TensorRT的部分。

第七周 7.22-7.28

这周主要对onnx和pytorch相关的demo进行了理解和尝试性的修改,并且熟悉了onnx。

  1. TensorRT5.1入门 introductory_parser_samples 介绍官方的一个demo,原理很简单,就是读onnx文件。
  2. TensorRT5.1入门 Object Detection With The ONNX TensorRT Backend In Python(python) ,这是官方开发者手册少数几个onnx相关的demo之一,包括了创造onnx文件和使用onnx文件转TensorRT引擎两个部分,很有参考价值。但是,创造onnx文件的部分不是有pytorch模型直接输出,而是利用了.cfg和.weights两个二进制文件。
  3. 了解onnx,了解onnx转TensorRT的pipelin,详情见原TensorRT5.1.5.0 实践Pytorch2Onnx,Onnx2TensorRT(python),但是这仅仅是个尝试,后来有更好的办法
  4. 空闲时间重新理解了一下,推断过程中的一些函数,这就包括(python)common.py中的allocate_buffers()和doinference()两个函数,分别进行TensorRT的内存分配和推断执行。具体见TensorRT5.1.5.0 实践 Doinference过程的探究(python).
  5. 尝试使用同事训练出的efficientnet网络进行加速,但是因为网络结构问题失败了,但是有些bug的解决可以借鉴Onnx EfficientNet网络转onnx格式出现的问题记录.

第八周 7.29-8.3

这周在上一周得到很简单的pytorch to onnx 和 onnx to tensorRT的方法之后,开始研究自定义层的用法。
因为发现onnx-TensorRT,在官方给的TensorRT工程中没有像caffe-TensorRT一样有自定义层的接口,所以就开始考虑IPluginV2,,研究了IPluginV2这种自定义层的方法(之前研究caffe-TensorRT都是研究IPlugin的自定义层方法)

  1. 研究IPluignV2,两篇文章
    (1)TensorRT5.1.5.0实践 基于IPluginV2类的自定义层的用法
    (2)TensorRT5.1.5.0入门 自定义层 IPlugin & IPluginV2的对比(C++)
  2. 发现了onnx-TensorRT的开源工程,onnx-tensorrt,研究了一下里面的PluginFactory.cpp/.h和Plugin.cpp/.h。

第九周 8.3-8.11

在上一周的基础上实现了efficientnet的准确度测试,并且找到了onnx-TensorRT的自定义方法。

  1. 测试了efficientnet,具体的数据和说明详见tensorRT5.1.5.0实践 EfficientNet+Pytorch的转换尝试即准确度测试,代码见“/boyun_yx/efficient_tensorRT/”
  2. 在上周的基础上研究了onnx-tensorRT的自定义op方法(pytorch更多的是自定义operation,而不是自定义layer)
    详情见第三章3.2 ONNX-tensorRT。

第三章 工作总结

3.1 Caffe-tensorRT

3.1.1 环境:

Ubuntu 16.04,TensorRT 5.1.5.0,python3.5,gcc 5.4

3.1.2 需求:

caffe-tensorrt的根本需求是实现caffe模型的tensorRT加速,即利用prototxt模型结构文件和.caffemodel的模型参数文件来创建engine,最后利用engine进行加速(engine是什么请详见第一章)。

3.1.3 进程:

目前,caffe-TensorRT,属于我的工作,主要是根据两种情况:有自定义层 和 没有自定义层。
这两种情况的pipeline,官方支持的的都已经比较完备。唯一遗留下的就是,关于IPluginV2的使用,还不清楚。

3.1.3.1 关于IPluginV2

现在江哥以及大多数Github上的写法(截止到7月底),都是基于IPlugin来写的自定义层,但是发现官方其实已经在TensorRT代码中开始维护IPluginV2,IPlugin和IPluginV2都是和自定义层有关的类,我的理解是两种自定义层的方法,只是V2还没有全面使用,我的调研详见第二章–第八周

3.1.3.2 其他

caffe转TensorRT的pipeline,无论是否存在自定义层(Pluign),在tensorRT的示例demo中都展示的很充分,所以就不画蛇添足了,在下面简单的介绍几个自己看过的caffe相关的demo(有一部分没看过的没有写),以供以后研发使用。原文见sample

  1. sampleMNIST :非常基础的一个demo,通过载入mnist.prototxt, 展示最基本的初始化流程和TensorRT执行流程。(cpp)
  2. sampleMNISTAPI:利用TensorRT提供的API(例如:IConvolution,IPooling),直接构建网络,然后通过载入二进制weights文件实现整个带参数模型的构建。(cpp)
  3. sampleGoogleNet: 不存在自定义层的Googlenet的demo(cpp)
  4. sampleINT8: 展示运用int8这种精度的时候,将要采取的校准和推断过程。(cpp)
  5. samplePlugin: 定义自定义层的最基本写法(cpp)
  6. sampleFasterRCNN: FasterRCNN的demo,有一个自定义层RPROI。
  7. sampleSSD: ssd的demo,有很多个自定义层,但都是TensorRT已经写好的。
  8. introductory_parser_samples: 基于Resnet50的Caffe,Onnx,TensorFlow(uff)的一个基本demo(python)
  9. fc_plugin_caffe_mnist: 利用python展示自定义全连接层,及其使用的过程(python)

3.1.4 关于工程化落地的思考

即江哥已经开始实施的结合caffe的protobuf,自动读取自定义层的参数,再结合tensorRT的解析器,完成带有自定义层的网络engine的构建及使用。

3.2 ONNX-tensorRT

3.2.1 环境:

Ubuntu 16.04,TensorRT 5.1.5.0,python3.5,gcc 5.4 ,torch 1.1.0,torchvision 0.2.2,更新到2019.8.9的onnx-tensorrt

3.2.2 需求:

onnx-tensorrt的根本需求是实现pytorch模型的tensorRT加速,而tensorRT现今不直接支持pytorch格式模型,而是需要”Pytorch模型–>onnx格式的protobuf二进制文件–>tensorRT的引擎“,最后利用tensorRT的”引擎“进行推断。

3.2.3 进程:

和caffe-tensorRT相同,了解思路仍然是:需要自定义层(在pytorch中是以operation为单位,即自定义op)和不需要自定义op。

  1. 无自定义op情况,跑通,输出demo
    有一个基于efficientnet-b0的demo,由自己所写,包括了从pytorch转到onnx再到tensorRT最后执行后处理输出结果的过程。demo工程中包含了efficientnet-b0网络结合公司的测试数据集(约22000张的车辆品牌)的时间测试和准确度测试,以及基于单张图片的检测demo。(工程保存在192.168.4.239的/home/train/env/project/efficient_tensorRT中,具备readme
  2. 有op情况下,分别理解了pytorch–>onnx和onnx–>tensorrt两个过程中的转化方法,pytorch–>onnx过程理解并实验(python),onnx–>tensorrt找到方法(c++)。
    详情见TensorRT5.1.5.0 实践 onnx-TensorRT的自定义op
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值