mthoutai

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

引子

转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/46676515

又是好久没写博客,记得有一次看Ng大神的訪谈录,假设每周读三篇论文,那么经年以后,必定成为对某个领域非常熟悉的人。

可惜,在忙忙碌碌中,我居然做不到这一点。

可是,我眼下的打算是尽心尽力的去做,哪怕一周仅仅读一篇呢。

胡适先生曾说过:“怕什么真理无穷,进一步有进一步的欢喜”。然而。这当中的差别在于,我还没有达到追求真理的高度,我就是想看看这个技术是咋子回事塞。

我想。对于非常多像我这样非科班出身自己学ML的人来说,肯定有非常多时候感觉自己对ML的理论推导之类的事情捉襟见肘,尽管非常多时候想下狠心自己去恶补一下数学啥的,然而却并没有什么卵用。不得不承认,有些东西还是得有人指点才干一步一步扎实的往下学。自己无头苍蝇般瞎学非常快便会耗尽精力与热情,我想这恐怕就是读博的必要性了吧。

然而对于仅仅想安静的做一个程序猿的我来说。换一个角度思考一下,假设要做一个出色的程序猿的话,事实上过多的理论恐怕也是不须要的。多了解一些算法的实现也许更有优点。

所以。我认为本片博客更偏向于有用。由于它并不是在理论上做了大的改进而提高的效果,而是一个分布式机器学习算法的实现。

Adam

关于Adam的报道,參见[3].

本片博客是阅读论文所得的笔记,论文中得配图均来自与论文,论文名称见參考文献[1].

Adam是微软研究院的深度学习项目,该项目仍然是应用卷积神经网络进行图像分类,效果提高了非常多,但从我读论文的角度看,adam更偏向于分布式框架的实现,而非理论的创新。自Alex和Hinton在2012年发出[2]以后,事实上卷积神经网络的核心并没有大改,然而将卷积神经网络从学术界引领到工业界。我认为adam的贡献匪浅。

那么,为什么须要adam这种框架呢?

  1. 机器学习方法一箩筐,但仅仅有卷积神经网络能够hold住图像,由于图像语音类的数据太难提取特征所致。
  2. 卷积神经网络早就出现,为何如今才发挥威力,主要得益与计算能力的提升。
  3. 要想得到好效果,想在的计算能力还不够,必须得大数据+大模型才好。所以为了解决大模型日益增长的计算能力需求和如今挫挫的计算机之间的矛盾,adam横空出世,没有条件创造条件也要上。把数十上百台机器有效的连接起来,形成强大的计算能力。

ok,话不多说,软话说完,開始说技术吧,如有纰漏,还望指正。

Architecture

Adam框架仍然基于Multi-Spert架构,这个架构的大体含义就是将集群分为例如以下几个部分:

  1. 数据服务类。存储数据,数据备份。

    向计算节点提供数据。

  2. 训练模型类。训练模型,然后更新參数。
  3. 參数server。维护一个共享的模型,计算节点计算完毕后,能够向參数server发送请求更新參数。

Data Serving

有专门的server用作提供数据,这些server在提供数据的同一时候还会提前对图像做一些变换(反转、倾斜等)。

在提供数据的时候,使用预加载内存的方式进行加速。使用后台进程进行异步I/O把将被訪问的图像预先成批加载进内存。使得将被訪问的图像一直处于内存中。

Model Training

adam训练的仍然是Alex提出的那个模型,五个卷积层搭配三个全连接层。在adam中,将这些模型垂直切分。

例如以下所看到的:

img

Multi-threaded Training

单台机器上的模型都是多线程训练的,这些线程共享一个模型參数。

在执行过程中,每一个线程被分配不同的图片进行训练。

然而每一个线程的上下文的运算环境(包含正向计算和反向传播)都是单独的,上下文运算环境被预先分配好来防止堆锁。

上下文环境和每一个线程的中间结果的缓存都使用NUMA-aware分配空间来降低cross-memory bus traffic。

Fast Weight Updates

为了加速训练,对共享的模型參数的局部更新是不加锁的。每一个线程都计算权重更新值然后直接更新模型。

当然,这会导致不一致性,但实验证明。这种更新方式仍然能够收敛。

收敛的原因可能是由于神经网络的弹性能够hold住这种不一致所带来的噪声。

后面还会提到,可能正是由于这种噪声,使得模型的泛化能力更加强大。

Reducing Memory Copies

由于模型的数据须要在层与层之间传递,而模型又是被切分的。故而非常多数据的传送是非本地的。

对于本地传送,传递指针而非值。

对于非本地传送,构建了基于windows socket API的网络库,加速数据传送,详细信息不详。

使用了静态模型切分来优化模型间须要传递的信息量。

(静态模型切分是啥?)

使用引用计数来保证异步网络IO的安全性。

Memory System Optimization

对模型进行切分,直到单次训练的内存能够Fit到L3缓存中。

L3缓存比主存在浮点数单元上的使用上更不受内存带宽的影响。

前向计算和反向传播的计算都有非常好的计算上的局部性需求,因而。将数据打包然后使用矩阵运算更easy利用局部性和浮点计算单元。

Mitigating the Impact of Slow Machines

即便机器的配置是一样的,在模型运算过程中仍然会有快慢之分。

为了避免快机器上的线程被慢机器上的线程拖累。同意线程并行的处理多张图像,使用一个数据流框架,当数据到来时,触发一张图像上的处理流程。

每次迭代结束的时候,往往须要等待全部图像都处理完然后再在验证集上计算错误率再决定下次迭代是否须要。

然而这就麻烦了。须要等待最慢的机器也跑完。故而。设计了一种策略,在75%的图像处理完之后,就開始评測模型。并觉决定是否有下次迭代。

在75%设定之后,使用随机化方法保证相同的集合下次不能被跳过。这种策略能够加速20%以上。

Parameter Server Communication

设计了两种模型更新方法:

  • 本地计算參数更新值,当处理k张图像后。向parameter server发送更新请求,然后parameter server直接更新參数。这个方案对卷积层比較适合。由于卷积层的參数有非常多都是共享的。

    对于全连接层,有太多的权重须要更新了,这种方式消耗太大。

    须要採用以下的方法。

  • 与其传送參数更新。不如传送激活值和错误梯度向量。然后激活值和错误梯度向量在parameter server上进行矩阵计算得到权重更新。

    这样就将M×N的数据传送量变为k×(M+N)。这样做的第二个优点就是将有些计算搬到parameter server上来,增强了系统的平衡性。

Global Parameter Server

Parameter Server的架构例如以下,这是一个标准的传统分布式的k-v存储结构。可是对于要训练卷积神经网络来说,參数的更新速度太快了,还须要优化。

img

Throughput Optimizations

模型的參数被切分成1M大小的shards。这些shards被哈希到不同的存储桶中。然后平均的分到各个參数server中。

这个方案添加了空间局部性,更新时也易于负载均衡。

批量更新參数。故意于局部性。缓解了L3的压力。

參数server使用SSE/AVX指令。全部的处理都是NUMA aware。(这条我并不清楚说的是啥,和硬件相关)。

使用无锁的队列结构和哈希表结构来加速网络传输、更新和硬盘IO处理。

通过内存池实现了无锁内存分配。

Delayed Persistence

为了增大吞吐量。将持久化从更新过程中去耦合划分出来。參数存储被建模成为一个回写缓存,脏数据块被后台异步的回写回去。

部分的数据丢失也是可容忍的,由于DNN模型有弹性嘛。然而。对于丢失的数据。非常easy能够又一次训练出来。

延迟持久化还能够同意压缩回写,由于參数更新的可加性。缓存更新非常多轮后。才有一次回写也是能够的。

Fault Tolerant Operation

每一个參数都是三份缓存。这些參数server的分配信息保存在一个參数server控制器的机器上。

控制器和參数server通过心跳同步。

在參数更新时,备份server和主server通过心跳同步。

当有一台机器丢失心跳后。控制器又一次选择主server。

Evaluation

在ImageNet全部的22000个类上进行实验,使用top-1准确率进行评估。

Model Training

在没有參数server的情况下。训练模型,看看每秒钟能够训练多少链接。能够看到。加速比是超线性的,由于机器越多。内存越大。数据在内存中,自然快。

img

Parameter Server

加上參数server后,再看看加速比情况。

能够发现。加速比比纯本地计算要少。但克服了8机器时的权重更新方法遇到的瓶颈。

img

Scaling with more workers

将用于训练的机器增多,查看加速比。用于训练的机器增多。保证每台机器上的參数数目不变。增大模型大小。从而机器数目增多,但由图可见,网络上的通信并未影响加速。

img

Scaling with more Replicas

模型大小不变,但增大參数的副本数目,也就是说,数据的并行化变大了。

看看加速情况。

img

performance

效果例如以下,提升大大滴。随着模型变大,效果也变得越好。

img

img

总结

论文的主要贡献:

  1. 通过设计系统,优化和平衡计算和通信。最小化分布式模型的内存带宽使用和机器间的通信。
  2. 利用机器学习训练过程对不一致性的容忍,提高效果和集群扩展性。使用多线程模型、无锁更新、异步批量更新技术等提高可扩展性。另外,异步训练也有助于提高算法效果。
  3. 证明了系统性能、可扩展性和异步训练都有助于提高模型准确率。使用少于30台机器训练了一个20亿连接的模型。在ImageNet的22000类数据上达到两倍于之前的准确率,数据足够的情况下。模型越大,效果越好。

參考资料

[1]. Chilimbi T, Suzue Y, Apacible J, et al. Project adam: Building an efficient and scalable deep learning training system[C]//11th USENIX Symposium on Operating Systems Design and Implementation (OSDI 14). 2014: 571-582.

[2]. Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.

[3]. http://www.tuicool.com/articles/IbAZFb

posted on 2017-07-24 16:02  mthoutai  阅读(2590)  评论(0编辑  收藏  举报