批量大小和 GPU 数量对模型精度的影响

人工智能 深度学习 喀拉斯 准确性 显卡 批量大小
2021-11-09 23:55:41

我有一个使用固定随机种子拆分的数据集,我将使用 80% 的数据进行训练,其余的用于验证。

这是我的 GPU 和批量大小配置

  • 64 batch size_one GTX 1080Ti
  • 128 batch size_two GTX 1080Ti
  • 256 batch size_four GTX 1080Ti

所有其他超参数,例如lroptloss等,都是固定的。batch size注意和之间的线性关系number of GPUs

这三个实验的准确度是否相同?为什么和为什么不?

2个回答

这应该会有所不同,但是差异有多大在很大程度上取决于您的任务。但是,一般来说,如果以样本/分钟计算,较小的批次大小将具有较低的速度,但以批次/分钟计算具有较高的速度。如果批量太小,批量/分钟将非常低,因此会严重降低训练速度。但是,batch size 太小(例如 1)会使模型难以泛化并且收敛速度也较慢。

这张幻灯片(来源)很好地展示了批量大小如何影响训练。

批量大小幻灯片

从图中可以看出,当批量较小时,收敛的路径将参差不齐且不直接。这是因为模型可能会在异常值上进行训练,并在再次拟合之前降低其性能。当然,这是一个极端情况,你永远不会训练一个批量大小为 1 的模型。

另一方面,如果批量太大,您的模型每次迭代将花费太长时间。至少有一个不错的批量大小(比如 16+),训练模型所需的迭代次数是相似的,所以更大的批量大小不会有太大帮助。性能不会有太大变化。

在您的情况下,准确性会有所不同,但影响很小。在写这个答案时,我已经对批量大小对性能和时间的影响进行了一些测试,结果如下。(要添加 1 个批量大小的结果)

Batch size 256 Time required 98.50849771499634s : 0.9414
Batch size 128 Time required 108.53689193725586s : 0.9668
Batch size 64 Time required 129.92272853851318s : 0.9776
Batch size 32 Time required 162.13709354400635s : 0.9844
Batch size 16 Time required 224.82269191741943s : 0.9854
Batch size 8 Time required 351.2729814052582s : 0.9861
Batch size 4 Time required 514.2667407989502s : 0.9862
Batch size 2 Time required 829.1623721122742s : 0.9869

您可以在这个 Google Colab中测试自己

在此处输入图像描述

如您所见,准确率提高了,而批大小减小了。这是因为更高的批量大小意味着它将在更少的迭代中进行训练。2x 批量大小 = 一半的迭代,所以这是意料之中的。所需时间呈指数增长,但 32 或以下的批大小似乎对所用时间没有太大影响。准确率似乎是正常的,因为一半的迭代是用两倍的批量训练的。

在你的情况下,我实际上建议你坚持使用 64 批大小,即使是 4 个 GPU。在多个 GPU 的情况下,经验法则是每个 GPU 至少使用 16 个(左右)批量大小,因为如果您使用 4 或 8 个批量大小,GPU 不能完全用于训练模型。

对于多个 GPU,由于精度误差,可能会有细微差别。请看这里

结论

批量大小对性能没有太大影响,只要您设置合理的批量大小(16+)并保持迭代不一样。但是,训练时间会受到影响。对于多 GPU,您应该使用每个 GPU 的最小批量大小,以利用 100% 的 GPU 进行训练。每个 GPU 16 个相当不错。

不。不同的批量大小意味着不同的梯度(检查随机梯度下降概念,您将了解如何计算损失)在每个步骤中计算,因此梯度下降可能最终会出现在参数空间的不同位置。

此外,实际并行化的方式可能会有所不同,包括操作顺序和 FP 精度之间的转换。

其他检查资源:多 GPU 问题