Yolov-1-TX2上用YOLOv3训练本身数据集的流程(VOC2007-TX2-GPU)html
Yolov--2--一文全面了解深度学习性能优化加速引擎---TensorRTpython
Yolov--3--TensorRT中yolov3性能优化加速(基于caffe)git
yolov-5-目标检测:YOLOv2算法原理详解github
yolov--8--Tensorflow实现YOLO v3算法
yolov--9--YOLO v3的剪枝优化api
yolov--10--目标检测模型的参数评估指标详解、概念解析数组
yolov--11--YOLO v3的原版训练记录、mAP、AP、recall、precision、time等评价指标计算缓存
yolov--12--YOLOv3的原理深度剖析和关键点讲解性能优化
1、TX2中TensorRT的安装微信
https://blog.csdn.net/haoqimao_hard/article/details/81001844
https://github.com/dusty-nv/jetson-inference
平台:英伟达NVIDIA TX2开发板 环境:Ubuntu16.04, python2.7,cuda8.0,cudnn6.0.2. OpenCV 2.4.13.1
caffe安装教程:
https://www.jianshu.com/p/e78c5c321248?tdsourcetag=s_pcqq_aiomsg
https://github.com/Cw-zero/TensorRT_yolo3
Use TensorRT accelerate yolo3
1. How to run this project
a. Download yolo3.weight from this, and change the name to yolov3-608.weights.
b. python yolov3_to_onnx.py, you will have a file named yolov3-608.onnx
c. python onnx_to_tensorrt.py,you can get the result of detections.
2. Performance compare
a.You can download and run this project, which our project is changed from it. It detection speed is about 100ms per image.
b.Our project speed is about 62ms per image
3.Others
If you are more familiar with Chinese, you can refer to this blog(https://www.cnblogs.com/justcoder/), which has more details.
1、TensorRT支持的模型:
TensorRT 直接支持的model有ONNX、Caffe、TensorFlow,其余常见model建议先转化成ONNX。总结以下:
1 ONNX(.onnx)
2 Keras(.h5) --> ONNX(.onnx) (https://github.com/onnx/keras-onnx)
3 Caffe(.caffemodel)
4 Darknet(.cfg) --> ONNX(.onnx) (Our tutorial : yolo-v3)
5 TensorFlow(.uff)
2、TensorRT支持的常见运算:
Activation(激活函数)、Convolution(卷积运算)、Deconvolution(反卷积运算)、FullConnected(全链接)、Padding(填充)、Pooling(池化)、RNN(递归神经网络)、SoftMax()等。
更详细的API可参考:
https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvinfer1_1_1_i_network_definition.html
3、TensorRT加速yolo3:
yolo3由CNN网络和detection模块组成,TensorRT只对CNN网络进行Inference加速。即:
TensorRT input is:608*608 image
TensorRT output is:array
(array[0].shape = 255 *19*1九、
array[1].shape = 255*38*3八、
array[2].shape = 255 *76*76)
具体实现过程:
1 Darknet(.cfg) --> ONNX(.onnx)
2 ONNX(.onnx) --> TensorRT model(.trt)
3 TensorRT加速CNN部分,执行detection模块获得最终结果。
pytorch-yolo3:https://github.com/ayooshkathuria/pytorch-yolo-v3
本项目地址:https://github.com/Cw-zero/TensorRT_yolo3
(注:本项目是对pytorch-yolo3进行改写加速的)
4、性能比较:
More about TensorRT 可参考官方指导:
https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#python_example_unsupported
Yolov--2--一文全面了解深度学习性能优化加速引擎---TensorRT
目标:让你们能更好地利用GPU,使其在作深度学习训练的时候达到更好的效果。
1、TensorRT理论解释
TensorRT是什么?作了哪些优化?
TensorRT项目立项的时候名字叫作GPU Inference Engine(简称GIE)
Tensor表示数据流动以张量的形式。所谓张量你们能够理解为更加复杂的高维数组,通常一维数组叫作Vector(即向量),二维数组叫作Matrix,再高纬度的就叫Tensor(三位及以上的数组运算),Matrix实际上是二维的Tensor。
在TensoRT中,全部的数据都被组成最高四维的数组,若是对应到CNN中其实就是{N, C, H, W},
N表示batch size,即多少张图片或者多少个推断(Inference)的实例;C表示channel数目;H和W表示图像或feature maps的高度和宽度。TR表示的是Runtime。
为何在有了框架的基础上还须要TensorRT来优化加速?
若是你们对深度学习有些了解的话可能会知道,它分为训练和部署两部分,
训练部分首先也是最重要的是构建网络结构,准备数据集,使用各类框架进行训练,训练要包含validation和test的过程,最后对于训练好的模型要在实际业务中进行使用。训练的操做通常在线下,实时数据来以后在线训练的状况比较少,大多数状况下数据是离线的,已经收集好的,数据更新不频繁的一天或一周一收集,数据更新频繁的可能几十分钟,在线下有大规模的集群开始对数据或模型进行更新,这样的训练须要消耗大量的GPU,相对而言通常会给一个比较大的batchsize,由于它的实时性要求相对较低,通常训练模型给的是128,甚至有些极端的1024,大的batch的好处是能够充分的利用GPU设备。
可是到推断(Inference)的时候就是不一样的概念了,推断(Inference)的时候只须要作一个前向计算,将输入经过神经网络得出预测的结果。而推断(Inference)的实际部署有多种可能,可能部署在Data Center(云端数据中心),好比说你们常见的手机上的语音输入,目前都仍是云端的,也就是说你的声音是传到云端的,云端处理好以后把数据再返回来;还可能部署在嵌入端,好比说嵌入式的摄像头、无人机、机器人或车载的自动驾驶,固然车载的自动驾驶多是嵌入式的设备,也多是一台完整的主机,像这种嵌入式或自动驾驶,它的特色是对实时性要求很高。
一样的,Data Center也是对实时性要求很高,作一个语音识别,不能说说完了等很长时间尚未返回,因此在线的部署最大的特色是对实时性要求很高,它对latency很是敏感,要咱们能很是快的给出推断(Inference)的结果。作一个不一样恰当的比方,训练(Training)这个阶段若是模型比较慢,实际上是一个砸钱能够解决的问题,咱们能够用更大的集群、更多的机器,作更大的数据并行甚至是模型并行来训练它,重要的是成本的投入。
而部署端不仅是成本的问题,若是方法不得当,即便使用目前最早进的GPU,也没法知足推断(Inference)的实时性要求。
由于模型若是作得很差,没有作优化,可能须要二三百毫秒才能作完一次推断(Inference),再加上来回的网络传输,用户可能一秒后才能获得结果。在语音识别的场景之下,用户能够等待;可是在驾驶的场景之下,可能会有性命之庾。
在部署阶段,latency是很是重要的点,而TensorRT是专门针对部署端进行优化的,目前TensorRT支持大部分主流的深度学习应用,固然最擅长的是CNN(卷积神经网络)领域,可是的TensorRT 3.0也是有RNN的API,也就是说咱们能够在里面作RNN的推断(Inference)。
最典型的应用是图片的分类,这也是最经典的,实际上也是深度学习目前解决的比较好的一些问题。其余的例如,图片的语义分割、目标检测等都是以图片分类网络为基础进行改进的。目标检测是比较典型的例子(以下图),训练(Training)是对已经打好框的图片进行前向计算,得出的框和实际的框(ground truth)进行对比,而后再作后向更新,更新模型。真正作推断(Inference)的时候,好比一个摄像头,基本上要保证是实时的,也就是提及码要保证每秒25-30帧的速度,鉴于实际应用多是二三十路摄像头同时进来的数据,这时候必须保证一块卡作到实时处理,仍是比较有挑战性的工做。
总结一下推断(Inference)和训练(Training)的不一样:
1. 推断(Inference)的网络权值已经固定下来,无后向传播过程,所以能够
1)模型固定,能够对计算图进行优化
2) 输入输出大小固定,能够作memory优化(注意:有一个概念是fine-tuning,即训练好的模型继续调优,只是在已有的模型作小的改动,本质上仍然是训练(Training)的过程,TensorRT没有fine-tuning
2. 推断(Inference)的batch size要小不少,仍然是latency的问题,由于若是batch size很大,吞吐能够达到很大,好比每秒能够处理1024个batch,500毫秒处理完,吞吐能够达到2048,能够很好地利用GPU;可是推断(Inference)不能作500毫秒处理,能够是8或者16,吞吐下降,没有办法很好地利用GPU.
3. 推断(Inference)可使用低精度的技术,训练的时候由于要保证先后向传播,每次梯度的更新是很微小的,这个时候须要相对较高的精度,通常来讲须要float型,如FP32,32位的浮点型来处理数据,可是在推断(Inference)的时候,对精度的要求没有那么高,不少研究代表能够用低精度,如半长(16)的float型,即FP16,也能够用8位的整型(INT8)来作推断(Inference),研究结果代表没有特别大的精度损失,尤为对CNN。更有甚者,对Binary(二进制)的使用也处在研究过程当中,即权值只有0和1。目前FP16和INT8的研究使用相对来讲比较成熟。低精度计算的好处是一方面能够减小计算量,原来计算32位的单元处理FP16的时候,理论上能够达到两倍的速度,处理INT8的时候理论上能够达到四倍的速度。固然会引入一些其余额外的操做,后面的讲解中会详细介绍FP18和INT8;另外一方面是模型须要的空间减小,无论是权值的存储仍是中间值的存储,应用更低的精度,模型大小会相应减少。
下图展现的是TensorRT的效果,固然这是一个比较极端的例子,由于该例中使用的是最早进的GPU卡V100,V100添加了专门针对深度学习优化的TensorCore,TensorCore能够完成4×4矩阵的半精度乘法,也就是能够完成一个4×4的FP16矩阵和另一个4×4的FP16矩阵相乘,固然能够再加一个矩阵(FP16 或FP32),获得一个FP32或者FP16的矩阵的过程。TensorCore在V100上理论峰值能够达到120 Tflops.(开个玩笑,电影终结者中整个天网的计算能力至关于两块V100)。回到图中,先看一下若是只是用CPU来作推断(Inference),首先它的吞吐只能达到140,也就是说每秒只能处理140张图片,同时整个处理过程须要有14ms的延迟,也就是说用户提交请求后,推断(Inference)阶段最快须要14ms才能返回结果;若是使用V100,在TensorFlow中去作推断(Inference),大概是6.67ms的延时,可是吞吐只能达到305;若是使用V100加TensorRT,在保证延迟不变的状况下,吞吐能够提升15倍,高达5700张图片每秒,这个差异是很大的。十几倍的吞吐的提高其实是在保证延迟的状况下成本的缩减 。
回到TensorRT的主题,以前你们广泛存在的一个疑问是在训练过程当中可使用不一样的框架,为何推断(Inference)不能用各类框架,好比TensorFlow等。固然是能够用的,可是问题是灵活性和性能是一种trade-off的关系,这是在作深度学习或训练过程当中常常会遇到的一个问题。好比像TensorFlow的设计初衷是为各类各样的操做来作准备的,在早期的框架,例如Caffe中不少先后处理并不在框架里面完成,而是经过额外的程序或脚本处理,可是TensorFlow支持将全部的操做放入框架之中来完成,它提供了操做(Operation)级别的支持,使得灵活性大大提升,可是灵活性多是以牺牲效率为代价的。TensorFlow在实现神经网络的过程当中能够选择各类各样的高级库,如用nn来搭建,tf.nn中的convolution中能够加一个卷积,能够用slim来实现卷积,不一样的卷积实现效果不一样,可是其对计算图和GPU都没有作优化,甚至在中间卷积算法的选择上也没有作优化,而TensorRT在这方面作了不少工做。
在讲TensorRT作了哪些优化以前, 想介绍一下TensorRT的流程, 首先输入是一个预先训练好的FP32的模型和网络,将模型经过parser等方式输入到TensorRT中,TensorRT能够生成一个Serialization,也就是说将输入串流到内存或文件中,造成一个优化好的engine,执行的时候能够调取它来执行推断(Inference)。
如上图所示TensorRT整个过程能够分三个步骤,即模型的解析(Parser),Engine优化和执行(Execution)。暂时抛开TensorRT,若是让你们从头写一个深度学习模型的前向过程,具体过程应该是
1) 首先实现NN的layer,如卷积的实现,pooling的实现。
2) 管理memory,数据在各层之间如何流动。
3) 推断(Inference)的engine来调用各层的实现。
以上三个步骤在TendorRT都已经实现好了,用户须要作的是如何将网络输入到TensorRT中。目前TensorRT支持两种输入方式:
1. 一种是Parser的方式,即模型解析器,输入一个caffe的模型,能够解析出其中的网络层及网络层之间的链接关系,而后将其输入到TensorRT中,可是TensorRT是如何知道这些链接关系呢?答案是API。
2. API接口能够添加一个convolution或pooling。而Parser是解析模型文件,好比TensorFlow转换成的uff,或者是caffe的模型,再用API添加到TensorRT中,构建好网络。构建好后就能够作优化。
a) 考虑到一个状况,若是有一个网络层不支持,这个有可能,TensorRT只支持主流的操做,好比说一个神经网络专家开发了一个新的网络层,新型卷积和之前的卷积都不同,TensorRT是不知道是作什么的。好比说最多见的检测网络,有一些网络层也是不支持的,这个时候涉及到customer layer的功能,即用户自定义层,构建用户自定义层须要告诉TensorRT该层的链接关系和实现方式,这样TensorRT才能去作。
b) 目前API支持两种接口实现方式,一种是C++,另外一种是Python,Python接口可能在一些快速实现上比较方便一些。
c) Parser目前有三个,一个是caffe Parser,这个是最古老的也是支持最完善的;另外一个是uff,这个是NV定义的网络模型的一种文件结构,如今TensorFlow能够直接转成uff;另外下一个版本3.5或4.0会支持的onnx,是Facebook主导的开源的可交换的各个框架均可以输出的,有点相似于文档编辑中的word格式或AutoCAD中CAD的格式,虽然是由一个公司提出,可是有但愿成为一个标准,各个APP去支持这个标准。像pytorch和caffe 2都是支持这个格式的,这个目前只在NGC (NVDIA GPU Cloud)上支持,可是下一个版本发行都会支持。若是某个公司新推出一个特别火的框架不支持怎么办,仍然能够采用API的方式,一层一层的添加进去,告诉TensorRT链接关系,这也是OK的。
模型解析后,engine会进行优化,具体的优化稍后会介绍。获得优化好的engine能够序列化到内存(buffer)或文件(file),读的时候须要反序列化,将其变成engine以供使用。而后在执行的时候建立context,主要是分配预先的资源,engine加context就能够作推断(Inference)。
以上是TensorRT的整个过程,你们在疑惑TensorRT是否支持TensorFlow,首先你们写的网络计算层可能都是支持的,可是有些网络层可能不支持,在不支持的状况下能够用customer layer的方式添加进去,可是有时候为了使用方便,可能没办法一层一层的去添加,须要用模型文件形式,这个取决于Parser是否彻底支持。相对而言,你们在框架有过比较后会发现,caffe这个框架的特色是很是不灵活,若是要添加一个新的网络层,须要修改源代码;TensorFlow的优势倒是很是的灵活。
刚才讲到TensorRT所作的优化,总结下来主要有这么几点:
第一,也是最重要的,它把一些网络层进行了合并。你们若是了解GPU的话会知道,在GPU上跑的函数叫Kernel,TensorRT是存在Kernel的调用的。在绝大部分框架中,好比一个卷积层、一个偏置层和一个reload层,这三层是须要调用三次cuDNN对应的API,但实际上这三层的实现彻底是能够合并到一块儿的,TensorRT会对一些能够合并网络进行合并;再好比说,目前的网络一方面愈来愈深,另外一方面愈来愈宽,可能并行作若干个相同大小的卷积,这些卷积计算其实也是能够合并到一块儿来作的。
第二,好比在concat这一层,好比说这边计算出来一个1×3×24×24,另外一边计算出来1×5×24×24,concat到一块儿,变成一个1×8×24×24的矩阵,这个叫concat这层这实际上是彻底没有必要的,由于TensorRT彻底能够实现直接接到须要的地方,不用专门作concat的操做,因此这一层也能够取消掉。
第三,Kernel能够根据不一样的batch size 大小和问题的复杂程度,去选择最合适的算法,TensorRT预先写了不少GPU实现,有一个自动选择的过程。
第四,不一样的batch size会作tuning。
第五,不一样的硬件如P4卡仍是V100卡甚至是嵌入式设备的卡,TensorRT都会作优化,获得优化后的engine。
下图是一个原始的GoogleNet的一部分,首先input后会有多个卷积,卷积完后有Bias和ReLU,结束后将结果concat(链接拼接)到一块儿,获得下一个input。
以上的整个过程能够作些什么优化呢?首先是convolution, Bias和ReLU这三个操做能够合并成CBR,合并后的结果以下所示,其中包含四个1×1的CBR,一个3×3的CBR和一个5×5的CBR。
接下来能够继续合并三个相连的1×1的CBR为一个大的1×1的CBR(以下图),这个合并就能够更好地利用GPU。
继而concat层能够消除掉,直接链接到下一层的next input(以下图)。
另外还能够作并发(Concurrency),以下图左半部分(max pool和1×1 CBR)与右半部分(大的1×1 CBR,3×3 CBR和5×5 CBR)彼此之间是相互独立的两条路径,本质上是不相关的,能够在GPU上经过并发来作,来达到的优化的目标。
2、TensorRT高级特征介绍
前面介绍了TesorRT的基础,更多信息能够查询官网,或者反馈给我。接下来和你们分享一些TensorRT比较高级的特征,这块主要针对有必定经验或者作过一些线上部署的人。
1. 插件支持
首先TensorRT是支持插件(Plugin)的,或者前面提到的Customer layer的形式,也就是说咱们在某些层TensorRT不支持的状况下,最主要是作一些检测的操做的时候,不少层是该网络专门定义的,TensorRT没有支持,须要经过Plugin的形式本身去实现。实现过程包括以下两个步骤:
1) 首先须要重载一个IPlugin的基类,生成本身的Plugin的实现,告诉GPU或TensorRT须要作什么操做,要构建的Plugin是什么样子,其实就是相似于开发一个应用软件的插件,须要在上面实现什么功能。
2) 其次要将插件添加到合适的位置,在这里是要添加到网络里去。
注意,只有TensorRT 2.1和更高的版本支持插件的功能(该视频讲的时候的版本是3.0.2,支持插件功能)。
2. 低精度支持
低精度指的是以前所说过的FP16和INT8,其中FP16主要是Pascal P100和V100(tensor core)这两张卡支持;而INT8主要针对的是 P4和P40这两张卡,P4是专门针对线上作推断(Inference)的小卡,和IPhone手机差很少大,75瓦的一张卡,功耗和性能很是好。
3. Python接口和更多的框架支持
TensorRT目前支持Python和C++的API,刚才也介绍了如何添加,Model importer(即Parser)主要支持Caffe和Uff,其余的框架能够经过API来添加,若是在Python中调用pyTouch的API,再经过TensorRT的API写入TensorRT中,这就完成了一个网络的定义。
TensorRT去作推断(Inference)的时候是再也不须要框架的,用Caffe作推断(Inference)须要Caffe这个框架,TensorRT把模型导进去后是不须要这个框架的,Caffe和TensorFlow能够经过Parser来导入,一开始就不须要安装这个框架,给一个Caffe或TensorFlow模型,彻底能够在TensorRT高效的跑起来。
3、用户自定义层
使用插件建立用户自定义层主要分为两个步骤:
第一步是建立使用IPlugin接口建立用户自定义层,IPlugin是TensorRT中预约义的C++抽象类,用户须要定义具体实现了什么。
第二步是将建立的用户自定义层添加到网络中,若是是Caffe的模型,不支持这一层,将名字改为IPlugin是能够识别的,固然还须要一些额外的操做,说明这一层的操做是对应哪一个Plugin的实现;而对于Uff是不支持Plugin的Parser,也就是说TensorFlow的模型中有一个Plugin的话,是不能从模型中识别出来的,这时候须要用到addPlugin()的方法去定义网络中Plugin的相关信息。
IPlugin接口中须要被重载的函数有如下几类:
1) 肯定输出:一个是经过int getNbOutput()获得output输出的数目,即用户所定义的一层有几个输出。另外一个是经过Dims getOutputDimensions (int index, const Dims* inputs, int nbInputDims) 获得整个输出的维度信息,你们可能不必定遇到有多个输出,通常来说只有一个输出,可是你们在作检测网络的时候可能会遇到多个输出,一个输出是实际的检测目标是什么,另外一个输出是目标的数目,可能的过个输出须要设定Dimension的大小。
2) 层配置:经过void configure() 实现构建推断(Inference) engine时模型中相应的参数大小等配置,configure()只是在构建的时候调用,这个阶段肯定的东西是在运行时做为插件参数来存储、序列化/反序列化的。
3) 资源管理:经过void Initialize()来进行资源的初始化,void terminate()来销毁资源,甚至中间可能会有一些临时变量,也可使用这两个函数进行初始化或销毁。须要注意的是,void Initialize()和void terminate()是在整个运行时都被调用的,并非作完一次推断(Inference)就去调用terminate。至关于在线的一个服务,服务起的时候会调用void Initialize(),而服务止的时候调用void terminate(),可是服务会进进出出不少sample去作推断(Inference)。
4) 执行(Execution):void enqueue()来定义用户层的操做
5) 序列化和反序列化:这个过程是将层的参数写入到二进制文件中,须要定义一些序列化的方法。经过size_t getSerializationSize()得到序列大小,经过void serialize()将层的参数序列化到缓存中,经过PluginSample()从缓存中将层参数反序列化。须要注意的是,TensorRT没有单独的反序列化的API,由于不须要,在实习构造函数的时候就完成了反序列化的过程
6) 从Caffe Parser添加Plugin:首先经过Parsernvinfer1::IPlugin* createPlugin()实现nvcaffeparser1::IPlugin 接口,而后传递工厂实例到ICaffeParser::parse(),Caffe的Parser才能识别
7) 运行时建立插件:经过IPlugin* createPlugin()实现nvinfer1::IPlugin接口,传递工厂实例到IInferRuntime::deserializeCudaEngine()
4、用户自定义层-YOLOv2实例
咱们用一个例子YOLOv2来给你们讲一下完整的流程:
准备:首先要准备 Darknet framework(https://github.com/pjreddie/darknet.git),它是一个很是小众的cfg的形式,而后须要准备须要训练的数据集(VOC 2007 & VOC 2012),测试的指令以下:
./darknet detector test cfg/voc.data cfg/yolo-voc-relu.cfg \
backup/yolo-voc-relu_final.weights \ data/dog.jpg
模型转换:以下图所示,根据darknet的配置文件生成caffe的prototxt文件,注意使用ReLu而不是leaky-ReLu;另外darknet中存储顺序不一样,首先存储偏移;darknet的配置文件中padding的意义不一样,pad = 1表示有padding,darknet中padding的大小是Kernel的大小除以2。
如下是darknet cuDNN和TensorRT FP32的性能对比,FP32是4.8ms,而Darknet是11.3ms。
5、低精度的推断(Inference)
TensorRT经过使用Pascal GPU低精度的技术,实现高性能。如下是FP16和INT8两种类型的性能对比。
1. FP16 推断(Inference)
TensorRT支持高度自动化的FP16推断(Inference),解析模型要将模型的的数据类型设置为DataType::kHALF,同时经过builder- >setHalf2Mode(true)指令将推断(Inference)设置为FP16的模式。须要注意两点,一点是FP16推断(Inference)不须要额外的输入,只须要输入预先训练好的FP32模型,另外一点是目前只有Tesla P100/V100支持原生的FP16。
下图展现了将模型从FP32转换成FP16,并以FP16的形式存储的过程:
2.  INT8 推断(Inference)
对于INT8 推断(Inference),须要生成一个校准表来量化模型。接下来主要关注INT8推断(Inference)的几个方面,即:如何生成校准表,如何使用校准表,和INT8推断(Inference)实例。
1) 如何生成校准表?
校准表的生成须要输入有表明性的数据集, 对于分类任务TensorRT建议输入五百张到一千张有表明性的图片,最好每一个类都要包括。生成校准表分为两步:第一步是将输入的数据集转换成batch文件;第二步是将转换好的batch文件喂到TensorRT中来生成基于数据集的校准表,能够去统计每一层的状况。
2) 如何使用校准表?
校准这个过程若是要跑一千次是很昂贵的,因此TensorRT支持将其存入文档,后期使用能够从文档加载,其中存储和加载的功能经过两个方法来支持,即writeCalibrationCache和readCalibrationCache。最简单的实现是从write()和read()返回值,这样就必须每次执行都作一次校准。若是想要存储校准时间,须要实现用户自定义的write/read方法,具体的实现能够参考TensorRT中的simpleINT8实例。
3) INT8推断(Inference)实例
经过下图的实例能够发现,在YOLOv2实例中,使用TensorRT INT8作推断(Inference)的性能能够达到2.34ms。
下图展现了用ResNet50中FP32和INT8的性能对比,能够发现,对于P4卡,在bachsize是64的时候,INT8推断(Inference)大概能够达到1720fps,相对于FP32有3.6倍的加速,这个是至关可观的。
至于你们关心的精度问题对比(以下图),INT8经过用5张图,10张图,50张图去修正,精度相差基本上都是在百分之零点零几,这个效果是很是好的。
最后总结一下TensorRT的优势:
1. TensorRT是一个高性能的深度学习推断(Inference)的优化器和运行的引擎;
2. TensorRT支持Plugin,对于不支持的层,用户能够经过Plugin来支持自定义建立;
3. TensorRT使用低精度的技术得到相对于FP32二到三倍的加速,用户只须要经过相应的代码来实现。
————————————————
版权声明:本文为CSDN博主「hy-lscj」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。
原文连接:https://blog.csdn.net/qq_33869371/article/details/87929419
本文分享自微信公众号 - IT民工技术之路(python_er)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。