《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的同志可以去看看原文。