并行这个概念一方面是是加快模型训练,一方面是解决显存不够的问题的并行策略
数据并行(最常用的),即每张卡上都放一个完整的模型,主要用于单机多卡的数据并行。
模型并行,将模型的不同部分进行手动的分割,然后分别放在不同的卡上。注意,模型要放在卡上不光是需要保存模型参数,因为模型训练过程中不仅涉及数据一层一层前向传播的问题,还要反向传播,所以要把每一层的激活值记下来(也包括参数的梯度、激活值的梯度),同时由于使用优化器也需要记录优化器的参数,所以实际上需要放在显卡上的东西是好几倍的参数量。这种方法虽然叫并行,但我觉得其实是显卡之间的串行了。
DDP,即分布式数据并行。和第一个有所区别( PyTorch 里的数据并行训练,涉及 nn.DataParallel (DP) 和 nn.parallel.DistributedDataParallel (DDP) 两个模块),它使用了更高级的策略实现分布式训练,主要涉及多进程多线程,可以实现多机多卡训练。
还有更先进的FSDP,如果使用的时候可以搜一搜他们之间具体区别和实现(DP\DDP\FSDP)
在考虑显存占用问题的时候,可以用到几种优化,主要分为激活值优化(数据的中间过程变量)和参数优化(模型参数)
激活值优化有:1. 时间换空间的亚线性内存优化,实际上就是说前向传播以后,丢掉一些中间变量,在反向传播的时候用到哪了再重新算一次。 2. 低精度训练
参数优化有:1. 传统数据并行,就是上面的DP。 2. ZeRO(零冗余优化)数据并行,1里面的方法是每张卡上都放一个完整的模型,其中包含我在上面模型并行中提到的所有东西,比较占用空间,有一定的冗余性。零冗余就是说把模型需要保存的所有参数平均分给每张卡,每张卡保存一部分,用到的时候分发。从原理图上看,这种方法既有数据并行,也有模型并行。
标签:训练,模型,卡上,并行,参数,深度,优化 From: https://www.cnblogs.com/andoblog/p/17854518.html