作者:手机用户2602916725 | 来源:互联网 | 2023-08-15 17:15
之前对于深度学习,人们更多的将精力放在了模型架构和训练上,希望能够得到准确率更高的模型。现在深度学习发展迅速,各种各样的模型层出不穷,可以发现模型变化的趋势是愈发复杂,性能当然也越
之前对于深度学习,人们更多的将精力放在了模型架构和训练上,希望能够得到准确率更高的模型。现在深度学习发展迅速,各种各样的模型层出不穷,可以发现模型变化的趋势是愈发复杂,性能当然也越来越好,然而一个潜在的问题慢慢暴露了出来。模型的最终目的是要在生产环境中对输入数据进行推断和预测,更复杂的模型意味着更多的计算量和更慢的推断速度,这样的结果是用户体验会打折扣,试想用户需要等待好几秒钟才能得到自己语音识别的结果,或者对推断及时性要求更强的自动驾驶领域,如果推断速度慢,反应不及时,会带来极大的安全隐患。
其实很多人已经注意到了对模型推断速度优化的重要性。一方面是硬件性能的不断提升迭代,高算力提供了高速度;另一方面则是从模型入手,对模型进行优化。NVIDIA推出的TensorRT就是这样一款专门针对GPU上进行高性能推断优化的平台,性能优化又是深度学习在工业界实际应用很重要的一块,因此我想对TensorRT相关的东西做一做梳理和总结。
以下是正文。
什么是TensorRT?
TensorRT的核心是一个C++库,能够在NVIDIA的GPU上进行模型推断性能的优化。官方对它的定义是可编程推断加速器(Programmable Inference Accelerator)。主要有两种方式可以使用它:
- 作为框架内部组件使用:TensorFlow从1.7版本之后内嵌了TensorRT,因此可以直接在TF内调用相关的函数进行模型推断优化。
- 作为库使用:TensorRT对于流行的框架(TensorFlow,Caffe,PyTorch,MXNet,etc)提供了对应的模型解析器,同时也提供了API(C++ & Python)直接编写模型。
可见TensorRT连接的两端是模型和生产环境,下图比较清楚的描述了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以上。
安装流程:
- 去这里根据自己实际需要的版本和硬件系统选择对应的TensorRT下载。
- TensorRT的安装包有很多格式:Debian packages、RPM packages、tar、zip。其中Debian和RPM会自动安装TensorRT需要的依赖,但是需要用户有root权限,无法指定TensorRT的安装位置,需要用户的CUDA和cuDNN也是使用Debian或者RPM安装的。Tar包更加灵活,但需要用户实现将依赖都装好。Zip文件我个人不推荐,因为它只支持在Windows上安装,同样也需要用户将依赖都事先安装好。
- 具体不同格式包的详细安装说明,可以参见这里。
还有一种很方便的安装方法。NVIDIA提供了TensorRT Container,只需要安装这个容器,TensorRT就是Ready-to-use的状态。
关于TensorRT的简介和安装就总结到这里,之后会梳理TensorRT的优化策略和使用实战。
References:
TensorRT Developer Guide docs.nvidia.com
TensorRT Installation Guide docs.nvidia.com
NVIDIA Container & Frameworks docs.nvidia.com