深度学习模型训练并行问题

并行这个概念一方面是是加快模型训练,一方面是解决显存不够的问题的并行策略

数据并行(最常用的),即每张卡上都放一个完整的模型,主要用于单机多卡的数据并行。

模型并行,将模型的不同部分进行手动的分割,然后分别放在不同的卡上。注意,模型要放在卡上不光是需要保存模型参数,因为模型训练过程中不仅涉及数据一层一层前向传播的问题,还要反向传播,所以要把每一层的激活值记下来(也包括参数的梯度、激活值的梯度),同时由于使用优化器也需要记录优化器的参数,所以实际上需要放在显卡上的东西是好几倍的参数量。这种方法虽然叫并行,但我觉得其实是显卡之间的串行了。

DDP,即分布式数据并行。和第一个有所区别( PyTorch 里的数据并行训练,涉及 nn.DataParallel (DP) 和 nn.parallel.DistributedDataParallel (DDP) 两个模块),它使用了更高级的策略实现分布式训练,主要涉及多进程多线程,可以实现多机多卡训练。

还有更先进的FSDP,如果使用的时候可以搜一搜他们之间具体区别和实现(DP\DDP\FSDP)

 

在考虑显存占用问题的时候,可以用到几种优化,主要分为激活值优化(数据的中间过程变量)和参数优化(模型参数)

激活值优化有:1. 时间换空间的亚线性内存优化,实际上就是说前向传播以后,丢掉一些中间变量,在反向传播的时候用到哪了再重新算一次。 2. 低精度训练

参数优化有:1. 传统数据并行,就是上面的DP。 2. ZeRO(零冗余优化)数据并行,1里面的方法是每张卡上都放一个完整的模型,其中包含我在上面模型并行中提到的所有东西,比较占用空间,有一定的冗余性。零冗余就是说把模型需要保存的所有参数平均分给每张卡,每张卡保存一部分,用到的时候分发。从原理图上看,这种方法既有数据并行,也有模型并行。

 

posted @ 2023-11-24 21:45  诸葛村夫CC  阅读(55)  评论(0编辑  收藏  举报