美团深度学习系统的工程实践

背景

深度学习做为AI时代的核心技术,已经被应用于多个场景。在系统设计层面,因为其具备计算密集型的特性,因此与传统的机器学习算法在工程实践过程当中存在诸多的不一样。本文将介绍美团平台在应用深度学习技术的过程当中,相关系统设计的一些经验。git

本文将首先列举部分深度学习算法所需的计算量,而后再介绍为知足这些计算量,目前业界比较常见的一些解决方案。最后,咱们将介绍美团平台在NLU和语音识别两个领域中,设计相关系统的经验。github

深度学习的计算量

Model Input Size Param Size Flops
AlexNet 227 x 227 233 MB 727 MFLOPs
CaffeNet 224 x 224 233 MB 724 MFLOPs
VGG-VD-16 224 x 224 528 MB 16 GFLOPs
VGG-VD-19 224 x 224 548 MB 20 GFLOPs
GoogleNet 224 x 224 51 MB 2 GFLOPs
ResNet-34 224 x 224 83 MB 4 GFLOPs
ResNet-152 224 x 224 230 MB 11 GFLOPs
SENet 224 x 224 440 MB 21 GFLOPs

数据来源 上表列举了,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天的时间。但对于算法工程师作实验、调参而言,这种耗时数天的等待是难以忍受的。为此,目前业界针对深度学习训练的加速,提出了各类各样的解决方案。机器学习

异构计算的并行方案

数据并行(Data Parallelism)

Alt text
数据并行,即每一个计算单元都保留一份完整的模型拷贝,分别训练不一样的数据,通过一个Iteration或若干个Iteration后,把各个计算单元的模型作一次同步。这是最多见的深度学习训练方式,好处在于逻辑简单、代码实现方便。

模型并行(Model Parallelism)

Alt text
模型并行,即各个计算单元存储同一层模型数据的不一样部分,训练相同的数据。相对于数据并行,由于各个运算单元每训练完一层神经网络,就必需要同步一次,频繁的同步通讯致使系统不能充分地利用硬件的运算能力,因此更为少见。可是在一些业务场景下,Softmax层须要分类的类别可能会有不少,致使Softmax层太大,单个计算单元没法存储,这个时候,须要把模型切割成若干部分,存储在不一样的运算单元。模型并行常见于NLU、推荐、金融等领域。

流式并行(Stream Parallelism)

Alt text
流式并行,即每一个计算单元都存储不一样层的模型数据,训练相同的数据。如上图所示,GPU1只负责第一层神经网络的计算,GPU2只负责2~5层神经网络的计算,GPU3只负责第6层的计算。流式并行的好处在于每一个运算单元之间的通讯和计算重叠(overlap),若是配置得当,能够很是充分地利用硬件资源。缺点在于,根据不一样的模型,须要平衡好各个计算单元的计算量,若是配置很差,很容易造成“堰塞湖”。如上图所示,颇有可能出现GPU1 负责的运算量太少,而GPU2 负责的运算量太多,致使GPU1 和GPU2 之间堵塞住大量的Mini-batch,更常见于线上环境。

混合并行(Hybrid Parallelism)

Alt text
混合并行,即上面提到的并行方式的混合。如对于一些图像识别任务来讲,可能前几层使用数据并行,最后的Softmax层,使用模型并行。

异构计算的硬件解决方案

  • 单机单卡:一个主机内安装上一块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中单机多卡的通讯解决方案为例介绍,而多机多卡的通讯解决方案实际上是相似的。 学习

Alt text
上图是单机4卡机器,在硬件上,两种不一样的通讯体系。左边为普通的PCI-E通讯,即4个GPU之间组成一个环状。右边为NVLink通讯,即两两之间相互链接。 常见的通讯类型以下图所示:
Alt text
对于深度学习训练而言,关键的两种通讯类型为:Broadcast和Reduce。Broadcast用于Master分发最新的模型给各个GPU。Reduce 用于各个GPU计算完Mini-batch后,把模型更新值汇总到Master上。以Broadcast为例,最简单的通讯方式是Master往各个GPU上发送数据,这样的耗时就是4次模型传输的时间,通讯时间就会太长,一种简单的优化方法以下图所示:
Alt text
即把所须要传输的数据分红若干块,而后经过接力的方式逐个传递,每一个GPU都把本身最新的一块数据发送到下一个GPU卡上。这种传输方式能充分利用硬件层面的通讯结构,使得须要的耗时大幅缩减。与此相似的,Reduce的通讯优化也能够采起相同的方式进行提速。

美团的定制化深度学习系统

尽管目前在业界已经推出了不少著名的深度学习训练平台,通用的训练平台如TensorFlow、MxNet等等,还有领域专用的训练平台,如语音识别中的Kaldi,可是咱们通过调研后,决定内部自主开发一套深度学习系统,理由以下:优化

  • 通用的训练平台,缺少了领域特点的功能。如语音识别中的特征提取模块和算法。
  • 通用的训练平台,一般是基于Data-flow Graph,来对计算图中的每一个operator进行建模,因此颗粒度很小,须要调度的单元多,导任务调度复杂。
  • 领域特点的训练平台,如Kaldi,在神经网络训练的时候,性能不足。
  • 线上业务存在不少特殊性,若是使用TensorFlow之类做为训练平台,不太适合线上业务的情景。

NLU线上系统

线上系统的业务特色

咱们在设计NLU线上系统时,考虑了NLU业务的一些特性。发现其具有以下的一些特色:

  • 随着业务和技术的变化,算法流程也常常发生变化。
  • 算法流程是多个算法串联组成的,不单纯的只有深度学习算法。如分词等算法就不是DL算法。
  • 为了可以快速响应一些紧急问题,须要常常对模型进行热更新。
  • 更重要的是,咱们但愿构建一个能以“数据驱动”的自动迭代闭环。

业务多变

NLU任务的算法流程是多层级的,而且业务常常发生变化。以下图所示:

Alt text
即随着业务要求的变化,NLU系统一开始的算法流程,只须要把一个Query分为两个类,可是到后面,极有可能会变成须要分为三个类别。

热更新

根据业务需求,或者为了紧急处理一些特殊问题,NLU线上系统常常须要作出快速响应,热更新算法模型。如最近的热点词“skr”,几乎是一晚上之间,忽然火爆起来。以下图所示的微博,若是不能正确理解“skr”的正确语义,可能就不能准确理解这条微博想要表达的意思。

Alt text
为了不影响用户体验,咱们可能会对NLU系统,立刻进行热更新,把新模型紧急进行上线。

数据驱动的自动迭代闭环

Alt text
对于线上系统而言,构建如上图所示的自动迭代闭环,能更好地利用业务数据来提高服务质量。

NLU线上系统的核心设计

算法流程的抽象

为了适应线上系统串联、多变的算法流程,咱们把线上系统的算法进行抽象,以下图所示:

Alt text
即每个算法,都依赖于若干个槽位(Slot)和资源(Resource),一旦槽位和资源就位,就会触发对应的算法执行。算法的执行先经过算法适配器,来适配槽位和资源中的数据,转换成算子的输入格式。而后算子执行算法自己,执行完算子后,再通过算法解析器。算法解析器主要用于解析算法执行的结果,触发对应的槽位。如根据算法的结果,触发Top 3的结果。 多个算法串联起来,就构建成以下结果:
Alt text

热更新流程的设计

Alt text
如上图所示,咱们把算法的热更新流程设计如上。初试状态为左上角,即多个Query使用同一份模型数据。当遇到模型更新的请求后,系统将会block住新的query(右上角状态)。而后更新模型完后,新的query使用新的模型,旧query依然使用旧模型(右下角状态)。最后,当使用旧模型的query结束后,把旧的模型从内存中删除(左下角),而后系统恢复到初始状态。

声学模型训练系统

由于TensorFlow等通用深度学习训练平台,缺少了特征提取等业务相关的领域功能,而Kaldi的声学模型训练过程又太慢。因此美团开发了一个声学模型训练系统——Mimir,其具有以下特性:

  • 使用比TensorFlow更粗颗粒度的建模单元,使得任务调度、优化更简单方便易行。
  • 使用数据并行的并行方案,单机多卡可达到近线性加速。(采起同步更新策略下,4卡加速比达到3.8)
  • 移植了Kaldi的一些特有的训练算法。
  • 速度上为Kaldi的6~7倍。(800个小时的训练数据,单机单卡的条件下,Kaldi须要6~7天, Mimir只需20个小时)
  • 业务上,移植了Kaldi的特征提取等领域的相关模块。

参考资料

做者简介

剑鹏,美团点评算法专家。2017年加入美团,目前做为语音识别团队的声学模型负责人,负责声学模型相关的算法和系统设计与开发。

相关文章
相关标签/搜索