热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TensorRT(1):TensorRT简介与安装

之前对于深度学习,人们更多的将精力放在了模型架构和训练上,希望能够得到准确率更高的模型。现在深度学习发展迅速,各种各样的模型层出不穷,可以发现模型变化的趋势是愈发复杂,性能当然也越

之前对于深度学习,人们更多的将精力放在了模型架构和训练上,希望能够得到准确率更高的模型。现在深度学习发展迅速,各种各样的模型层出不穷,可以发现模型变化的趋势是愈发复杂,性能当然也越来越好,然而一个潜在的问题慢慢暴露了出来。模型的最终目的是要在生产环境中对输入数据进行推断和预测,更复杂的模型意味着更多的计算量和更慢的推断速度,这样的结果是用户体验会打折扣,试想用户需要等待好几秒钟才能得到自己语音识别的结果,或者对推断及时性要求更强的自动驾驶领域,如果推断速度慢,反应不及时,会带来极大的安全隐患。

其实很多人已经注意到了对模型推断速度优化的重要性。一方面是硬件性能的不断提升迭代,高算力提供了高速度;另一方面则是从模型入手,对模型进行优化。NVIDIA推出的TensorRT就是这样一款专门针对GPU上进行高性能推断优化的平台,性能优化又是深度学习在工业界实际应用很重要的一块,因此我想对TensorRT相关的东西做一做梳理和总结。

以下是正文。

什么是TensorRT?

TensorRT的核心是一个C++库,能够在NVIDIA的GPU上进行模型推断性能的优化。官方对它的定义是可编程推断加速器(Programmable Inference Accelerator)。主要有两种方式可以使用它:

  1. 作为框架内部组件使用:TensorFlow从1.7版本之后内嵌了TensorRT,因此可以直接在TF内调用相关的函数进行模型推断优化。
  2. 作为库使用:TensorRT对于流行的框架(TensorFlow,Caffe,PyTorch,MXNet,etc)提供了对应的模型解析器,同时也提供了API(C++ & Python)直接编写模型。

可见TensorRT连接的两端是模型和生产环境,下图比较清楚的描述了TensorRT所扮演的角色。

《TensorRT(1):TensorRT简介与安装》
《TensorRT(1):TensorRT简介与安装》 TensorRT扮演的角色

TensorRT首先对框架训练好的模型进行优化,然后将优化后的模型转换为一个轻量化的引擎,这个运行时是最后实际部署在GPU生产环境中提供服务的。

TensorRT的优势

对于深度学习推断而言,主要有5个方面衡量其性能。

  • 吞吐量:单位时间可以完成推断的样本量。
  • 能效:单位能耗可以产生的性能(对于数据中心这样的规模而言是很重要的指标)。
  • 延迟:对用户体验而言非常关键的指标。
  • 准确度:能够提供正确推断结果的能力,不能单纯为了提高速度而忽视质量。
  • 内存占用:对于内存有限的生产环境(比如嵌入式平台)是很重要的指标。

传统优化推断性能的方式主要有2种。

  • 使用开发和训练模型的框架自身进行优化。这往往是很有限的,因为框架更专注于更好的泛化和普适性,而且优化也往往集中在训练过程当中。
  • 对于特定的模型和生产环境专门写对应的优化程序。效果可能会很好,但需要开发组对底层的库和硬件平台有很深的沉淀才能达到好的优化效果,而且如果生产环境发生变化(比如更换GPU型号,硬件驱动更新等),相应的程序就需要推倒重写,效率很低。

TensorRT的优势在于将具体的硬件细节抽象化成一个个API,开发者不需要了解每一款硬件和底层的库,TensorRT会自动分析模型和生产环境,对上述五个方面进行优化,大大方便了开发者。

TensorRT如何工作的?

TensorRT会对你输入的模型和部署模型的生产环境进行分析,生成一个优化后的推断引擎。这个过程需要耗费相当的时间,所以一般我们会将这个推断引擎进行序列化,便于以后使用。

需要注意的是当你更换生产环境(GPU型号)或者TensorRT版本时,需要重新生成推理引擎,已达到最好的优化效果。

构建推断引擎的过程中,TensorRT大致会对输入的模型进行如下的优化:

  • 消除对模型输入而言不必要的层。
  • 将卷积、bias和激活函数这类常一同使用的搭配进行融合,单元化。
  • 将数据来源于相同上游Tensor进行的操作用尽可能少的参数聚合起来。
  • 将聚合后的层的输出直接指向最终的Tensor。
  • 如果需要的话,可以调整模型计算时候的精度(FP32、FP16、INT8)
  • GPU计算时会调用不同的kernel,TensorRT会去对特定的Tensor分配到对应它最快的kernel上。
  • 权重值预先格式化。
  • 内存优化。

具体如何聚合layer,融合操作,之后会单独写文章梳理一下。

TensorRT提供的核心接口

  • Network Definition:TensorRT提供了很多模型中常用的层的API,同时也提供了最基本的API可以让用户去构造自己特定结构的层。
  • Builder:让TensorRT可以从上面的网络模型定义中进行优化,生成优化后的推断引擎。同时可以让用户指定优化时候的参数(比如改变推断计算时的精度)。
  • Engine:让优化后的推断引擎执行推断操作的各种API。
  • Caffe Parser:解析Caffe框架开发训练的模型。
  • UFF Parser:解析使用UFF格式存储的模型。
  • ONNX Parser:解析ONNX模型。

TensorRT的安装(目前版本5.1.5)

安装前的注意事项:

  • 如果要使用TensorRT中的Python API,务必要先安装安装PyCUDA。
  • CUDA组件要事先安装好。支持TensorRT的版本是9.0、10.0、10.1。
  • TensorFlow版本需要1.12.0以上。
  • PyTorch版本1.0以上。

安装流程:

  1. 去这里根据自己实际需要的版本和硬件系统选择对应的TensorRT下载。
  2. TensorRT的安装包有很多格式:Debian packages、RPM packages、tar、zip。其中Debian和RPM会自动安装TensorRT需要的依赖,但是需要用户有root权限,无法指定TensorRT的安装位置,需要用户的CUDA和cuDNN也是使用Debian或者RPM安装的。Tar包更加灵活,但需要用户实现将依赖都装好。Zip文件我个人不推荐,因为它只支持在Windows上安装,同样也需要用户将依赖都事先安装好。
  3. 具体不同格式包的详细安装说明,可以参见这里。

还有一种很方便的安装方法。NVIDIA提供了TensorRT Container,只需要安装这个容器,TensorRT就是Ready-to-use的状态。

关于TensorRT的简介和安装就总结到这里,之后会梳理TensorRT的优化策略和使用实战。

References:

TensorRT Developer Guidedocs.nvidia.com《TensorRT(1):TensorRT简介与安装》
TensorRT Installation Guidedocs.nvidia.com
NVIDIA Container & Frameworksdocs.nvidia.com


推荐阅读
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
  • OCR:用字符识别方法将形状翻译成计算机文字的过程Matlab:商业数学软件;CUDA:CUDA™是一种由NVIDIA推 ... [详细]
  • 语义分割系列3SegNet(pytorch实现)
    SegNet手稿最早是在2015年12月投出,和FCN属于同时期作品。稍晚于FCN,既然属于后来者,又是与FCN同属于语义分割网络 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • Kali Linux 简介
    KaliLinux是世界渗透测试行业公认的优秀的网络安全审计工具集合,它可以通过对设备的探测来审计其安全性,而且功能完备,几乎包含了目前所 ... [详细]
  • Ubuntu 用户安装 Linux Kernel 3.15 RC1
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • docker安装到基本使用
    记录docker概念,安装及入门日常使用Docker安装查看官方文档,在"Debian上安装Docker",其他平台在"这里查 ... [详细]
  • OpenStackQ版本已经发布了一段时间了。今天,小编来总结一下OpenStackQ版本核心组件的各项主要新功能,再来汇总一下最近2年来OpenStackN、O、P、Q各版本核心 ... [详细]
  • 安装Tensorflow-GPU文档第一步:通过Anaconda安装python从这个链接https:www.anaconda.comdownload#window ... [详细]
author-avatar
手机用户2602916725
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有