深度学习模型的并行训练:数据并行VS模型并行

本文探讨了深度学习模型训练中的两种并行方法:数据并行和模型并行。数据并行通过将大型数据集分割在多个GPU上,进行梯度求导和同步更新。模型并行则是因模型过大,将其拆分在不同GPU上,依次进行前向和反向传播。在选择时,需根据实际模型大小和资源考虑。PyTorch中,推荐使用DistributedDataParallel(DDP)而非DataParallel(DP)进行数据并行训练,因为DDP的效率更高,适用于多节点分布式训练。

数据并行

由于训练数据集太大,而无法一次将其全部载入内存。因此将数据集分为N份,分别装载到N个GPU节点中去进行梯度求导,然后将所有节点的求导结果进行加权平均,再sync update给所有节点(对于每个节点来说,我们使用相同的模型参数进行前向传播。)。然后继续进行下一步的训练,直到模型收敛或者提前停止训练。

如上图所示,GPU1和GPU2上都装载有完整的模型,但是它们使用不同的子数据集Batch进行训练,每次每个节点的推导结果进行加权平均然后sync到所有的GPU节点上,再继续下一步迭代。

 

模型并行

由于模型太大(层数太深,参数太多),而无法将整个模型载入一个GPU。因此将模型分为N个部分,分别加载到不同的N个GPU节点中。例如模型有1000层,使用10块GPU,GPU0装载模型的前1000层,以此类推,GPU9装载模型的最后1000层。在训练的时候,GPU0先进行前向传播,其结果传给GPU1,然后GPU1接着进行前向传播,以此类推,直到GPU9拿到GPU8给的结果进行反向传播。反向传播过程与前向传播过程类似,就是每个GPU节点必须等待前一个节点的结果,才能进行运算。

 

 

如上图所示,整个模型被分为两部分,分别装载到GPU1和GPU2上。模型的分配方式可以自定义,这里是相邻层在两个GPU上,比如,GPU1上是第0,2,4等层,GPU2是第1,3,5等层。

当GPU1上的第0层前向传播得到结果,则将其传给GPU2的第1层;GPU2的第1层使用GPU0的第0层的结果进行前向传播,并将结果传给GPU1的第2层。以此类推。反向传播过程类似。

问题

哪种并行训练方式更好呢?

答案是,要结合实际情况来看。如果模型过大,当然只能使用模型并行的训练方式。

这里想强调一点的是,如果使用数据并行进行模型的并行训练,那么一定要选用DistributedDataParallel (DDP)而不是DataParallel (DP)。(在Pytorch中有这两种多GPU的数据并行训练模式)

原因是DDP的训练更快,数据传输带来的消耗更少。

DP训练模式下,所有GPU由一个CPU进程控制,模型会被加载到每一块GPU,一旦梯度在GPU0上完成了加权平均,更新后的梯度将被sync到其他所有GPU上。模型的每一层训练都是这样,那么就会产生很多GPU之间的数据传输。并且DP模式只能用在一个node(一个node上最多8块GPU)上。

DDP在每个GPU上(在其自己的进程中)创建模型的孤立副本,并使该GPU仅可使用一部分数据。 然后就像进行N次独立模型训练一样,只是每个模型都会计算梯度,它们都会在模型之间同步梯度……这意味着我们在每批处理中仅一次在GPU之间传输数据。可用于多node的分布式训练。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值