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卡上进行,因此