加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 正文

TensorRT如何加速人脸识别

发布时间:2020-06-12 11:30:47 所属栏目:创业 来源:站长网
导读:副标题#e# 为了提高人脸识别的实时性,我们团队将传统的利用神经网络框架推理升级至统一的 TensorRT 加速推理。经实验对比,经 TensorRT FP16 模式推理加速后的人脸识别不仅几乎无损精度,甚至于在部分场景精度有提升,识别速度提升为原来的 2.3 倍。统一加

TensorFlow Serving 是由 Google 的 TensorFlow 团队开发的一种灵活的、高性能的机器学习模型服务系统,专为生产环境设计。在机器学习推理方面,其可以对训练后的模型进行生命周期管理,通过高性能、引用计数的查找表为客户端提供版本化访问。其提供了与 TensorFlow 模型开箱即用的集成,也能拓展到其他模型。如果模型由 TensorFlow 训练生成的,用 TensorFlow Serving 最为方便。详细介绍参见 https://github.com/tensorflow/serving 。

② MMS( Multi Model Server )

Multi Model Server(MMS)是一个灵活和易于使用的工具,为使用任何 ML/DL 框架训练的深度学习模型提供推理服务。这个是由 Amazon 的 AWSlab 开发的模型推理工具,原来叫 MxNet Model Server。由于 Amazon 主力支持的是 MxNet,因此 MMS 对 MxNet 有更好的优化,对 MxNet 的特性支持也更加积极。详见 https://github.com/awslabs/multi-model-server 。

③ TensorRT Inference Server

前面介绍的 TensorFlow Serving 和 MMS 都是由深度学习框架的厂商推出的,相应的对其各自的深度学习框架支持也会更好。

TensorRT Inference Server (最新版叫 Nvidia Triton Inference Server)是由显卡厂商 Nvidia 开发的深度学习模型推理 Server。其针对 Nvidia GPU 有更深层次的优化,该 Server 可以通过 HTTP 或者 GRPC 端点提供推理服务。其最大的特点是多框架的支持,其不仅支持 TensorRT 本身生成的模型,而且支持 TensorFlow、Caffe2、ONNX 和 PyTorch 的模型。还支持混合模型的推理,以及不同框架模型同时推理。这很好的契合业务上推理服务与神经网络框架脱离的需求。详见 https://github.com/NVIDIA/triton-inference-server。

这里简单介绍常见的 Inference Server,当然还有其他厂商的 Inference Server,如 TorchServe,见 https://github.com/pytorch/serve。

三、TensorRT 加速人脸识别

1、TensorRT 的典型 INT8 工作流程:

首先我们需要在 FP32 模式下训练得到的模型文件及校准数据集。接下来:

① TensorRT 将会在校准集上作 FP32 的推理。

② 得到每个网络层相应的激活值统计。

③ 实施校准算法即获取每层对应的最佳阈值 T,获取最优的量化因子。

④ 量化 FP32 的权重为 INT8 模式。

⑤ 生成相应的校准表 ( CalibrationTable ) 和 INT8 执行引擎。

2、TensorRT 加速需要注意的问题:

① 深度学习框架与 TensorRT 的整合度不同

如上所述实施 TensorRT 推理加速,首先是需要一个 FP32 模式下训练得到的神经网络模型。如果要进行 INT8 推理,还需要校准数据集 (Calibration Dataset),一般是选取验证集的子集。由于各深度学习框架和 TensorRT 的整合度和支持度不同,除了 TensorFlow 和 MATLAB 已经集成了 TensorRT 外,大部分的深度学习框架生成的模型都要通过 ONNX 格式导入 TensorRT 中。如图 12 所示:

TensorRT如何加速人脸识别

由于 TensorFlow 内实现了和 TensorRT 进行整合的 API,即可以从 TensorFlow 代码中指定 TensorRT 作为 Inference 的 backend,TensorRT 中也实现了一个 TensorFlow Parser 用于解析 TensorFlow 生成的模型文件。PyTorch、MXNET 则需要在训练的时候将模型文件保存为 ONNX 格式,或者是将原先的模型文件导入框架再保存为 ONNX 格式。当然这些深度学习框架也在跟进对 TensorRT 的支持和整合,比如新的 1.60 版本 MXNET 中已经实现了调用 TensorRT 加速推理,但是当前版本只支持 FP16 的推理,还不支持 INT8 推理。当然使用框架内提供的 TensorRT 接口进行加速有其好处,当然也会带来相应的问题,好处是框架内提供的比较方便,减少转换等中间过程,但还是不能脱离框架本身,这与统一用推理引擎,脱离深度学习框架本身的出发点相背道。

② TensorRT 对神经网络中的算子和层的支持

由于我们当前业务中人脸识别是在 mxnet 框架上实现的,为了实现并对比其在 TensorRT FP32、FP16、INT8 三种模式下的精度损失情况和加速效果。我们首先将原始的 mxnet 格式(.params + .json)模型文件导入到 mxnet 中,然后利用 mxnet 内部的 onnx 接口将模型文件转换为 onnx 格式。这里需要注意一个问题是 Mxnet 模型导出为 onnx 格式,需要安装 1.3.0 以上版本的 mxnet,以及对应的组件 onnx 也需要 1.2.1 版本,不过我们测试过 1.3.0 版本的 onnx 也可以。具体可参见 MxNet 的官方教程:Exporting to ONNX format [5]。onnx-1.2.1 版本生成的是 onnx 文件默认 V7 版本的 onnx operator,而 1.3.0 版本 onnx 生成的 onnx 文件支持的是 V8 版本的 onnx operator。不同版本的 onnx operator 对算子的支持是不同的,而且即便是同样的算子,不同的版本其内部实现方式也可能会不同。不同版本的 TensorRT 对 onnx 的算子支持也不同,mxnet 对 onnx 算子支持可参见: ONNX Operator Coverage[6]。TensorRT 对 onnx 算子支持可参见:Supported ONNX Operators[7] 和 TensorRT-Support-Matrix-Guide[8]。

我们团队在利用 TensorRT 转换人脸识别 onnx 模型到 TensorRT 对应的模型文件(.trt)的过程就曾遇到过算子支持的问题。由 mxnet 生成的 onnx 模型文件导入到 TensorRT 之后,一直无法正常的导出 TRT 文件。后来通过调研发现是 TensorRT 对 Prelu 这个算子的支持模式问题。通过 Netron(神经网络可视化工具)可以清楚的看到这两种 Prelu 的模式区别。如图 13 所示:

TensorRT如何加速人脸识别

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读