TensorRT如何加速人脸识别
副标题[/!--empirenews.page--]
为了提高人脸识别的实时性,我们团队将传统的利用神经网络框架推理升级至统一的 TensorRT 加速推理。经实验对比,经 TensorRT FP16 模式推理加速后的人脸识别不仅几乎无损精度,甚至于在部分场景精度有提升,识别速度提升为原来的 2.3 倍。统一加速推理的人脸识别不仅能为客户提供优质高响应的服务,同时也能提升 AI 服务器资源利用率,降低服务成本,也有利于各模型推理的整合统一。 一、目的及背景 首先,量化推理的出现为提升人脸识别服务的响应速度,给客户提供更优质的服务体验提供了更多的选择。 其次,由于不同业务需求的神经网络模型可能是在不同的神经网络框架下训练生成的,比如说人脸检测利用的是 TensorFlow,人脸识别利用的是 MxNet,而肖像生成利用的是 PyTorch。如果线上服务都用深度学习框架进行推理,则需要在服务器上部署多种框架,相对于统一的推理引擎,多种框架不利于结构的优化以及数据之间的通信,且会增加升级和维护的成本。 最后,面对日益增长的 AI 服务需求,为了保证响应的服务质量,企业需要采购更多的服务器资源,特别是 GPU 服务器。如何提升服务器资源的利用率,降低相应的服务成本也成为迫切的需求。通过模型量化推理减少计算和存储资源的占用,而推理加速也可以减少服务器资源占用。 基于以上背景,我们团队对现有的量化推理和深度学习推理服务进行了调研和实验。 二、相关技术 1、TensorRT 什么是 TensorRT?TensorRT 是 Nvidia 开发的用于高性能深度学习推理的 SDK。其包括一个高性能的神经网络 Inference Optimizer 和一个 Runtime Engine 用于生产部署。利用 TensorRT,可以优化所有主要深度学习框架中训练的神经网络模型,以高准确性来校准低精度,最终部署到超大规模的数据中心、嵌入式设备或汽车产品平台。如图 1 所示: TensorRT 通过融合层和优化内核来优化网络,从而提高延迟、吞吐量、功率效率和内存消耗。如果应用程序指定,它还将优化网络以降低运行精度,进一步提高性能并减少内存需求。如图 2 所示: TensorRT 为深度学习推理应用的生产部署提供 INT8 和 FP16 优化,如视频流、语音识别、推荐和自然语言处理。减少精度推理可以显著降低应用程序延迟,降低延迟是许多实时服务、自动驾驶和嵌入式应用程序的需求。 ① Low Precision Inference MxNet、TensorFlow、PyTorch 等现有的深度学习框架,在训练模型的时候,一般都会使用 Float 32(简称 FP32)的精度来表示权值、偏置、激活值等. 而当网络的层数逐渐加深,其参数的计算量是极其多的,比如像 ResNet、VGG 这种网络。如此大的计算量,如果在推理过程中都用 FP32 的精度来计算,会比较耗费时间和资源。如果是在对计算资源有限制的移动设备或者是嵌入式设备,如此大的计算量简直无法想法,甚至于根本运行不起来。 在部署推理的时候使用低精度的数据,比如 INT8、FP16 等就是解决大计算量以及提升推理速度的一种方法。当然解决大计算量问题的方法,还有模型压缩这类方法。但本文的方法专注于模型推理阶段的优化。 那么问题就来了,使用更低精度的数值表示会不会降低原来的模型准确性。毕竟如表格 1 所示,不同精度的动态范围相差还是很大。 对这个精度损失的问题,已经有不少学者在经验层面对其进行了相应的分析。比如 Why are Eight Bits Enough for Deep Neural Networks? [1]以及 Low Precision Inference with TensorRT [2] 这两篇博文的提出即便是推理时使用低精度的数据,在提升推理速度的同时,并不会对精度造成太大的影响。博文作者认为神经网络学习到数据样本的模式可分性,同时由于数据中存在的噪声,使得网络具有较强的鲁棒性,也就是说在输入样本中做轻微的变动并不会过多的影响结果性能。甚至有研究发现,在某些场景下,低精度推理能提升结果的准确性。此外 Improving the Speed of Neural Networks on CPUs [3]和 Training Deep Neural Networks with Low Precision Multiplications [4] 这两篇文章则在理论上其进行了分析论证。 由于 INT8 的低存储占用以及高通过率,但是由于其表示范围与 FP32 相差还是太大,实际上将 FP32 精度降为 INT8 精度,即用 8bit 来表示原来用 32bit 表示的 tensor,这其实相当于信息再编码过程,而且不能有明显的精度损失,还是具有相当大的挑战。该转换过程需要将每一层输入张量 (Tensor) 和网络学习的参数都从原来的 FP32 表示转为 INT8 表示。因此需要最小化该转换过程的信息损失,而且转换方式得要是简单而且计算效率高的。TensorRT 采用是简单有效的线性量化的转换方式。即式(1): FP32 Tensor(T) = FP32 scale factor * 8-bit Tensor(t) + FP32_bias(b)(1) 其中 Nvidia 的研究者经过证明可以将其中的偏置项去掉,即式(2): FP32 Tensor(T) = FP32 scale factor * 8-bit Tensor(t)(2) 那么在转换过程中最重要的就是确定这个 scale factor,最简单的方法就是如图 3 左边所示的直接将 FP32 tensor 值中的 –|max| 和 |max| 映射为 INT8 对应的 -127 和 127,中间的值按照线性的关系进行映射,该方法也被称为不饱和(No saturation)映射。但是经过实验表明,该种方式有明显的精度损失。因此 TensorRT 的开发者采用被称为饱和 (saturate) 映射的方式,如图 3 右边所示: (编辑:源码门户网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |