DataParallel模式,单机多卡怎么计算loss或梯度的
Created by: IvyGongoogle
问题1: 数据并行模式,pytorch的单机多卡训练原理是:
假设读入一个 batch 的数据,其大小为 [30, 5, 2],假设采用三张 GPUs,其运行过程大致为:
[1] - 将模型放到主 GPU 上,一般为 cuda:0;
[2] - 把模型同步到 3 张 GPUs 上;
[3] - 将总输入 batch 的数据平分为 3 份,这里每一份大小为 [10, 5, 2];
[4] - 依次分别作为每个副本模型的输入;
[5] - 每个副本模型分别独立进行前向计算,假设为 [4, 5, 2];
[6] - 从 3 个 GPUs 中收集分别计算后的结果,并按照次序拼接,即 [12, 5, 2],计算 loss;
[7] - 更新梯度.
但是我读paddlepaddle的文档,上面说在使用GPU训练时,如果每个trainer节点有多个GPU卡,则会先在每个trainer节点的多个卡之间执行NCCL2通信方式的梯度聚合, 这是和我上面写的pytorch的单机多卡训练时每个卡计算网络输出或loss或梯度的方式不同的,是吗?
问题2:数据并行模式下,对于paddle的单机多卡训练:当使用paddle.distributed.launch时,是使用多进程进行训练对吧?具体每个进程是负责一张卡和切分的batch数据进行单独训练的吗?然后loss和梯度又是怎么计算的? 是每个进程单独计算然后单独更新自己卡上的模型参数? 还是每个进程得到网络输出或loss后,把每个进程的输出或loss汇合到一起计算梯度再更新到每个卡呢?
问题3:类似问题2,数据并行模式下:对于paddle的单机多卡训练,当不使用paddle.distributed.launch时,是一个进程负责问题2中的所以事情吗? batch数据切分到不同卡上,每个卡计算完网络输出或loss, 每个卡单独计算梯度,然后多个卡之间执行NCCL2通信方式的梯度聚合?
希望得到答复。 Thanks