nn.DataParallel
若只考虑单机多卡并行和数据平行训练时,最简单的方法是用 nn.DataParallel。
先设置所使用的GPU卡,然后用 nn.DataParallel 包装模型。
1 | import os |
Pytorch的nn.DataParallel - 知乎 (zhihu.com)
前向过程:
- 分发mini-batch到每个GPU上,
- 将模型复制到每一个GPU上,
- 模型对mini-batch进行forward计算结果,
- 将每个GPU上的计算结果汇总到第一个GPU上。
反向传播过程:
- 在第一个GPU上根据计算的loss计算梯度,
- 将第一个GPU上计算的梯度值分发到每个GPU上,
- 每个GPU上进行梯度更新,
- 将每个GPU上更新的梯度值汇总到第一个GPU上。
其中foward过程都会把第一个GPU上的模型重新分发到每个每个GPU上。各个卡只计算到loss,然后0号卡做loss平均,最后分发到各个卡上求梯度并进行参数更新。
文章有错误:应该是
1:把每张卡的输出gather到GPU0,
2:只在GPU0在算loss,
3:把loss scatter到其他GPU上,
4:每个GPU算各自的梯度,再把梯度汇总到GPU0上
关于这个流程不同的文章有不同的说法。
nn.parallel.DistributedDataParallel
PyTorch 源码解读之分布式训练了解一下? - 知乎 (zhihu.com)
pytorch多GPU并行训练教程_哔哩哔哩_bilibili
同步bn
nn.DataParallel
单机多卡。单进程多线程。工作与单机。
nn.parallel.DistributedDataParallel
可以多级多卡,速度快于DataParallel。
多gpu训练,每块gpu上初始模型需要一摸一样。
loss_reduce,多块gpu loss做平均。