训练大规模神经网络并行计算平台.docx
《训练大规模神经网络并行计算平台.docx》由会员分享,可在线阅读,更多相关《训练大规模神经网络并行计算平台.docx(15页珍藏版)》请在冰豆网上搜索。
训练大规模神经网络并行计算平台
训练大规模神经网络的并行计算平台
摘要:
人工神经网络(ANN)已能成功地应用于各种模式识别和数据挖掘中。
然而,在大规模数据集上训练人工神经网络会导致数据密集和计算密集。
因此,为了获的更高的精度,大规模人工神经网络会有保留的进行耗时训练。
在本文中,我们提出cNeural方法,自定义一个并行计算平台,用逆传算法加速训练大型神经网络。
不同于许多并行神经网络训练系统作用于数千个训练样本,cNeural可以加快训练拥有数百万个训练样本的大规模数据集。
为了实现这个目标,首先,cNeural用HBase存储和并行加载大规模数据集。
第二,为了进行快速迭代训练,它提供了一个并行内存计算框架。
第三,我们选择一个紧凑的事件驱动消息通信模型,而不是传递即时消息的心跳轮询模式。
实验结果表明,cNeural中的数据加载和消息传递的开销时间成本非常低,并且cNeural比基于HadoopMapReduce解决方案的速度快50倍左右。
它还实现了线性的可伸缩性和良好的负载平衡。
关键字:
并行计算;神经网络;大数据;快速训练;分布式存储
1引言
人工神经网络(ANN)已应用于各种数据挖掘和模式识别中,如蛋白质结构分析、语音识别、,手写识别、图像和信号处理[1]。
然而,训练大规模神经网络时会出现计算密集和数据密集。
一方面,整个训练工作流程通常需要进行成千上万次的训练步长迭代,这会导致昂贵的计算。
另一方面,为了得到可靠的结果,大规模训练数据集通常用于应用程序。
因此,在单一PC机上训练大规模神经网络通常是非常耗时的,有时需要几天或者几周完成,有时甚至不可能完成。
因此,大规模神经网络的低训练速度慢限制了它们处理实际应用中复杂和有价值的问题。
另一方面,现实世界的数据量早在前几年就已经爆炸,并且在许多相关领域里,分析大数据已变得相当受欢迎[2]。
大数据的情况也适用于神经网络[3]。
从直觉讲,大家普遍认为训练大规模样本比训练少量的样本效果好。
因此,对于那些基于神经网络的应用程序,训练大规模神经网络在实现最高精度和结果中起着重要的作用。
在本文中,我们设计和实现cNeural方法,一个为训练大规模神经网络而自定义的并行计算平台。
在cNeural中,训练工作流分为两个阶段:
加载训练数据和执行训练流程。
为了减少数据加载的时间成本,我们把大规模训练数据集存储在HBase中,必要时通过集群会同时加载其中的一个数据到计算节点的内存中。
此外,为了加快迭代训练会采用一个并行内存计算框架。
在整个训练过程中,为了合作和进一步的处理,计算节点之间需要相互沟通。
在cNeural中,我们采用ApacheAvroRPC建立一个事件驱动的消息传递通信框架,ApacheAvroRPC有较高的通信效率并且数据结构丰富。
我们的平台可以部署在商品硬件,AmazonEC2,甚至是pc机之间的网络互联。
本文分八个部分。
第二节描述了相关工作。
第三部分,提出基于反向传播训练算法的神经网络的背景。
第四部分,介绍并行训练框架和cNeural算法。
第五部分,描述用于支持快速训练的数据存储机制。
第六部分,说明cNeural中的体系结构概述和主要组成部分。
第七部分作出评估。
第八部分总结全文。
2相关工作
许多研究人员一直致力于在并行或分布式计算系统上实现计算上开销很高的ANN算法。
相关工作可以追溯到上个世纪的70年代并且现在这个领域的研究依然保持增长。
在早期,研究人员喜欢用特殊用途的硬件来提高训练速度,这些硬件被分为神经元硬件和神经计算机[6]。
Glesner和Pochnuller[11]在他们的书中提出这种特殊用途硬件的概述。
应用特殊用途的硬件可以实现快速和高效的运行。
但是,它们几乎不具有灵活性和可伸缩性。
在上世纪90年代以后,在普通用途的框架上设计并行神经网络成为了主流[12],[13],如并行计算模型或网格计算模型。
这些系统大多应用于集群和多处理器计算机上。
但是,以前的工作在管理大规模训练数据集上并没有做出太多的努力。
他们通常致力于怎样使神经网络训练并行化以及只在数千个训练样本和兆字节大小的数据上执行实验。
近年来,许多研究人员在大数据上研究训练神经网络。
[10]用HDFS存储大型数据集并且用MapReduce方法训练它们。
然而,Hadoop适用处理离线数据密集型的问题而不适用于处理计算密集型问题。
因此,在Hadoop上训练神经网络的速度是缓慢的。
GPU也被用于人工神经网络训练,但是训练数据集的大小受限于GPU的全局内存[16]。
文献[18]利用大规模的无监督学习可以从无标签数据中提取特性。
他们在训练算法上花费很多努力,如模型并行机制和异步随机梯度下降。
与以上的研究相比,cNeural不仅考虑了能加速神经网络训练的并行算法,而且对大数据的管理可以更好地支持并行算法的快速运行作出很多努力。
由于Hadoop并不适用于迭代处理,很多研究提出了改进的方法,如Twister[19]和HaLoop[20]。
他们试图降低初始化工作中的时间成本以及迭代节点之间的数据缓存。
[21]提出Spark方法,一个完全新的内存计算的并行分布式系统。
与这些处理引擎相比,cNeural也实现了并行神经网络训练算法。
cNeural中底层的处理引擎也支持内存计算。
此外,我们为了更好的支持一流算法和应用程序而采用自定义的执行程序。
3背景
在本节中,简要介绍神经网络训练中的反向传播算法。
利用多层感知器作为一个典型的例子来描述训练算法。
前馈反向传播神经网络[4]是现在最流行的一种神经网络构架[5]。
[4]中证明了被反向传播算法训练的三层前馈神经网络可以逼近任何连续的有任意精度的隐层神经元的非线性函数,如多层感知器。
因此,本节介绍一个与三层前馈感知器的描述相关的算法。
三层感知器的结构如图1所示。
它包括一个输入层、隐藏层和输出层。
同一层的神经元不相通,而相邻层的神经元的权重和偏差完全相连。
基于梯度递减技术的反向传播(BP)[31]是一种监督训练多层前馈神经网络的算法。
反向传播算法有两个阶段:
前期阶段和后期阶段。
在前期阶段中,输入层接收输入信号并且给隐藏层的每个神经元传播信息。
然后,隐藏层局部的处理这些信息,并把这些信息传播给输出层。
例如一个输入向量
隐藏层中每个神经元的输入和输出信息,表示为
和
定义如
(1)和
(2)所示。
(1)
(2)
其中,
表示输入神经元
和隐藏神经元
之间的权重,
指偏差。
输入层也需要处理从隐藏层得到的输入信息,输入层中每个神经元的输入
和输出
是用(3)和(4)计算:
=
(3)
(4)
其中,
是隐藏神经元
和输出神经元
之间的权重,
是偏差。
这是前期过程中一次性通过信息的结束。
权重
和偏差
在前期阶段
值不会改变。
如果神经网络的实际输出等于输入向量的预期输出,那么就把一个新的输入向量放入神经网络中并且重新启动前期阶段,否则算法进入后期阶段。
实际输出和预期输出之间的差异被称为误差。
在后期阶段,输出层中神经元
的误差用公式(5)计算。
然后,隐藏层中神经元
的误差用公式(6)计算。
(5)
(6)
输出层和隐藏层之间的误差逆向传播并且层与层之间的连接权重用(7)式中的逆向误差更新。
使用(8)式更新隐含层和输入层之间的权重。
(7)
(8)
在上面的公式中,其中
;
;
。
和
是0到1的学习参数。
是训练步长ID.
一般来说,BP算法有两种权重更新模式:
在线模式和批处理模式。
在线模式中的训练样本是逐个处理的,而批处理模式的所有训练样本是成批处理的。
在一个训练步长中每个样本生成的
逐渐积累(
表示两个训练步长中
和
值的改变)。
在此之后,累计
被用于更新链接层之间的权重。
这个训练工作一直持续到满足终止条件。
采用的主要终止条件是均方误差低于特定的阈值或训练步长所到达的有限值。
为了计算总误差,整个训练数据集需要通过神经网络传播。
这样会使反向传播算法在处理大型训练数据集时出现训练慢速度的结果。
4在CNEURAL中的并行神经网络训练算法
在本节中,我们首先分析了广泛使用的并行训练策略。
然后,介绍cNeural中的并行训练算法及并行计算框架。
A.分析训练神经网络中的并行化策略
有很多并行方法可以加速训练神经网络[6]。
大多数的方法可以分为两类:
节点并行性和训练数据集并行性。
节点并行性是神经网络定向的。
这些方法通过映射神经元到不同的计算神经节点而实现并行性。
每个计算节点只负责计算一部分神经网络。
[7],[8],[9]中提出的方法采用这种方式。
相反地,在训练数据集并行性时,每个计算节点在局部范围类有一个完整的神经网络并且对整个神经网络进行计算。
为了并行计算,训练数据集分成若干子集,而且这些字集被分配成不同的计算节点。
不同的并行化方法适合于不同的场景中。
对于节点的并行性,每一个训练样本需要逐步处理节点之间的计算。
它通常用于小型训练数据集和复杂的神经网络结构。
这种方法适合应用在通信成本较低的多核或众核架构中。
当应用在拥有大量训练样本的分布式系统中,系统承受不起I/O的超负荷开销和集群网络通信成本。
由于I/O和网络通信是分布式环境的主要时间成本,因此这种方法不是非常高效的。
因此,可节点并行性方法并不适用于分布式计算环境中。
文献[10]中也得出类似的结论。
在另一方面,对训练数据的并行性来说,每个训练数据子集是一个计算节点上处理的,并且在整个训练过程中不需要传给其他的计算节点。
由于训练数据集并行方法可以减少数据访问和网络通信的成本,因此它适用于处理分布式系统中大规模训练数据集。
B.cNeural中的并行BP算法和计算框架
cNeural是一种训练大规模数据集的方法。
为减少访问和转移训练数据的时间成本,我们采用训练数据集并行机制作为基本的并行方法。
根据训练数据集并行性方法,我们构建了一个分布式的并行计算框架,用它实现批处理模式的反向传播算法。
这种并行计算框架是一个典型的master-worker并行模型。
它包括一个主节点和n个作为副节点的计算节点。
主节点的主要负责协调整个训练过程。
实际的训练过程就是运算计算节点。
在训练之前,就把训练数据集的子集分布给计算节点。
每一个计算节点包括整个神经网络并且负责训练其范围内的训练子集。
cNeural中的并行训练算法如图2所示。
如图2所示,首先,需要初始化主节点和计算节点。
初始化阶段之后,主节点向计算节点传送初始权重
。
当收到
时,每个计算节点同时对其范围内的训练数据子集执行训练任务。
在前期阶段和后期阶段,它都要处理子集中的每个样本。
在就地训练中,每个计算节点需要积累每个训练样本自己
。
当完成自己的训练任务后,每个计算节点把训练数据子集的
发送给主节点。
在主节点端,当接收完所有计算节点的
之后,它把所有的
应用于前一阶段的
中并更新这些权重。
整个训练过程是迭代的。
最终,再检查训练终止条件是否满足。
如果满足终止条件,整个训练过程就终止,否则开启下一个训练阶段。
5训练数据的存储和加载
大规模训练数据集的加载和转移的时间成本是整个训练过程的主要开销[10]。
在本节中,我们讨论cNeural中的训练数据存储机制,它支持大规模数据的快速加载和训练。
cNeural的存储模型如图3所示。
我们选择ApacheHBase存储训练数据集,它是一个模仿Google中BigTable的分布式数据管理系统。
HBase中的训练数据集以表的形式存储。
每个表包含一组训练数据集,根据数据的大小它可占据不同的区域。
对于一个训练数据集而言,每个样品都被存储为表中的一个记录,其中每个表中的记录都有相同的ID作为行健。
样本的内容依据记录的内容领域。
这种方法容易存储和管理拥有数十亿样本的大规模训练样本数据集。
在初始化训练的过程中,计算节点可以同时访问网络中不同存储节点的区域。
因此,潜在的可伸缩性和分布式的存储阶段不仅可以解决大规模数据存储的问题,也帮助降低并行数据集的数据加载时间成本。
此外,加载训练数据集之后,在成千上万个训练步长中,它被频繁访问。
在训练过程中,每个节点在内存中保留它们的训练数据子集。
我们称这个存储机制为一次加载,读很多。
为了防止数据太大而完全地保存在内存中,cNeural将它们中的部分缓存存储在聚簇内存中,以避免每次都从HBase中加载整个数据。
事实上,cNeural可以提供足够的内存存储容量来存储训练数据集。
为了避免重复地加载数据和网络传播,这种内存机制可以显著地提高训练的性能。
6系统架构和实现
A.系统概述
图4显示了cNeural的系统体系结构以及从终端用户接受训练请求时的处理工作流。
从逻辑上讲,cNeural包含四种类型的模块,包括一个客户机节点,一个主节点,n个存储节点,m个计算节点,后两项可称作工作节点。
在现实中,一台机器可以同时处理多个节点。
例如,在我们的集群中,机器可以充当存储节点和机器计算节点。
这些节点之间的网络通信依据AvroRPC。
计算节点和存储节点之间的数据存储管理和传输会受到HBase的支持。
为了更好的解释cNeural功能的主要组件,在下一节中,我们展示一个从用户发出训练请求的完整执行过程。
B.模块
1)客户机节点:
在执行cNeurald的训练工作时,用户需要通过一个简单的程序来设置一些重要的训练配置。
这些配置包括HBase中存储训练数据的表名,神经网络设置,如隐藏层的数量,每一层的神经元数目以及训练终止条件。
在完成配置之后,客户机节点打包相关的信息以生成一个训练工作并把它提交给主节点。
如果工作成功提交,客户机节点等待生成的训练状态和cNeural产生的结果。
用户可以观看客户端控制台上训练工作的在线状态。
2)主节点:
主节点是cNeural中最复杂的模块。
它负责管理和协调整个训练过程。
一旦接收到一个训练工作,主节点根据训练数据集的大小和计算节点的数量分裂成几个训练任务。
训练数据集划分成n数据子集。
每个计算节点需要负责其相应数据子集的训练任务。
在cNeural中,每台机器可以支持k计算节点。
数量k取决于机器的核数量和内存容量。
在我们的实验中,
配额是指为每个计算节点至少保留的内存容量,并且这个参数是可配置的。
在完成工作拆分和任务分配之后,主节点负责协调训练任务。
首先,它通知每个计算节点从HBase中加载相应的训练数据子集。
训练数据加载发生在平行计算和存储节点的时候。
当接到所有计算节点的数据加载的完成的回复信息后,那么主节点开始协调计算节点之间的并行训练过程。
在整个过程中,它还向客户机节点报告运行状态和最终结果。
3)计算节点:
计算节点的任务就是运行训练任务。
当从主节点收到一个训练任务请求之后,计算节点就设置神经网络并且从HBase的接口处加载相应存储节点的训练数据子集。
在此之后,就通知主节点它已完成初始化工作。
当所有的计算节点都完成了初始化工作,主节点通过向每个计算节点发送权重来开始训练工作。
在那之后,在每个训练步长中,计算节点就用训练子集上的训练步长权重来执行训练任务。
在整个训练过程中,训练数据子集就保留在计算节点的内存中。
对于每一个训练数据子集中的训练样本,计算节点先计算出
再累积起来。
计算每个计算节点上的所有累积
的平均值(表示
)并发送给主节点。
在收到所有计算节点的
之后,主节点通过把
应用到最后一个训练步长的
来更新参数。
然后主节点通过给每个计算节点发送更新的参数而开始一个新的训练步长。
当终止条件满足时,整个迭代训练过程终止并且所有与主节点和计算节点相关的资源将被释放。
4)存储节点:
在cNeural中,我们利用HBase存储训练数据集。
cNeural中的存储节点是HBase中的区域服务器。
每个区域服务器可以与计算节点独立交互。
在没有与HBase中的主节点交互的情况下,它可以控制当地训练数据给计算节点的传输。
在cNeural中,每一个训练数据集被组织成包含多个区域的一个表。
这些区域根据区域服务器存储并且根据编程APIs移到任何区域服务器。
为了提高cNeural中并行数据加载的性能,我们利用一个实用程序来平衡横跨存储节点的表地区。
C.特性
在这里,我们总结一些cNeural的关键特性如下:
•可伸缩性。
当在cNeural中添加一个新机器时,它需要从现有的机器中分担一些训练数据集。
添加更多的计算节点会减少每个计算节点的数据并加快处理速度。
•失败可恢复性。
在每个训练阶段结束的时候,cNeural就保存最近的参数到日志文件,例如权重。
各种错误可能会导致训练工作失败,如机器崩溃等故障。
在恢复过程中,cNenural只需要根据日志记录中最近的参数再重启的工作。
通过这种方法,训练工作在最近的故障点持续运行而不是从全部的擦除数据处开始。
•负载平衡。
cNeural中的计算节点是一个逻辑计算资源概念。
在现实中,一台机器根据其硬件功能可以支持多个计算节点。
另外,在异构集群中,机器依据它们的硬件资源的能力可以支持不同合适的数量。
这种方式有助于cNeural实现负载平衡。
7评价
本节中,我们详细的评估cNeural的性能。
在cNeural中,训练工作有两个阶段:
大规模训练数据加载和执行训练过程。
因此,我们分别设计两组实验来评估它们的性能。
第一组实验评估训练数据加载的性能。
第二组实验评估训练性能。
此外,我们进行一些对比实验来比较MapReduce方法的训练性能,MapReduce方法是[10]中提出的一个方法。
本文提供的执行时间是10次运行的平均时间。
A.实验设置
实验集群中有37个节点。
每一个节点配备2代Intel(R)QuadCoreE5620Xeon(R)CPU,2.4GHz,24G内存和4TB每秒7200圈的硬盘。
所有节点由1千兆以太网彼此相连。
其中,只有一个是主机器,其他的都是从机。
机器的操作系统是RedHatLinux6.0。
cNeural中HBase的版本是0.92,并且比较实验中的Hadoop版本是GB)的OpenJDK1.6运行实验。
1)数据集和神经网络配置:
对训练数据集而言,我们使用MNIST数据集,它包括200万个实验样本。
MNIST是一个手写数字的数据集。
每个数字都是一个训练模型,它包括784个正规化的特征和从0到9中分类标签。
在我们的测试中,训练数据集包含50万、100万和200万个样本并且它们的物理数据大小是1.2GB,2.4GB,4.8GB,以压缩编码存储。
在训练过程中它们需要被解码,但是解码后的大小是原来的4到5倍,大约20GB。
训练工作是在784-40-10结构上执行三层感知器,其中784表示输入层的784个神经元、40表示隐藏层的40个神经元和10表示输出层的10个神经元。
2)系统设置:
cNeural:
cNeural中的客户机节点和主节点都是在主机器上运行。
每个从机包括8个计算节点和一个存储节点。
每个存储节点由HBase中的区域服务器后台进程支持。
因此,总共有288个计算节点。
由于每个从机器的内存配置为16GB,并且每个计算节点有2GB的内存,这些空间对于存储训练数据足够了。
MapReduce方法:
主机会充当JobTracker和NameNode。
其余的36个从机作为TaskTracker和DataNode。
每台机器配置8个插槽。
还有288插槽并且每个插槽的子JVM也配置为2GB作为cNeural中的每个计算节点。
B.训练数据加载的性能
在这个实验中,cNeural分别由1、2、4,…,36个机器构成。
其内部HBase包括36区域服务器。
在数据加载过程中,计算节点并发访问HBase。
本实验用不同数量的机器(每个8计算节点)和不同大小的数据集执行cNeural。
图5中的曲线分别显示了不同大小的训练样本的加载时间。
在1台机器上测试2百万个训练样本上不能持续进行,因为内存不足以加载所有训练数据。
显然,由于输入样本的大小增加,训练数据加载的时间成本也增加。
当输入样本大小固定,加载速度随着机器数目的增加而线性增长。
这是因为内部HBase提供并发数据访问,并且当系统中的新机器增加时,它们会分享加载的训练数据集。
然而,当机器的数量增加到某一程度时(例如:
100万个训练样本需要20台机器),数据加载的性能很难进一步提升。
因为在HBase中,网络传输和I/O在存储节点的阻塞会成为瓶颈。
为了获得有效的结果,神经网络训练通常需要运行成千上万个训练步长,而且在cNeural中,计算节点只需要从HBase中加载数据一次。
图6演示了用不同的训练步长时训练数据加载的时间成本百分比。
训练数据加载的时间成本是固定的。
因此,训练数据加载时间的比例会随着训练步长的减少而增加。
用36台机器,当训练步长达到200时,训练数据加载的时间成本仅占总数执行时间的0.3%。
实验结果表明cNeural中的数据加载的时间成本很少。
C.执行训练过程的性能
执行训练过程的性能如图7所示。
我们可以看到,当有相同数量的机器时,训练50万个样本的速度是训练100万个样本的一倍,比训练200万个样本快三倍。
这表明并行算法中的时间成本同输入训练样本的数量呈线性增加。
从另一方面的角度来看,如果训练数据的大小是固定的,cNeural中的训练速度随着加入更多机器而大大增加。
对100万个训练样本来说,当机器的数目是2、4、8、16、32时,每个训练步长的时间成本分别是18.3秒,9.2秒,4.7秒,2.4秒,1.3秒,并且时间成本几乎减少一半。
这表明,cNeural的训练过程可以实现更好的加速性能。
图8显示了,当利用的机器数目不同时,每个训练步长所用的通信和计算时间成本。
当利用更多的机器时,通信时间成本的比例增加。
然而,它总是只占一小部分比例。
此外,整个执行时间仍在减少。
D.对比实验
我们比较cNeural和[10]中提出的方法的性能,它们都是训练神经网络中的大规模训练数据集。
这种方法采用HDFS来存储大规模训练数据并用MapReduce作为并行处理引擎。
对比实验时,采用相同的机器数量和相同大小的训练数据集。
下面评估了执行性能和速度可伸缩性。
1)训练执行性能:
如表1所示,在相同的条件下,cNeural实现的速度是MapReduce50倍左右。
这个改善归因于两个事实。
首先,当训练时,cNeural保留了训练数据到计算机节点的内存。
然而,在每一次的训练步长中,MapReduce方法需要重新从硬盘中加载训练数据。
第二,在消息传递时,cNerual采用事件驱动模型,而MapReduce采用心跳轮询模型。
前者使训练过程更加紧凑。
2)加速可伸缩性:
我们也测试了当有不同的机器数量时,系统的加速可伸缩性。
实验结果如图9所示。
一方面,用这个算法时,在10个节点内,它们都达到良好的加速可伸缩性。
另一方面,由于Hadoop中的工作初始化负重比cNeural大太多,MapReduce的加速方法不能像cNeural那样保持线性。
8结论和未来的工作
过去的几年已见证了数据的不断增长速度。
为了处理大规模神经网络训练问题,在本文中,我们提出了一个自定义的并行计算平台cNeural。
不同于先前的研究,cNeural是从整个架构的角度去设计和建造,从底层的分布式存储系统到并行计算框架和顶层的算法。
实验结果表明cNeural能够训练神经网络中数以百万计的样本,并且利用几十个机器时速度大约是Hadoop的50倍。
在未来中,我们计划发展和添加更多的神经网络算法,例如,为了更好的解决训练大规模神经网络中的各种问题,就在cNeural中加入深度信念网络。
最后,随着更多的技术工作完成如GUI,我们会使它成为一个工具箱并且开源它。
致谢
这项工作是中国NSF资助(序号:
),国家高技术研究和中国发展计划(863计划)(序号:
2011aa01a202)和美国英特尔大学研究实验