【问题标题】:Why would large mini batches take longer to run?为什么大型迷你批次需要更长的时间才能运行?
【发布时间】:2019-09-19 04:27:51
【问题描述】:

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

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

我尝试在包含 5000 个样本(784 暗度)的固定训练集上运行几个测试,并运行了 10 个 epoch。 这些批次是来自 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 的 minibatch 大小时,会出现内存不足错误。

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

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

【问题讨论】:

    标签: tensorflow gpu mnist batchsize


    【解决方案1】:

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

    【讨论】:

    • 当你说“......这也意味着每个批次都需要更多时间来处理......”这究竟意味着什么 - 将批次加载到 GPU 或平均坡度?在这种特殊情况下,我对收敛时间不感兴趣,而是对固定数据集上不同批量大小的执行时间感兴趣。我在我的 RAM 中加载了 5000 个样本(适合),然后连续批次。当批量太大时,GPU 内存会出现 OOM 问题。
    【解决方案2】:
    • 当您使用较小的批量训练模型时,模型会更频繁地更新,尽管更随机。这有助于在每个时期更快地收敛。例如,如果您在 500 的 batch_size 上进行训练,您将在 1 个 epoch 中更新您的模型参数 100 次,但如果您在 50 个的 batch_size 上进行训练,则 1 个 epoch 的更新次数为 1000。

    • 当您使用较大的批量训练模型时,每次更新都更加稳定且随机性更小。

    • 当您使用较大的批量训练模型时,它会在 CPU 或 GPU 上使用矢量化计算,例如使用 batch_size = 1,我们会获得更多更新,但没有矢量化的优势。但是,当您在比内存容量更高的非常大的批大小上进行训练时,就会出现内存不足。

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

    【讨论】:

      猜你喜欢
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 2017-09-22
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 2013-10-11
      相关资源
      最近更新 更多