34- 多GPU 训练实现(only QA)
34 多GPU 训练实现
本讲内容为代码实现,这里整理
暂时不会有影响
可以,有这样做的
paper ,但是通过一维卷积(等价于全连接层)做的,如果直接换成全连接层很可能会过拟合。
老师也不太清楚并认为这是很好的问题,可以去查阅论文。
all_reduce 是把n 个东西加在一起再把所有东西复制回去,all_gather 则只是把来自不同地方东西合并但不相加。使用分布式的东西会破坏自动求导,跨GPU 的自动求导并不好做,老师不确定pytorch 能不能做到这一功能,如果不能就只能手写。
是的。
mini-batch 的梯度就是每个样本的梯度求和,多GPU 时同理,每个GPU 向将自己算的那部分样本梯度求和,最后再将两个GPU 的计算得的梯度求和。
性能取决于每算一个乘法需要访问多少个
bit ,计算量与内存访问的比值越高越好。通常CPU/GPU 不会被卡在频率上而是访问数据/ 内存上,所以参数量小,算力高的模型性能较好(如卷积,矩阵乘法) 。
抖动是因为学习率变大了,使用
GPU 数对测试精度没有影响,只会影响性能。但为了得到更好的速度需要把batchsize 调大,使得收敛情况发生变化,把学习率上调就使得精度更抖。
不会,
batchsize 中的loss 是求均值的,理论上batchsize 更大数值稳定性会更好,出现数值不稳定问题可能是学习率没有调好。
显存手动优化很难,靠的是框架,
pytorch 的优化做的还不错。除非特别懂框架相关技术不然建议把batchsize 调小或是把模型做简单一点。
可能是。
pytorch 没有实现parameter server ,但mxnet 和tensorflow 有。但是有第三方实现如byteps 支持pytorch 。
是的。在算
net.forward() 的时候会分开。
学习率。
可以,主要的问题是麻烦,不好确定各部分学习率相差多少。
数据相比梯度来说很少,不会对性能有太大影响。但这个操作看上去的确很多余,老师认为不需要做,但不这样做会报错。
学习率太大了,
batchsize 小学习率就不能太大。
需要算好两块
GPU 的性能差。如一块GPU 的性能是另一块的2 倍,那么在分配任务时也应该分得2 倍的任务量。保证各GPU 在同样时间内算完同一部分。
可能是学习率太大,也可考虑加入
batch normalization 。