为什么大型迷你批次需要更长时间才能运行?

问题描述 投票:0回答:2

我正在MNIST上训练一个自动编码器,并注意到在128之后增加批量大小,开始在固定数据集大小上花费更多的计算时间。

我正在使用tensorflow-gpu并拥有GeForce GTX 1070。

我尝试在5000个样本(784暗淡)的固定训练集上运行几个测试,并运行了10个时期。批次是来自5000个训练样本的连续batch-size块,因此迭代次数有效地取决于批量大小。

我跟踪了这​​个数据(丢失),执行时间和python进程的GPU内存使用情况的性能(来自nvidia-smi输出):

5000 datapoints 10 epochs

batch size
512:       loss: 53.7472; execution took 00:00:13,787; 4281MiB
256:       loss: 48.1941; execution took 00:00:04,973; 695MiB
128:       loss: 42.7486; execution took 00:00:03,350; 439MiB
64:        loss: 40.0781; execution took 00:00:04,191; 439MiB
32:        loss: 37.7348; execution took 00:00:06,487; 441MiB
16:        loss: 36.6291; execution took 00:00:12,102; 441MiB
8:         loss: nan;     execution took 00:00:23,115; 441MiB

当我尝试大于512的小批量大小时,我得到Out Of Memory错误。

我认为较小的批次执行需要更长的时间才有意义,因为在同一日期会有更多的顺序更新。但是,我不确定为什么当小批量大于128个样本时计算时间增加,而不是进一步减少。

一个假设是它与GPU变满并且无法正确并行化,但我在网上找不到任何此类评论。

tensorflow gpu mnist batchsize
2个回答
0
投票

虽然较大的批次意味着每个时期的总更新次数较少,但这也意味着每个批次将需要更多的时间来处理,并且虽然使批量更大使得批次总数更小,但也可能导致更慢的收敛。 所以你可以看到有一个权衡。您必须找到数据集的最佳批量大小。对于MNIST,批量通常在50到150之间。 我不确定你是如何从数据库加载批次的,但如果以正确的方式使用,批处理的一个优点是你不必将整个数据加载到你的RAM中。因此,很大的批量大小会导致内存不足错误,这是很自然的。


0
投票
  • 当您使用较小的批量大小训练模型时,您的模型会更频繁地更新,尽管更随机。这有助于在每个时代更快地收敛。例如,如果您在500的batch_size上训练,您将在1个纪元中更新您的模型参数100次,但如果您在batch_size上训练50,则1个纪元中的更新数量为1000。
  • 当您使用较大的批量大小训练模型时,每次更新都更稳定,更不随机。
  • 当您使用较大的批量大小训练模型时,它使用CPU或GPU上的矢量化计算,例如使用batch_size = 1,我们获得更多更新但没有矢量化的优势。但是当你在非常大的批量大小上训练时,它的内存容量会高于内存容量,那么它的内存就不足了。

通常,我们会平衡批量大小和收敛速度。

© www.soinside.com 2019 - 2024. All rights reserved.