在GPU上 训练ANN的优化方法

《Distributed Neural Networks with GPUs in the AWS Cloud》

原文链接:http://techblog.netflix.com


这篇文章应该是Netflix对利用AWS进行ANN分布式训练的一个介绍,虽然主题是ANN,但大部分内容主要是在讲如何对模型进行分解以适应分布式的训练,和如何优化计算 以缩短训练时间,感觉适用于很多分布式应用,而不仅限于ANN的训练。

文中提到Ng 仅用了3台机器用了几天时间就完成了 大规模的模型训练,并且其规模是猫脸模型的6.5倍。猫脸模型就是大名鼎鼎的google大脑,当时是用了1000台共16000个核的计算机。这个提升是怎么做到的?其中一点原因是从CPU升级到了GPU ,其他原因文中没有明确说明。个人认为还有一个可能是 :猫脸模型是首个最接近人脑模型,刚开始估计以功能为主,没有作过太多优化,这也给后续的提升留了大量空间。


分布式训练的三个层次


文中将模型训练过程分解为三个层次,在这三个层次上进行分布式训练:


1.层1 不同区域 进行并行训练;

  这个容易理解。比如Netflix在许多国家开展业务,但不同国家的用户偏好是不同的,因此需要训练不同的模型,

  这些模型是独立的,因此可以并行训练;


2. 层2 不同 hyperparameter组合 进行并行训练;

    这个是本文重点讲的,后面有介绍。


3. 层3 模型本身 拆分成多个模块进行并行训练;

    这里特别提到了ANN 训练需要大量的交互,因此该层次的训练尽量集中在GPU内,

     避免分布在不同的计算机上(因为计算机间的通信开销远大于核间通信开销)。


下面的伪代码表示了这三层训练的逻辑关系:

for each region -> level 1 distribution

 for each hyper-parameter combination -> level 2 distribution

  train model -> level 3 distribution

 end for

end for


基础设施的优化

结合GPU特性对基础设施进行优化,这项优化与特定的问题域无关,所有运行在GPU上应用都可以进行该类优化。

1.GPU  库函数优化实现;

2.PCI配置空间 相关参数修改,提高数据访问效率。

3. 其他优化,如把不同的计算步骤融合在一起,减少内存访问。 

优化1和优化2 文中给出了实测数据:

  KernelMulC npps_MulC
CheckPCI=1 3.37 103.04
CheckPCI=0 2.56 6.17

第二行就是优化2中参数修改的效果;

第一列数据是使用自己实现的乘法函数 的开销;

第二列 数据 为使用系统库自带的乘法函数 的开销;

不知道优化2具体是什么原理?推测一下 ,貌似是改变核访问内存的总线路径。


感觉这部分基础设施的优化 需要了解芯片及其编程模型和低层库函数,嵌入式开发的经验在这里倒是很有用武之地。 ^_^   

由此也能看到 机器学习(特别是工业界) 确实是一个从理论到实践,从系统架构到底层芯片 包罗万象的领域。



超参数(hyper-parameter)选择的优化

模型训练涉及2个过程:1. 从不同的超参数组合中选出 最优或接近最优的一组;2. 再基于这组超参数进行模型训练。这里的超参数选择过程 就是上面说的第二层分布式训练,

最直接的思路就是遍历所有超参数组合选出最优的一组,但这么做应该是不现实的吧,个人理解在实际应用中几乎没有 遍历的算法 是能直接应用的,特别是在这么海量的数据

应用中。文中就采用了贝叶斯优化方法,把超参数选择作为高斯过程来采样,既避免了不可能完成的遍历,同时 也 可以保证所选的超参数组合具有足够的代表性。

(采样  确是应对大规模数据和计算的法宝,其他如玻尔兹曼机 和一些基于能量的模型的训练 也是使用了采样方法)


再后面是如何在AWS实现分布式调度的介绍,因为没接触过AWS,这部分涉及到了相关的实现,没怎么看明白,了解AWS的同志可以去看看原文。



你可能感兴趣的:(分布式,机器学习,AWS,嵌入式系统)