0
点赞
收藏
分享

微信扫一扫

pytorch支持单机多卡和多机多卡

秀妮_5519 2022-01-27 阅读 83

1.单机多卡
第一种方法是nn.DataParallel(model, device_ids=devices, output_device=devices[0])

伪代码
devices = cudeviceutil.auto_alloc_device()
nn.DataParallel(model, device_ids=devices, output_device=devices[0])

将模型在devices中的所有GPU卡上进行模型训练,并在ouput_device上进行模型平均操作。

本方法的优缺点是:在各个GPU卡上的权重更新是相互独立的,需要等所有卡上的任务都完成后才能在output_device上进行模型平均操作。优点是:操作简单;缺点是:GPU卡之间需要相互等待,所以训练速度不快,GPU利用率比较低

这种方法在实现时是将模型放置在主GPU上,然后对它进行复制到其他GPU卡上,同时也是在主GPU上将数据拆分成多分,分发到其他GPU卡上,最终待这个batch的数据在各个GPU卡上都处理完之后,在主GPU卡上进行模型更新。因此需要将单机单卡的batchsize放大为n倍(n为使用的卡数),同时由于batchsize增大后模型收敛速度会变慢,需要将学习率适当调整放大一些

在训练过程中,一直是在主GPU卡上进行loss反向回传更新模型参数,之后将新的模型参数再分发到各个GPU卡上,继续进行下一个batch的forward,然后将所有机器上的loss汇总到主GPU卡上进行参数更新。即多个GPU卡只是加速了forward计算,模型迭代更新还是在一张卡上进行的。还是一组模型参数

由于数据分发和模型参数更新均在主GPU卡上进行,因此这种方法会导致主GPU卡上的负载远超于其他GPU卡上的显存负载,出现负载不均衡问题

第二种方法是nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank],find_unused_parameters=True) 可以解决GPU利用率比较低的问题及负载不均衡问题。构建更为同步的分布式运算

详细可参考:(个人感觉这个作者写的很详细)
https://www.cxyzjd.com/article/HUSTHY/108226256

举报

相关推荐

0 条评论