(给Python开发者加星标,提升Python技能)
转自:美团技术团队 - 剑鹏
背景
深度学习作为AI时代的核心技术,已经被应用于众多场景。在系统设计层面,由于它具有计算密集的特性,所以与传统的机器学习算法在工程实践过程中存在诸多的不同。本文将介绍美团平台在应用深度学习技术的过程中,相关系统设计的一些经验。
本文将首先列举部分深度学习算法所需的计算量,然后再介绍为满足这些计算量,目前业界比较常见的一些解决方案。最后,我们将介绍美团平台在NLU和语音识别两个领域中,设计相关系统的经验。
深度学习的计算量
数据来源
上表列举了,ImageNet图像识别中常见算法的模型大小以及单张图片一次训练(One Pass)所需要的计算量。
自2012年,Hinton的学生Alex Krizhevsky提出AlexNet,一举摘下ILSVRC 2012的桂冠后,ILSVRC比赛冠军的准确率越来越高。与此同时,其中使用到的深度学习算法也越来越复杂,所需要的计算量也越来越大。SENet与AlexNet相比,计算量多了近30倍。我们知道,ImageNet大概有120万张图片,以SENet为例,如果要完成100个epoch的完整训练,将需要2.52 * 10^18的计算量。如此庞大的计算量,已经远远超出传统的机器学习算法的范畴。更别说,Google在论文《Revisiting Unreasonable Effectiveness of Data in Deep Learning Era》中提及的、比ImageNet大300倍的数据集。
面对如此庞大的计算量,那么,我们业界当前常用的计算单元的计算力是多少呢?
CPU 物理核:一般浮点运算能力在10^10 FLOPS量级。一台16 Cores的服务器,大致上有200 GFLOPS的运算能力。实际运行,CPU 大概能用到80%的性能,那就160 GFLOPS的运算能力。完成上述SENet运行,需要182天。
NVIDIA GPGPU: 目前的V100,单精度浮点运算的峰值大概为14 TFLOPS, 实际运行中,我们假设能用到50%的峰值性能,那就是7 TFLOPS,需要4天。
根据以上数据结果可以看出:在深度学习领域,GPU训练数据集所需要耗费的时间,远远少于CPU,这也是当前深度学习训练都是采用GPU的重要原因。
从前面的计算可知,即使使用GPU来计算,训练一次ImageNet 也需要4天的时间。但对于算法工程师做实验、调参而言,这种耗时数天的等待是难以忍受的。为此,目前业界针对深度学习训练的加速,提出了各种各样的解决方案。
单机单卡:一个主机内安装上一块GPU运算卡。常见于个人计算机。
单机多卡:一个主机内安装上多块GPU运算卡。常见的有:1机4卡,1机8卡,甚至有1机10卡。一般公司都采取这种硬件方案。
多机多卡:多台主机内安装多块GPU运算卡。常见于公司内部的计算集群,一般多机之间采取Infiniband 来实现网络的快速通信。
定制化:即类似于Google的TPU解决方案。常见于“巨无霸”公司内部。
根据上面的硬件解决方案,我们以ResNet为例:模型的大小为230M,单张图片运算量为11 GFLPOS,Mini-batch假设为128。可以计算出各个硬件模块在深度学习训练中的耗时比较:
GPU:对于V100,假设有6 TFLOPS,一次Mini-batch 理论耗时:0.23s。
PCI-E:常见PCI-E 3.0 * 16,速度为10 GB/s,传输一个模型的理论耗时为:0.023s。
网络:假设为10 GB/s的高速网络,传输一个模型的理论耗时:0.023s。
Disk:普通的磁盘,我们假设200M/s的读取速度,读取一次Mini-batch所需要的图片耗时:0.094s。
根据上面的数据结果,我们似乎可以得出一个结论:PCI-E和网络的传输耗时,相对于GPU来说,整整少了一个数量级,所以网络通信同步的时间可以忽略不计。然而问题并没有那么简单,上面例子中的耗时只是单个模型的耗时,但是对于8卡的集群来说,如果使用数据并行,每次同步就需要传输8份模型,这就导致数据传输的时间和GPU的计算时间“旗鼓相当”。这样的话,GPU就得每训练完一个Mini-batch,都得等候很久的一段时间(采取同步更新),这会浪费很多计算资源。因此,网络通信也需要制定对应的解决方案。下面我们以Nvidia NCCL中单机多卡的通信解决方案为例介绍,而多机多卡的通信解决方案其实是类似的。
尽管目前在业界已经推出了很多著名的深度学习训练平台,通用的训练平台如TensorFlow、MxNet等等,还有领域专用的训练平台,如语音识别中的Kaldi,但是我们经过调研后,决定内部自主开发一套深度学习系统,理由如下:
通用的训练平台,缺乏了领域特色的功能。如语音识别中的特征提取模块和算法。
通用的训练平台,通常是基于Data-flow Graph,来对计算图中的每个operator进行建模,所以颗粒度很小,需要调度的单元多,导任务调度复杂。
领域特色的训练平台,如Kaldi,在神经网络训练的时候,性能不足。
线上业务存在很多特殊性,如果使用TensorFlow之类作为训练平台,不太适合线上业务的情景。
我们在设计NLU线上系统时,考虑了NLU业务的一些特性。发现其具备如下的一些特点:
随着业务和技术的变化,算法流程也经常发生变化。
算法流程是多个算法串联组成的,不单纯的只有深度学习算法。如分词等算法就不是DL算法。
为了能够快速响应一些紧急问题,需要经常对模型进行热更新。
更重要的是,我们希望构建一个能以“数据驱动”的自动迭代闭环。
NLU任务的算法流程是多层级的,并且业务经常发生变化。如下图所示:
根据业务需求,或者为了紧急处理一些特殊问题,NLU线上系统经常需要做出快速响应,热更新算法模型。如最近的热点词“skr”,几乎是一夜之间,突然火爆起来。如下图所示的微博,如果不能正确理解“skr”的正确语义,可能就不能准确理解这条微博想要表达的意思。
为了适应线上系统串联、多变的算法流程,我们把线上系统的算法进行抽象,如下图所示:
因为TensorFlow等通用深度学习训练平台,缺乏了特征提取等业务相关的领域功能,而Kaldi的声学模型训练过程又太慢。所以美团开发了一个声学模型训练系统——Mimir,其具备如下特性:
使用比TensorFlow更粗颗粒度的建模单元,使得任务调度、优化更简单方便易行。
使用数据并行的并行方案,单机多卡可达到近线性加速。(采取同步更新策略下,4卡加速比达到3.8)
移植了Kaldi的一些特有的训练算法。
速度上为Kaldi的6~7倍。(800个小时的训练数据,单机单卡的条件下,Kaldi需要6~7天, Mimir只需20个小时)
业务上,移植了Kaldi的特征提取等领域的相关模块。
NCCL: ACCELERATED MULTI-GPU COLLECTIVE COMMUNICATIONS
老师木讲架构:深度学习平台技术演进(https://blog.csdn.net/np4rHI455vg29y2/article/details/78958138)
推荐阅读
(点击标题可跳转阅读)
觉得本文对你有帮助?请分享给更多人
关注「Python开发者」加星标,提升Python技能