记得接触DistributedDataParallel(DDP)之前,自己一直用DataParallel(DP)跑多卡,浪费了不少时间,恰好最近几天接触到了Swin-Transformer就尝试了下DDP,如下是心得。
首先呢,我是在云端租的服务器尝试了单机2、4、8卡训练,采用命令行调用DDP后发现它一直卡在装载模型上占用了GPU显存,必须kill PID才行,也考虑到我习惯用python train.py的方式,就使用了MultiProcessing(MP)的方式,最终成功,关于其具体的实现过程大家可以看看其他博客的做法。我这里考虑到Pertrain 的模型是没用apex的,使用后loss 会从1e+7左右下降,等待时间未免有些得不偿失,还看到有的博主说DDP和apex对model加速差别不大,我就决定用MP了。我这里主要就是DP->DDP->MP+torch的reduce loss+多线程BN(没用apex的是因为没用它加速)
其次,根据我的实验发现,在不考虑装载的时间MP比DP在4卡上大致快了1/4,但与此同时其将Batch_size也缩小了4倍(我认为只要显卡能承受,这样就是比较好的,小batch_size跟稳定,结果也更好一些),要是考虑到装载时间,ennnn,那也还好(除了8卡机,我再一次卡在装载界面,现在还不确定是哪方面的问题,不行的话,就只能租4卡机了)
当然,我对自己的编程能力还没有那么自信,上诉结果可能是因为自己写错了代码,后续还需要根据实验结果看下是否正确)
————————————
废话:在我写完博客再去看8卡机的时候,发现它开始train了,开心(但是它的速度没有变成4卡机的2倍,稍微慢了12.5%)