在深度学习这一领域经常涉及到模型的分布式训练(包括一机多GPU的情况)。我自己在刚刚接触到一机多卡,或者分布式训练时曾对其中到底发生了什么有过很多疑问,后来查看了很多资料,在这篇博客里对分布式的深度学习模型训练做一个总结。
由于是我自己的总结,所以如果有说的不对的地方,还望指正。
当然我的总结也是基于一些文献参考来的,所以如有雷同,纯属我借鉴别的大神的文章。
如果去查阅与分布式深度学习相关的资料,一般会看到两个词,模型并行和数据并行。
模型并行是指把模型的不同部分放置在各个设备上,这样整个集群就像一个生产流水线一样,对这样的分布式设置我还没有使用过,所以不在这里细说。
数据并行应该是大多数人都会遇到的场景。数据并行分为同步更新和异步更新,下面一一说明。
深度学习训练的数据并行化,说白了就是梯度下降的并行化,所以想要理解你在并行化训练一个深度学习的模型时到底发生了说明,你必须明白梯度下降时到底发生了什么。
我们先从单机的梯度下降说起。
所有介绍梯度下降的参考书都会说梯度下降分为整体梯度下降(每次更新参数使用所有数据)和随机梯度下降(每次更新参数使用一条数据),而在深度学习里我们一般都会结合这两种思想使用批梯度下降,每次更新参数使用一个batch的数据来更新参数。
一般我们可以把随机梯度下降的公式写成下面的形式:
这里我没有在θ上加任何标记,代指神经网络中随意的一个参数,这个公式搞神经网络的应该很熟悉,这里α是学习率,J(θ)是损失函数,整个式子的意义就是参数θ的更新是用上一次迭代的θ减去学习率乘以损失函数对该θ的偏导,也就是梯度。计算该偏导数的时候,就会用到我们的样本数据,不然无法计算J(θ)对