在TensorFlow中进行多GPU训练的优势是什么?

4
这个 TensorFlow 教程中,您可以使用 N 个 GPU 将 N 个小批量(每个小批量包含 M 个训练样本)分配给每个 GPU 并同时计算梯度。
然后,您需要对从 N 个 GPU 收集的梯度进行平均,并更新模型参数。
但是,这与使用单个 GPU 计算 N*M 个训练样本的梯度并更新参数具有相同的效果。
因此,唯一的优势似乎是您可以在相同的时间内使用更大的小批量。
但更大的小批量是否一定更好呢?
我认为您不应该使用更大的小批量,以使优化对鞍点更加稳健。
如果更大的小批量确实没有更好的效果,那么为什么要关心多 GPU 学习,甚至多服务器学习呢?
(上面的教程是同步训练。如果是异步训练,那么我可以看到其优点,因为参数将在不对每个 GPU 计算的梯度进行平均的情况下更新)

更大的小批次不一定更好,但更小的小批次也不是。批量大小的最佳选择在很大程度上取决于各种因素。 - Aenimated1
假设由于VRAM大小的限制,您被限制在每个GPU上的1,000个样本。并且假设最佳的小批量大小为2,000。那么在这种同步多GPU设置中,使用超过2个GPU将没有任何优势。对吗? - mp2893
我认为相反地,理论上你可以从2000个GPU中受益,每个GPU计算单个示例的梯度。实际上,GPU本身就利用了相当数量的并行性,但无论如何,我期望通过在4个GPU之间分配计算(例如,每个GPU负责计算每批500个样本的梯度)来看到性能提高。 - Aenimated1
这是一个有效的观点。运行500个训练样本比运行1,000个样本要快得多。 - mp2893
为什么要对梯度求平均? - DunkOnly
2个回答

2
多GPU学习的主要目的是在更短的时间内训练大数据集。较大的mini-batch不一定更好,但至少可以在更短的时间内完成学习。如果使用异步SGD算法,则这些N个mini-batch不会以同步方式进行训练。由于使用多GPU时算法发生变化,因此它不等同于在单个GPU上使用SGD算法的MxN大小的mini-batch。
如果使用同步多GPU训练,则主要优点是减少时间。您可以使用M/N大小的mini-batch来保持有效的mini-batch大小,当然可扩展性受到限制,因为较小的mini-batch大小会导致更多的开销。在大量计算节点上进行数据交换和同步也会带来麻烦。
最后,为了解决可扩展性问题,人们在同时使用大量GPU时转向A-SGD。因此,您可能不会看到有人在数百个(甚至数十个)GPU上使用同步多GPU训练。

因此,在你拥有无限数量的GPU的极端情况下,你可以将整个训练样本分成小批次并将它们分配给无限数量的GPU。然后,对由无限数量的GPU计算出的梯度进行平均,并更新参数,这与“批量学习”完全相同。这没有任何随机性。但这没关系,因为即使我们有非常大的训练样本,我们仍然可以在可行的时间内训练模型。我的理解正确吗? - mp2893
是的,这很有道理。我现在对这个问题有了更好的理解。感谢@Aenimated1和@Eric! - mp2893
@kangshiyin,如果您能看一下这个问题并抽出时间,我将不胜感激。https://stackoverflow.com/questions/45643375/python-how-do-we-parallelize-a-python-program-to-take-advantage-of-a-gpu-server - Desta Haileselassie Hagos
为什么要对梯度求平均? - DunkOnly
@不是phd的phd:请查看此答案 https://datascience.stackexchange.com/questions/33489/why-averaging-the-gradient-works-in-gradient-descent?newreg=edaaa18740764d54ab0363c4268a6b9b - totjammykd
显示剩余3条评论

0

更多的GPU意味着批处理中有更多的数据。批数据的梯度被平均用于反向传播。

如果批次的学习率固定,则数据的学习率较小。

如果数据的学习率固定,则批次的学习率较大。

https://github.com/guotong1988/BERT-GPU


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接