在本TensorFlow教程中,您可以使用N个GPU将N个小批量(每个小批量包含M个训练样本)分配给每个GPU,并同时计算梯度。
然后对从N个GPU收集的梯度求平均值,并更新模型参数。
但这与使用单个GPU计算N*M个训练样本的梯度,然后更新参数具有相同的效果。
所以在我看来,唯一的优势是你可以在同样的时间内使用更大尺寸的迷你批次。
但是,更大尺寸的小批量一定更好吗?
我认为您不应该使用大型迷你批次,以便使优化对鞍点更加稳健。
如果更大尺寸的小批量确实没有更好,你为什么会关心多GPU学习,甚至多服务器学习?
(上面的教程是同步训练。如果是异步训练,那么我可以看到优点,因为参数将在不平均每个GPU计算的梯度的情况下更新)
多GPU学习的主要目的是使您能够在更短的时间内对大数据集进行训练。使用更大的小批量并不一定更好,但至少你可以在更可行的时间内完成学习。
更准确地说,如果您使用异步SGD算法,那么这N个小批量就不会以同步的方式进行训练。由于使用多GPU时算法会发生变化,因此它不等于使用SGD算法在单个GPU上使用MxN大小的小批量。
如果你使用同步多GPU训练,好处主要是减少时间。您可以使用M/N-size迷你匹配来保持有效的迷你批量大小,当然,可扩展性是有限的,因为较小的迷你批量会导致更多的开销。大量计算节点上的数据交换和同步也是灾难。
最后,为了解决可扩展性问题,当同时使用大量GPU时,人们会转向A-SGD。因此,你可能不会看到有人在数百(甚至数十)个GPU上使用同步多GPU训练。
更多的gpu意味着批处理中有更多的数据。并且对批次数据的梯度进行平均以进行反向传播。
如果一个批次的学习率是固定的,那么数据的学习率就更小。
如果一个数据的学习率是固定的,那么一个批次的学习率就更大。
https://github.com/guotong1988/BERT-GPU