如何用 GPU 加速 AI 模型部署?
当影像资料输入进模型时,需经过层层已经过优化的权重隐藏层,最后得到一个输出结果,此过程我们称为推论 (inference)。推论过程依照模型参数量而有不同。若您的应用有计算时间的限制,是否也能透过 GPU 达到效能要求呢?答案是肯定的。我们可以使用 GPU 将耗费时间且繁复的模型训练时间缩短,也同样可透过 GPU 缩短推论时间。
模型开发人员可透过 cuDNN 函式库及相关的 GPU 函式库如 cuBLAS、cuSPARSE 或 cuFFT 等,在不同深度学习的框架 (framework) 都可以利用 GPU 进行模型训练的优化。
至于推论呢?本篇要介绍一个由 NVIDIA 开发的 SDK TensorRT。
TensorRT 工作原理
TensorRT 的方法主要是透过转换精度(单精度浮点数、半精度浮点数或8-bit整数),并改进延迟 (latency)、吞吐量 (throughput) 和效率 (efficiency)。现今 TensorRT 已经有支持多个框架,可透过 python /C++ 的 API 进行转档产生TensorRT 模型,如 Caffe、TensorFlow、PyTorch、Chainer 和 MxNet,而 Tensorflow 更已经将 TensorRT 整合在框架中。除了 Caffe 可以直接使用 TensorRT Parser (模型解析器) 进行转换,其余的框架需先转成 ONNX 通用格式再用 TensorRT Parser 进行转档。
TensorRT 优化过程
以下将透过 GoogLeNet 的 Inception 层,说明 TensorRT 是如何进行模型优化的。
相信熟悉模型架构的人都很清楚,GoogLeNet 的概念是为了解决传统深度网络在网络加深时容易遇到的两大问题:过度拟合 (over fitting) 及计算量增加。在透过网中网 (network in network) 的概念增加了网络的深度,但却减少了参数量。网络中采用了1x1、3x3和5x5的卷积核 (convolution kernel) 和3x3的最大池化(max pooling)。本篇会详细阐述 TensorRT 转换 GoogLeNet 的过程。
卷积核部分会有三层: ReLU、bias、conv. 这边将三层合并 (如上图 CBR ) 使用单个核 (kernel) 执行, 这边可以比喻成我们买三个东西原本是分开结帐,而 TensorRT 改成三个东西一起结帐。
而 TensorRT 也可以认得共享相同 input 数据以及 filer 大小,但是不同权重的隐藏层,如 1x1 conv. 将其合并成 1x1 CBR,将它们水平融合为单一个较宽的核所执行。
接着 TensorRT 完全可以直接接到需要的地方,不用专门做 concat 的操作,所以这一层也可以取消掉。此过程可以看到两个框框彼此之间是不相关的,因此我们可以单独启用两个计算流 (stream),分别运算。而上图也是 TensorRT 针对 Inception 层网络优化的结果,此过程称为网络隐藏层融合 (fusion layers of network)。网络在经过此过程后,都可有效降低隐藏层的数量,也表示减少计算量。
而经过 TensorRT 优化后模型的效能,由下图可知。实际来看 NVIDIA 在 GitHub 所提供的实际数据,表示 TensorRT 大约快1.5-4倍。此为透过 TensorRT 转换TensorFlow 上的常用于 NLP(Natural Language Processing) 领域的 BERT(Bidirectional Encoder Representations from Transformers) 语言模型。
请继续关注丽台小课堂,后续分享 Caffe 模型透过 TensorRT 转换实操
本文暂时没有评论,来添加一个吧(●'◡'●)