【转载】TensorRT 系列之入门篇

https://mp.weixin.qq.com/s/E5qbMsuc7UBnNmYBzq__5Q

TensorRT 系列之入门篇

原创 2018-01-28 子棐 子棐之GPGPU

这个世界没有免费的午餐,如果有---那就是TensorRT……

——子棐


Why TensorRT

训练对于深度学习来说是为了获得一个性能优异的模型,其主要的关注点在于模型的准确度等指标。推理则不一样,其没有了训练中的反向迭代过程,是针对新的数据进行预测,而我们日常生活中使用的AI服务都是推理服务。相较于训练,推理的关注点不一样,从而也给现在有技术带来了新的挑战:


需求现有框架的局限性影响

高吞吐率无法处理大量和高速的数据增加了单次推理的开销

低响应时间应用无法提供实时的结果损害了用户体验(语音识别、个性化推荐和实时目标检测)

高效的功耗以及显存消耗控制非最优效能增加了推理的开销甚至无法进行推理部署

部署级别的解决方案非专用于部署使用框架复杂度和配置增加了部署难度以及生产率


根据上图可知,推理更关注的是高吞吐率、低响应时间、低资源消耗以及简便的部署流程,而TensorRT就是用来解决推理所带来的挑战以及影响的部署级的解决方案。


TensorRT部署流程

TensorRT的部署分为两个部分:

[if !supportLists]1.    [endif]优化训练好的模型并生成计算流图

[if !supportLists]2.    [endif]使用TensorRT Runtime部署计算流图

关于这个流程很自然我们会想到以下几个问题:

[if !supportLists]1.    [endif]TensorRT支持什么框架训练出来的网络模型呢?

[if !supportLists]2.    [endif]TensorRT支持什么网络结构呢?

[if !supportLists]3.    [endif]TensorRT优化器做了哪些优化呢?

[if !supportLists]4.    [endif]TensorRT优化好的计算流图可以运行在什么设备上呢?

个中因果,诸位看官,稍安勿躁,待本文娓娓道来。


TensorRT之大胃王

输入篇之网络框架:TensorRT3支持所有常见的深度学习框架包括Caffe、Chainer、CNTK、MXnet、PaddlePaddle、Pytorch、TensorFlow以及Theano。

输入篇之网络层:TensorRT3支持的网络层包括

Convolution

LSTM and GRU

Activation: ReLU, tanh,  sigmoid

Pooling: max and average

Scaling

ElementWise

LRN

Fully-connected

SoftMax

Deconvolution

Concatenation

Flatten

Padding

Plugin

RNN: RNN, GRU, LSTM

Scale

Shuffle

Softmax

Squeeze

Unary

输入篇之接口方式:TensorRT3支持模型导入方式包括C++ API、Python API、NvCaffeParser和NvUffParser

输出篇之支持系统平台:TensorRT3支持的平台包括Linux x86、Linux aarch64、Android aarch64和QNX aarch64。

输出篇之支持硬件平台:TensorRT3可以运行在每一个GPU平台,从数据中心的Tesla P4/V100到自动驾驶和嵌入式平台的DrivePX及TX1/TX2。


TensorRT 模型导入流程

如上图所示,模型的导入方法可以根据框架种类分成三种:Caffe、TensorFlow和其他。

Caffe

[if !supportLists]1.    [endif]使用C++/Python API导入模型:通过代码定义网络结构,并载入模型weights的方式导入;

[if !supportLists]2.    [endif]使用NvCaffeParser导入模型:导入时输入网络结构prototxt文件及caffemodel文件即可。

TensorFlow

[if !supportLists]1.    [endif]训练完成后,使用uff python接口将模型转成uff格式,之后使用NvUffParaser导入;

[if !supportLists]2.    [endif]对于TensorFlow或者keras(TensorFlow后端)的,利用Freeze graph来生成.pb(protobuf)文件,之后使用convert-to-uff工具将.pb文件转化成uff格式,然后利用NvUffParaser导入。

其他框架

使用C++/Python API导入模型:通过代码定义网络结构,载入模型weights的方式导入。以Pytorch为例,在完成训练后,通过stat_dict()函数获取模型的weights,从而在定义网络结构时将weights载入。

[if !supportLineBreakNewLine]

[endif]

[if !supportLineBreakNewLine]

[endif]

注:weights文件是保存的C++ Map对象,该对象定义为:

std::map

其中Weights类型是在NvInfer.h中定义,为存储weights的array。


TensorRT 优化细节

网络模型在导入至TensorRT后会进行一系列的优化,主要优化内容如下图所示。

Layer & Tensor Fusion

TensorRT在获得网络计算流图后会针对计算流图进行优化,这部分优化不会改变图中最底层计算内容,而是会去重构计算图来获得更快更高效的执行方式,即计算不变优化计算方法。

以下图为例:

深度学习框架在做推理时,会对每一层调用多个/次功能函数。而由于这样的操作都是在GPU上运行的,从而会带来多次的CUDA Kernel

launch过程。相较于Kernel launch以及每层tensor data读取来说,kernel的计算是更快更轻量的,从而使得这个程序受限于显存带宽并损害了GPU利用率。

TensorRT通过以下三种方式来解决这个问题:

[if !supportLists]1.    [endif]Kernel纵向融合:通过融合相同顺序的操作来减少Kernel Launch的消耗以及避免层之间的显存读写操作。如上图所示,卷积、Bias和Relu层可以融合成一个Kernel,这里称之为CBR。

[if !supportLists]2.    [endif]Kernel横向融合:TensorRT会去挖掘输入数据且filter大小相同但weights不同的层,对于这些层不是使用三个不同的Kernel而是使用一个Kernel来提高效率,如上图中超宽的1x1 CBR所示。

[if !supportLists]3.    [endif]消除concatenation层,通过预分配输出缓存以及跳跃式的写入方式来避免这次转换。

通过这样的优化,TensorRT可以获得更小、更快、更高效的计算流图,其拥有更少层网络结构以及更少Kernel Launch次数。下表列出了常见几个网络在TensorRT优化后的网络层数量,很明显的看到TensorRT可以有效的优化网络结构、减少网络层数从而带来性能的提升。

NetworkLayersLayers after fusion

VGG194327

Inception V3309113

ResNet-152670159

FP16 & INT8 精度校准

大多数的网络都是使用FP32进行模型训练,因此模型最后的weights也是FP32格式。但是一旦完成训练,所有的网络参数就已经是最优,在推理过程中是无需进行反向迭代的,因此可以在推理中使用FP16或者INT8精度计算从而获得更小的模型,低的显存占用率和延迟以及更高的吞吐率。

TensorRT可以采用FP32、FP16和INT8精度部署模型,只需要在uff_to_trt_engine函数中指定相应数据类型即可:

[if !supportLists]o   [endif]对于FP32, 使用 trt.infer.DataType.FLOAT.

[if !supportLists]o   [endif]对于FP16 指令 以及 Volta GPU内的Tensor Cores, 使用trt.infer.DataType.HALF

[if !supportLists]o   [endif]对于INT8, 使用 trt.infer.DataType.INT8.

更多详细的信息会在未来几期公众号解释,如有兴趣请保持关注。

Kernel Auto-Tuning

TensorRT会针对大量的Kernel进行参数优化和调整。例如说,对于卷积计算有若干种算法,TensorRT会根据输入数据大小、filter大小、tensor分布、batch大小等等参数针对目标平台GPU进行选择和优化。

Dynamic Tensor Memory

TensorRT通过为每一个tensor在其使用期间设计分配显存来减少显存的占用增加显存的复用率,从而避免了显存的过度开销以获得更快和高效的推理性能。

优化结果

上图为基于Resnet50网络,分别在CPU、V100+TensorFlow、V100+TensorRT上进行推理时的性能比较,纵轴为每秒处理的图片数量。相较于CPU和TensorFlow,TensorRT可以带来40倍和18倍的吞吐率的提升,而这部分的提升只需要在拥有GPU的前提下使用TensorRT即可免费获得。


TensorRT 部署方法

完成TensorRT优化后可以得到一个Runtime

inference engine,这个文件可以被系列化保存至硬盘中,而这个保存的序列化文件我们称之为“Plan”(流图),之所以称之为流图,因此其不仅保存了计算时所需的网络weights也保存了Kernel执行的调度流程。TensorRT提供了write_engine_to_file()函数以来保存流图。


在获得了流图之后就可以使用TensorRT部署应用。为了进一步的简化部署流程,TensorRT提供了TensorRT Lite API,它是高度抽象的接口会自动处理大量的重复的通用任务例如创建一个Logger,反序列化流图并生成Runtime inference engine,处理输入的数据。以下代码提供了一个使用TensorRT Lite

API的范例教程,只需使用API创建一个Runtime Engine即可完成前文提到的通用任务,之后将需要推理的数据载入并送入Engine即可进行推理。

from tensorrt.lite import Engine

from tensorrt.infer import LogSeverity

import tensorrt


# Create a runtime engine from plan file using TensorRT Lite API 

engine_single = Engine(PLAN="keras_vgg19_b1_FP32.engine",


   postprocessors={"dense_2/Softmax":analyze})


images_trt, images_tf = load_and_preprocess_images()


results = []

for image in images_trt:

    result = engine_single.infer(image) # Single function for

inference

    results.append(result)


敲黑板!!!TensorRT3Highlight

TensorRT3带来的三个重大更新为:

[if !supportLists]1.    [endif]TensorFlow Model

Importer - 便捷的API用于导入TensorFLow训练的模型,优化并生成推理Engine。

[if !supportLists]2.    [endif]Python API -

Python API用于进一步提高开发效率。

[if !supportLists]3.    [endif]Volta Tensor

Core支持 - 带来相较于Tesla P100高达3.7倍的更快的推理性能。



以上 & 未完待续~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容

  • 我的闺蜜,小学到初中,我们一直都是同学,至今已经17年,这奠定 了我们无话不说的良好基础。 就在刚刚我们才通完话...
    末花纷纷开且落阅读 178评论 0 0
  • 01 “林宇,开门啦。” 我放下正在复习的英语书,挪开椅子,走到门口。 门口,谢飞和他的小女友李青捧着一个10寸的...
    四点半的洛杉矶阅读 1,070评论 11 33