多GPU训练

http://zh.d2l.ai/chapter_computational-performance/multiple-gpus.html

new_params = [p.clone().to(device) for p in params]

这里为什么要用clone()呢,to()方法一般都会返回copy吧

1 Like

沐神说了可加可不加,之所以写clone是因为假设p已经在GPU0上了,再to到GPU0上的话,它是不会做任何操作的,clone了再to的话它永远会帮你复制。保险起见,可以clone,但实际上在这个情况里不用是没关系的。可以看b站回放,34集02:13。

1 Like

把GPU数量改成4个以上的时候acc会暴跌。

已经解决, 书中allreduce 代码有错误。 因为赋值给其他gpu的时候用的是 =, 所以赋值失败, 实际上其他gpu没有得到更新的数据, 除了0号gpu的数据是叠加的, 其他的没有叠加过。

1 Like

我也有个疑问,这里用clone的话应该是有梯度回溯功能的,等于其他gpu的参数反向传播得到的梯度值应该会自动加到原参数(gpu0)梯度上面去,那为什么后面还要再统计一遍梯度呢?我觉得可以直接把已经汇总的梯度从GPU0传到其他GPU才对吧

1 Like

请问这里不用=的话应该用什么才对呢,感觉allreduce函数的将其他GPU梯度统计到GPU0上也是没必要的,因为前面用的clone,有梯度回溯功能。不知道这么说对不对

Fixed in PR #1021. Thanks @11133

参考12.6 pytorch集成的代码,loss是在整个batch上求的平均,那本节感觉反向传播的时侯少了一步,


应该是要在0号GPU聚合loss,再传给每一个其他的GPU求梯度?不知道正不正确

我的理解是,损失和梯度都在各自的设备上计算,最后,再把梯度聚合广播到所有设备。代码中好像是在0号GPU中聚合梯度,然后再把梯度广播到其他GPU。