1 介绍
1.1 背景
腾讯提供了一些列Internet服务,比如拥有3.9亿左右月激活用户的微信(WeChat)、以及8.4亿左右QQ用户和6.4亿左右的QZone用户。这些数据是来自于2014年第一季度。腾讯拥有超过100PB数据,这些数据由不同的应用以及不同的用户产生的,用户生成的数据比如有照片、语音和视频。
近些年深度学习在大数据挖掘已经成为一个热点,也在不同领域取得了突破性的进展,比如语音识别(automatic speech recognition)和图像识别。深度学习能给腾讯的很多应用带来实质性改变,比如微信中的语音和图像识别、QQ和QZone的广告投放。
当然如果想要深度学习在腾讯真正发挥作用,必须考虑三方面的因素。
l 需要具备大量的计算能力和有效的并行框架去训练模型。比如:在微信中用于识别中文和英文的ASR(Automatic Speech Recognition)语音识别模型采用的是一个深层的神经网络(DNN)去训练,该模型大约有超过5000万参数,然后用100亿训练实例,如果只使用单个CPU去训练可能需要花上好几年时间,或者采用单个GPU去训练可能花上几个月时间
l 对于训练大型模型,必要的支持能提高模型质量。在CNNs中,通过增加更多Map
Filter(小块区域映射) 和更多的层可以提高分类的准确率。
l 灵活的框架对于做不同模型选择实验是相当有帮助的,模型选择包括:选择模型架构、寻找优化方法、以及微调一个高性能模型的超参数
为了解决上面的三方面因素,并行框架必须在模型训练更快、更大、更易用。
一般并行框架分为两种:数据并行(Data parallelism)和模型并行(model
parallelism),这两种框架是由Google DistBelief引进的,采用的是CPU组成的集群。
由Google COTS系统以及Facebook的Multi-GPU也才采用这种并行方案,这些系统是
由GPU服务组成的。下面我们简单区分一下数据并行和模型并行,简单来讲数据并行就
是把数据分成多份(每份称为mini-batch),每份数据跑一个模型副本,然后用每个模
型计算出来的梯度(gradients)去更新参数;模型并行就是把模型切分开来,让每个计
算节点计算模型一部分,然后在计算过程中做内部交互。模型并行除了提高性能外,也
减少每个节点内存消耗,由此它有可能处理更大的模型。
除了一些公司内部特有的框架,在一些开源社区里面也有一些使用CPUs和GPUs的深
度学习框架。然而这些开源社区的框架不适合腾讯内部的需求。因为这些开源社区使用
的是单核多线程或者单GPU作为训练框架,缺乏有效的并行方案。
1.2 平台介绍
为了支持深度学习,我们构建了Mariana深度学习平台,这个平台可以让模型训练更快,
让超大模型训练成为可能以及更方便的做实验。
经验表明,构建一个通用的平台去解决一些列业务(微信中语音和图像识别、QQ和Qzone中的CTR预估)相当困难。因为不同的应用更强调是的特殊业务场景。
由此Mariana构建了三个并行架构1.) 多GPUs的数据并行框架,应用于DNNs
2.) 多GPUs的模型并行和数据并行框架,应用于CNNs 3.) CPU集群模型并行和数据并行框架,应用于大规模的DNNs。
Mariana在简化深度学习实验和减轻算法工程师负担做出了很大的努力。Mariana提供一些列服务,这些服务主要包括:内建的算法、灵活的调整超参数、检查点(checkpoint)和周期重启、生成自动测试报告以及训练任务的监控。
Mariana已经被应用到腾讯的很多业务之中,比如在微信中的语音识别和图像识别、在QQ和Qzone中广告点击率预测,在这些业务中,深度学习已经在过去一年中真正发挥出了它的优势。
Mariana主要架构是采样GPU服务器,每台服务器装配4或者6块GPU卡,当然Mariana也采样CPU服务器。
多GPU的数据并行框架(建立DNN模型)服务于微信中的语音识别功能,根据实验数据表明一台6GPUs计算能力大约是单GPU计算能力的4.6倍。多GPU的模型并行和数据并行框架(建立CNN模型)服务于微信中的图像识别以及QQ的CTR预估上,根据实验数据表明4GPUs的计算能力大约是单GPU计算能力2.52倍。他们的CPU集群也是被用于建立语音设别模型上。
2 Multi-GPU数据并行DNN
2.1 业务场景
Mariana内部包括Multi-GPU的深度网络(DNN),该深度网络首要的应用范围是语音识别(ASR)。语音识别是把输入音频信号分类成不同的三音素(triphones),在这里我们把。在我们的语音识别模型中,采用了4-6隐层的全连接深度网络去训练音频数据,该模型大约有5000万个参数。
ASR属于计算密集型的,它需要大量计算资源,而仅仅需要1G内存,所以GPU是一个很好的备选方案,因为GPU相对于CPU而言有高性能计算,但是就内存相比而言显得很有限。为了更好的利用单个服务器上的多GPUs,我们首先为ASR选择一种有效并行方案,该方案采用的是能提高1.5倍2GPUs(一个服务器)。然而模型并行对于ASR来说在扩展性有一定限制,当超过2GPUs也不能达到很好的性能。因为我们才数据并行的multi-GPU 框架。
2.2 架构
在执行数据并行训练时,每个工作组(workergroup)去承担一个模型副本训练。因为深
度网络没有模型并行,所以每个工作组只包括一个GPU。
multi-GPU的数据并行深度网络架构使用一个运行在CPU上的driver程序去控制训练过程(同步SGD)。Driver程序每次从文件系统上读取一批数据块(mini-batch)到内存,接着从内存拷贝到GPU内存。然后driver程序等待所有的GPUs,当所有的GPUs训练本次的mini-batch结束后,driver程序协调在所有的GPUs之间的参数交互。
2.3 参数交换
参数交换过程可以参照图1,交换过程从逻辑上看有个三个阶段。首先,梯度收集阶段,
在该阶段从所有GPUs 收集计算出来的梯度;其次,参数更新阶段,在该阶段用收集的梯度更行模型;最后,参数分发阶段,在该阶段把更行过的模型同步所有的GPUs上。从物理上看,参数交换是通过PCIe或者输入输出hub(IOH)去连接GPUs。对于一台多GPUs的服务器,GPUs是通过PCIe以一颗树状结构相连。对于超过4GPUs的单台服务器,这些GPUs先分成两组,然后通过IOH相连。参数交换的性能被PCIe和IOH的带宽限制,对于PCIe2.0 速度大约是4-6GB/s,这对于NVIDIA Tesla K20系列GPUs来说是相当慢,该系列GPUs带宽大约在200+GB/s。由此用更多的GPUs做数据并行,参数交换成为一个瓶颈。
图1
2.4 线性划分拓扑
为了提高参数交换性能,我们采用了一种创新的拓扑结构,该结构的主要目的是减少总
的数据拷贝和最大化利用GPUs之间的带宽。一种直接的方法是采用星状拓扑结构,在这种结构中每个GPUs复制它自己的梯度到其他所有的GPUs上。对于N个GPUs,将有N2/ 2梯度被复制,复制数据很明显不是最少的。另一种通用的拓扑结构是树状结构,在该拓扑中从树的叶子节点开始收集梯度一直到根节点,但是不是所有的GPUs带宽被利用。
在这篇论文中,我们提出了一种线性划分拓扑,在图2我们演示N(e.g. N=6)个GPUs如何去收集梯度。
图2(从上到下,是数据流没移动一次后,数据分布情况)
在线性划分拓扑中,我们把模型和模型的梯度划分N/2 partitions,然后给每个partition分配一个GPU。在每个周期,每个partition被传到邻近的GPU上并与之合并,同时保证N/2个数据流不相交。在N-1个周期结束后,每个partition收集了该partion在所有GPU上的梯度,然后更新梯度到模型partion。分发阶段分发最新模型到所有GPUs。
线性划分拓扑性能可以按照下面方法估计。假定T0是在2GPUs之间拷贝整个模型的时间,然后在N个GPUs之间交换一个mini-batch的参数所需要的时间如等式1。所以参数交换时间有个上界4 T0 ,因此线性划分是比较容易的扩展到8或者更多GPU
3 CPU集群架构
3.1 应用需求
Mariana还包含一个基于CPU集群的分布式DNN架构。DNNCPU集群的目标是支持两类应用:1. 拥有占用大量内存的大模型,适合进行mini-batch计算,还拥有大量的训练数据,对于这类应用,要同时做到模型并行和数据并行,CPU集群适用于这种场景。2.已有的基于CPU训练的应用。通过分发数据,只需要很小的改动,就可以变成分布式的版本。
3.2 APIs和架构
DNN CPU集群架构引入了节点与消息的抽象,采用BSP(Bulk Synchronous Parallel)编程范式。一个节点可以是一个神经单元、或者一组连续的神经单元、甚至是整个DNN模型。节点的API包括一些方法,用来支持在参数交换中,梯度的序列化和参数的反序列化。CPU集群中的DNN作业,是通过多轮异步SGD来训练的。
客户端命令行工具用来提交DNN作业,资源管理系统调度master、workers和参数服务。其中,master负责把训练数据拆分成多个任务,在workers间调度任务,做容错。还要通过心跳管理作业、任务、workers的状态,并把状态记录到数据库中。master会收集worker和参数服务器的counter。WebUI与master连接,展示DNN作业的状态和counter。在一组worker中要选出一个coordinator,通过BSP范式,在worker间的每一个mini-batch中,协调模型参数的传递。worker负责真正的计算工作,并在一组worker间传递消息,以支持模型并行。每一个参数服务器保存一部分模型,然后通过与相关的worker交互,收集梯度,并更新最新的模型。参数服务器定期会把模型写入分布式文件系统来做持久化
4 应用和评估
Mariana当前被应用到语音识别、图像识别和广告CTR预估上。GPU服务器配置如下:
4-6NVIDIATesla K20c GPUs(4.8GB 内存) 、2个8-core Intel(R)Xeon(R) CPU E5-2640 v2 @2.00GHz、48GB内存、4Seagate 2 TB SATA 硬盘(使用RAID5阵列)。在语音识别中一台服务器中使用6GPUs,而在图像识别中使用4GPUs
4.1 语音识别
语音识别当前被用在腾讯的微信,比如:微信中的语音输入、语音开放平台、翻译语音
到文本。对于语音输入,用户对微信讲话,然后获取相应的文本信息并发送给朋友。对于开放语音平台,第三方公司可以集成语音识别功能到他们自己的产品中。对于翻译语音到文本,用户按住接收到的语音,然后它自动转化成文本。
当前Mariana已经成为微信中使用各种语音识别功能的基石, multi-GPU数据并行为主,CPU集群为辅。ASR主要包括声音模型、语言模型、解码器。声音模型是通过深度网络能更有效的扑捉声音信号分布。在训练声音模型时候,我们使用了一个包括616输入节点、4个隐藏层、一个softmax输出层(包括16000节点)深度网络,该网络包括5000万个参数。为了使深度网络训练稳定,需要亿级别的样本。
4.2 图像识别
图像识别在腾讯里面主要是应用在微信中,然后我们是以ImageNet作为一个基准。在
Mariana中,我们主要使用multi-GPU 的模型并行和数据并行框架去训练深度CNNs。我们通过Mariana在ImageNet 2012训练集上(120w图片,大于1000个不同类别)去训练模型。通过使用模型并行和数据并行,我们考虑了4中不同的配置情况去观察影响并行的因素。
用我们的深度CNN架构,2GPUs(模型并行)的速度是单GPU的1.71倍。4GPUs(使用模型并行和数据并行)加速了2.52倍。对于4GPUs(数据并行),加速是2.67。
5 相关工作
一些其他的框架也被使用加速深度学习。比如:
Google DistBelief是一个CPU集群,采用的是数据并行和模型并行去训练深度网络,该框架大约包括10亿参数,1万个CPU。DistBelief提供了DownpourSGD和Sandblaster L-BFGS ,被使用去训练语音识别和2.1w个ImageNet分类。
Krizhevsky设计的深度卷积神经网络能够获得Top5的错误率在LSVRC-2012 1000-category,该框架使用的2GPUs模型并行,并使用了Cuda-Convnet,Cuda-Convnet是一个开源工具包,支持单GPU。Cuda-Convnet2对于多GPUs提升了性能,但是目前没有开源。
Google COTS HPC系统使用的数据并行和模型并行GPU服务器,这些服务器是使用Infiniband和MPI互联。COTS用3台GPU服务器在几天时间内处理10亿个参数网络。
Facebook multi-GPU深度卷积网络(CNN)使用的数据并行和模型并行去训练CNN模型
一些开源的工具包如下:
Caffe提供了快速的CNN训练,以及深度网络学习算法。每天能够处理超过4000万张图片,用的GPU型号是NVIDIA K40 或者TitanGPU
Kaldi是一个语音识别工具包,采用的c++和CUDA代码,运行在CPU或者GPU
Theano是一个python库,能改运行在CPU或者GPU上