目录
第一章 产品介绍
就是GIE(GPU Inference Engine),利用GPU进行推理的引擎,做一系列优化(优化Model结构&优化cuda内核计算)使使用TensorRT后比常规的model前馈更快。其中,tensor表示数据流动以张量的形式,RT代表runtime。
在研发者手册上很清楚的介绍了tensorRT,TensorRT Developer Guide.
更多的了解,详见高性能深度学习支持引擎实战——TensorRT
有个相关的qq讨论群,关于tensorRT,群号:483063470
第二章 工作时间线
第一周 6.11-6.16
- 在服务器上安装TensorRT4.x,配置服务器的环境。
其中,服务器192.168.4.247上的显卡为Tesl P4,环境为Ubuntu14.04,所以最高cuda版本为8.0,对应的最高tensorRT版本为4.x。
细节:TensorRT安装 & 环境配置.
第二周 6.17-6.23
- 在服务器上跑通tensorRT4.x的两个demo,跑出了官方demo下的加速数据对比。
- 了解TensorRT的原理
- 发现了TensorRT4.x的问题,决定在本机的GTX1080+Ubuntu16.04上配置TensorRT5.1.5.0,使用最新版本的RT。
第三周 6.24-6.30
- TensorRT5.x入门,跑通sampleSSD等写好的demo,了解tensorRT5.x的具体流程。
- 尝试解决公司提出测试shufflenet前馈时间的需求**(因为需要自定义层shuffle层,至今未解决)**
- 研究caffe+tensorRT的自定义层方法,所以研究samplePlugin这个demo。这个demo其实是重载tensorRT写好的类,创建一个自定义类来实现“层”的自定义,具体为TensorRT5.1入门 samplePlugin.
- 开始研究官方给的测试时间的基准demo: trtexec。并尝试着,将samplePlugin这个示例中的自定义层方法嵌入到trtexec这个方法中。详情见留下的
/boyun_yx/trtexec/
工程。(这个是嵌入自定义层的版本,原版本请在/TensorRT5.1.5.0/sample/trtexec/中寻找) - 还总结了一下trtexec相关的一些参数,详情见TensorRT5.1入门 trtexec.
第四周 7.1-7.7
- 研究自定义全连接层的方法:TensorRT5.1实践 自定义的FC层的方法.具体自定义的全连接层的写法,是根据samplePlugin这个官方的demo修改的,可以参考留下的
/boyun_yx/test_net
工程。 - 研究自定义Upsample层的方法:这个是自己找的资源实现的自定义Upsample层,具体请看TensorRT5.1实践 自定义的Upsample层的方法,代码体现在
/boyun_yx/trtexec/
工程中,详情见readme。
第五周 7.8-7.14
处于caffe-tensorRT到onnx-tensorRT的过渡期间,整理了一些官方demo,整体的浏览了一下tensorRT5.1.5.0发展者手册,积累了一些github上的工程资源,并且进行了一些研究。包括一下两个工程
- tensorrt-object-detection-master(未调通,有bug,但是其自定义层的方法可以看一下)
- TensorRT-Yolov3-master_old(调通,自定义了upsample和最后的yolo层)
详见/boyun_yx/
下的两个工程。
第六周 7.15-7.21
开始研究pytorch和TensorRT之间的转换方法。
- 研究直接由pytorch转TensorRT的方法,通读开发者手册中关于pytorch的部分
- 研究onnx格式转TensorRT的过程
- 通读开发者手册中关于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。
- TensorRT5.1入门 introductory_parser_samples 介绍官方的一个demo,原理很简单,就是读onnx文件。
- TensorRT5.1入门 Object Detection With The ONNX TensorRT Backend In Python(python) ,这是官方开发者手册少数几个onnx相关的demo之一,包括了创造onnx文件和使用onnx文件转TensorRT引擎两个部分,很有参考价值。但是,创造onnx文件的部分不是有pytorch模型直接输出,而是利用了.cfg和.weights两个二进制文件。
- 了解onnx,了解onnx转TensorRT的pipelin,详情见原TensorRT5.1.5.0 实践Pytorch2Onnx,Onnx2TensorRT(python),但是这仅仅是个尝试,后来有更好的办法
- 空闲时间重新理解了一下,推断过程中的一些函数,这就包括(python)common.py中的allocate_buffers()和doinference()两个函数,分别进行TensorRT的内存分配和推断执行。具体见TensorRT5.1.5.0 实践 Doinference过程的探究(python).
- 尝试使用同事训练出的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的自定义层方法)
- 研究IPluignV2,两篇文章
(1)TensorRT5.1.5.0实践 基于IPluginV2类的自定义层的用法
(2)TensorRT5.1.5.0入门 自定义层 IPlugin & IPluginV2的对比(C++) - 发现了onnx-TensorRT的开源工程,onnx-tensorrt,研究了一下里面的PluginFactory.cpp/.h和Plugin.cpp/.h。
第九周 8.3-8.11
在上一周的基础上实现了efficientnet的准确度测试,并且找到了onnx-TensorRT的自定义方法。
- 测试了efficientnet,具体的数据和说明详见tensorRT5.1.5.0实践 EfficientNet+Pytorch的转换尝试即准确度测试,代码见
“/boyun_yx/efficient_tensorRT/”
- 在上周的基础上研究了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
- sampleMNIST :非常基础的一个demo,通过载入mnist.prototxt, 展示最基本的初始化流程和TensorRT执行流程。(cpp)
- sampleMNISTAPI:利用TensorRT提供的API(例如:IConvolution,IPooling),直接构建网络,然后通过载入二进制weights文件实现整个带参数模型的构建。(cpp)
- sampleGoogleNet: 不存在自定义层的Googlenet的demo(cpp)
- sampleINT8: 展示运用int8这种精度的时候,将要采取的校准和推断过程。(cpp)
- samplePlugin: 定义自定义层的最基本写法(cpp)
- sampleFasterRCNN: FasterRCNN的demo,有一个自定义层RPROI。
- sampleSSD: ssd的demo,有很多个自定义层,但都是TensorRT已经写好的。
- introductory_parser_samples: 基于Resnet50的Caffe,Onnx,TensorFlow(uff)的一个基本demo(python)
- 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。
- 无自定义op情况,跑通,输出demo
有一个基于efficientnet-b0的demo,由自己所写,包括了从pytorch转到onnx再到tensorRT最后执行后处理输出结果的过程。demo工程中包含了efficientnet-b0网络结合公司的测试数据集(约22000张的车辆品牌)的时间测试和准确度测试,以及基于单张图片的检测demo。(工程保存在192.168.4.239的/home/train/env/project/efficient_tensorRT
中,具备readme) - 有op情况下,分别理解了pytorch–>onnx和onnx–>tensorrt两个过程中的转化方法,pytorch–>onnx过程理解并实验(python),onnx–>tensorrt找到方法(c++)。
详情见TensorRT5.1.5.0 实践 onnx-TensorRT的自定义op