用spark训练深度神经网络

SparkNet: Training Deep Network in Spark


这篇论文是 Berkeley 大学 Michael I. Jordan 组的 ICLR2016(under review) 的最新论文,有兴趣可以看看原文和源码:papergithub
.

训练深度神经网络是一个非常耗时的过程,比如用卷积神经网络去训练一个目标识别任务需要好几天来训练。因此,充分利用集群的资源,加快训练速度成了一个非常重要的领域。不过,当前非常热门的批处理计算架构(例如:MapReduce 和 Spark)都不是设计用来专门支持异步计算和现有的一些通信密集型的深度学习系统。

SparkNet 是基于Spark的深度神经网络架构,

  1. 它提供了便捷的接口能够去访问Spark RDDs;
  2. 同时提供Scala接口去调用caffe;
  3. 还拥有一个轻量级的tensor 库;
  4. 使用了一个简单的并行机制来实现SGD的并行化,使得SparkNet能够很好的适应集群的大小并且能够容忍极高的通信延时;
  5. 它易于部署,并且不需要对参数进行调整;
  6. 它还能很好的兼容现有的caffe模型;

下面这张图是SparkNet的架构:

从上图可以看出,Master 向每个worker 分发任务之后,各个worker都单独的使用Caffe(利用GPU)来进行训练。每个worker完成任务之后,把参数传回Master。论文用了5个节点的EC2集群,broadcast 和 collect 参数(每个worker几百M),耗时20秒,而一个minibatch的计算时间是2秒。

Implementation

SparkNet 是建立在Apache Spark和Caffe深度学习库的基础之上的。SparkNet 用Java来访问Caffe的数据,用Scala来访问Caffe的参数,用ScalaBuff来使得Caffe网络在运行时保持动态结构。SparkNet能够兼容Caffe的一些模型定义文件,并且支持Caffe模型参数的载入。

下面简单贴一下SparkNet的api和模型定义、模型训练代码。

并行化的SGD

为了让模型能够在带宽受限的环境下也能运行得很好,论文提出了一种SGD的并行化机制使得最大幅度减小通信,这也是全文最大了亮点。这个方法也不是只针对SGD,实际上对Caffe的各种优化求解方法都有效。

在将SparkNet的并行化机制之前,先介绍一种Naive的并行机制。

Naive SGD Parallelization

Spark拥有一个master节点和一些worker节点。数据分散在各个worker中的。

在每一次的迭代中,Spark master节点都会通过broadcast(广播)的方式,把模型参数传到各个worker节点中。

各个worker节点在自己分到的部分数据,在同一个模型上跑一个minibatch 的SGD。

完成之后,各个worker把训练的模型参数再发送回master,master将这些参数进行一个平均操作,作为新的(下一次迭代)的模型参数。

这是很多人都会采用的方法,看上去很对,不过它有一些缺陷。

Naive 并行化的缺陷

这个缺陷就是需要消耗太多的通信带宽,因为每一次minibatch训练都要broadcast 和 collect 一次,而这个过程特别消耗时间(20秒左右)。

令 Na(b)
表示,在batch-size为 b
的情况下,到达准确率 a
所需要的迭代次数。

令 C(b)
表示,在batch-size 为 b
的情况下,SGD训练一个batch的训练时间(约2秒)。

显然,使用SGD达到准确率为a所需要的时间消耗是:

Na(b)C(b)

假设有K个机器,通信(broadcast
和 collect)的时间为 S,那么Naive
并行 SGD

的时间消耗就是:

Na(b)(C(b)/K+S)

SparkNet 的并行化机制

基本上过程和Naive 并行化差不多。唯一的区别在于,各个worker节点每次不再只跑一个迭代,而是在自己分到的一个minibatch数据集上,迭代多次,迭代次数是一个固定值τ。

SparkNet的并行机制是分好几个rounds来跑的。在每一个round中,每个机器都在batch size为b
的数据集上跑 τ
次迭代。没一个round结束,再把参数汇总到master进行平均等处理。

我们用Ma(b,K,τ)
表示达到准确率 a
所需要的 round 次数。

因此,SparkNet需要的时间消耗就是:

Ma(b,K,τ)?(τC(b)+S)

下面这张图,很直观的对比了Naive 并行机制跟 SparkNet 并行机制的区别:

Naive 并行机制:

SparkNet 并行机制:

论文还做了各种对比实验,包括时间,准确率等。实验模型采用AlexNet,数据集是ImageNet的子集(100类,每类1000张)。

假设S=0,那么τMa(b,K,τ)/Na(b)
就是SparkNet的加速倍数。论文通过改变τ
和 K
得出了下面的表格(使准确率达到20%的耗时情况):

上面的表格还是体现了一些趋势的:

(1). 看第一行,当K=1,因为只有一个worker节点,所以异步计算的τ这时并没有起到什么作用,可以看到第一行基本的值基本都是接近1.

(2). 看最右边这列,当τ=1,这其实就相当于是Naive
并行机制,只不过,Naive的batch是b/K,这里是b.
这一列基本上是跟K成正比。

(3). 注意到每一行的值并不是从左到右一直递增的。

当S!=0
的时候,naive 跟 SparkNet 的耗时情况又是怎么样的呢?作者又做了一些实验。

可以看到,当S接近与0的时候(带宽高),Naive会比SparkNet速度更快,但是,当S
变大(带宽受限),SparkNet的性能将超过Naive,并且可以看出,Naive受S变化剧烈,
而SparkNet相对平稳。

而作者实验用EC2环境,S大概是20秒,所以,显然,SparkNet会比Naive好很多。

论文还做了一些事情,比如:

令 τ=50,分别测试
K=1、3、5、10时,准确率与时间的关系;

当K=5,分别测试
τ=20、50、100、150时,准确率与时间的关系。

总结一下,这篇论文其实没有太多复杂的创新(除了SGD并行化时候的一点小改进),不过我很期待后续的工作,同时也希望这个SparkNet能够维护的越来越好。有时间的话,还是很想试试这个SparkNet的

原文链接:http://blog.csdn.net/cyh_24/article/details/50414568

时间: 2024-11-04 11:58:02

用spark训练深度神经网络的相关文章

第十一章——训练深度神经网络

上一章我们训练了一个浅层神经网络,只要两个隐层.但如果处理复杂的问题,例如从高分辨率图像中识别上百种类的物品,这就需要训练一个深度DNN.也行包含十层,每层上百个神经元,几十万个连接.这绝不是闹着玩的: 首先,需要面对梯度消失(或者相对的梯度爆炸)问题,这会导致浅层很难被训练. 其次,这么大一个网络,训练速度很慢. 最后,一个包含上百万参数的模型,存在很大过拟合的风险. 11.1 梯度消失(爆炸)问题 反向传播算法会计算损失函数关于每一个参数的偏导数,然后使用梯度下降更新参数.不幸的是,反向传播

训练深度神经网络的时候需要注意的一些小技巧【转载】

翻译网上的哈,我觉得有很大一部分从没看到过,所以就翻译了下,如有不对的地方,欢迎指正: 1:准备数据:务必保证有大量.高质量并且带有干净标签的数据,没有如此的数据,学习是不可能的 2:预处理:这个不多说,就是0均值和1方差化 3:minibatch:建议值128,1最好,但是效率不高,但是千万不要用过大的数值,否则很容易过拟合 4:梯度归一化:其实就是计算出来梯度之后,要除以minibatch的数量.这个不多解释 5:下面主要集中说下学习率 5.1:总的来说是用一个一般的学习率开始,然后逐渐的减

Neural Network and DeepLearning (5.1)深度神经网络为何很难训练

在深度网络中,不同层的学习速度差异很大.例如:在网络中后面的层学习情况很好的时候,前面的层常常会在训练时停滞不前,基本上不学习了.另一种情况恰恰相反,前面的层学习的很好,后面的层却停止学习了. 这是因为基于梯度下降的学习算法的本身存在着内在的不稳定性,这种不稳定性使得前面或者后面的层的学习停止. 消失梯度问题(The vanishing gradient problem) 在某些深度神经网络中,在隐藏层反向传播时梯度倾向于变小,也就是前面隐藏层的学习速度要慢于后面的隐藏层.这就是消失的梯度问题.

谈谈如何训练一个性能不错的深度神经网络

谈谈如何训练一个性能不错的深度神经网络 深度学习大火,将各个数据集的state of the art不断地刷新,到了开源代码一放出,有种全民皆可刷排名的节奏. 不过可别把刷数据想的那么简单,不然大家去哪发paper,怎么混饭吃= = 但是我不想发paper就想占坑刷数据怎么办,看到cifar10都尼玛刷到了95%了,我这用caffe自带的小demo才得出78%的结果,caffe你确定不是在骗我? caffe确实没在骗你= =今天我给大家介绍一下如何刷出一个性能接近paper的神经网络 以CNN为

深度神经网络可视化工具集锦

深度神经网络可视化工具集锦 雷锋网按:原文作者zhwhong,载于作者的个人博客,雷锋网(公众号:雷锋网)经授权发布.  TensorBoard:TensorFlow集成可视化工具 GitHub官方项目:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tensorboard TensorBoard 涉及到的运算,通常是在训练庞大的深度神经网络中出现的复杂而又难以理解的运算. 为了更方便 TensorFlow 程序的理

从图像到知识:深度神经网络实现图像理解的原理解析

摘要:本文将详细解析深度神经网络识别图形图像的基本原理.针对卷积神经网络,本文将详细探讨网络中每一层在图像识别中的原理和作用,例如卷积层(convolutional layer),采样层(pooling layer),全连接层(hidden layer),输出层(softmax output layer).针对递归神经网络,本文将解释它在在序列数据上表现出的强大能力.针对通用的深度神经网络模型,本文也将详细探讨网络的前馈和学习过程.卷积神经网络和递归神经网络的结合形成的深度学习模型甚至可以自动生

深度学习实践系列(2)- 搭建notMNIST的深度神经网络

如果你希望系统性的了解神经网络,请参考零基础入门深度学习系列,下面我会粗略的介绍一下本文中实现神经网络需要了解的知识. 什么是深度神经网络? 神经网络包含三层:输入层(X).隐藏层和输出层:f(x) 每层之间每个节点都是完全连接的,其中包含权重(W).每层都存在一个偏移值(b). 每一层节点的计算方式如下: 其中g()代表激活函数,o()代表softmax输出函数. 使用Flow Graph的方式来表达如何正向推导神经网络,可以表达如下: x: 输入值 a(x):表示每个隐藏层的pre-acti

深度神经网络DNN的多GPU数据并行框架 及其在语音识别的应用

深度神经网络(Deep Neural Networks, 简称DNN)是近年来机器学习领域中的研究热点,产生了广泛的应用.DNN具有深层结构.数千万参数需要学习,导致训练非常耗时.GPU有强大的计算能力,适合于加速深度神经网络训练.DNN的单机多GPU数据并行框架是腾讯深度学习平台的一部分,腾讯深度学习平台技术团队实现了数据并行技术加速DNN训练,提供公用算法简化实验过程.对微信语音识别应用,在模型收敛速度和模型性能上都取得了有效提升--相比单GPU 4.6倍加速比,数十亿样本的训练数天收敛,测

深度神经网络在量化交易里的应用 之二 -- 用深度网络(LSTM)预测5日收盘价格

    距离上一篇文章,正好两个星期. 这边文章9月15日 16:30 开始写. 可能几个小时后就写完了.用一句粗俗的话说, "当你怀孕的时候,别人都知道你怀孕了, 但不知道你被日了多少回 " ,纪念这两周的熬夜,熬夜.  因为某些原因,文章发布的有点仓促,本来应该再整理实验和代码比较合适.文章都是两个主要作用: 对自己的工作总结, 方便自己回顾和分享给有兴趣的朋友. 不说废话了, 进入正题. 本次的课题很简单, 深度神经网络(AI)来预测5日和22日后的走势. (22日尚未整理, 不