【问题标题】:What to do with batch size when TensorFlow says "there could be performance gains if more memory is available"当 TensorFlow 说“如果有更多可用内存可能会提高性能”时,如何处理批量大小
【发布时间】:2018-01-15 06:16:49
【问题描述】:

我在尝试为 Nvidia K80 上的 CNN 模型增加 batch_size 时遇到以下错误:

2017-08-07 20:33:38.573318: W tensorflow/core/common_runtime/bfc_allocator.cc:217] Allocator (GPU_0_bfc) ran out of memory trying to allocate 3.04GiB. The caller indicates that this is not a failure, but may mean that there could be performance gains if more memory is available.

我想知道遇到这种情况时最快的选择是什么:

  • 什么都不做,让模型不顾警告训练。
  • 将批大小和学习率按一个因子缩小,但以相同的因子进行更多迭代,以便以较小的批大小和更多的迭代得到相同的结果(遵循 线性缩放规则this paper 中所述)。

【问题讨论】:

  • 由于增加批量大小而导致的训练效率始终是亚线性的(即,2 倍大的批量大小需要超过 0.5 倍的迭代)。因此,如果增加批量大小不会导致吞吐量的超线性增加,那就是净损失。所以要做的是看看你的吞吐量是如何受到影响的,即一旦你的训练吞吐量开始下降,就停止增加批量大小

标签: python performance tensorflow gpu tensorflow-gpu


【解决方案1】:

如果您继续训练(上面的第一个项目符号),您将体验到一些效率损失,因为操作系统会交换您的数据(抖动)。选项 2 是正确的(根据我的经验):减少批量大小以有效利用可用内存,并增加迭代以进行补偿。

关键训练量以 epoch 为单位,而不是迭代次数。如果您将批量大小减少 2 倍,那么您将迭代次数增加 2 倍,您将获得几乎相同的结果。

【讨论】:

  • 谢谢。通过迭代,我的意思是steps_per_epoch。我想这也有效......对吧?顺便说一句,你所说的临界训练量到底是什么意思,你是指总训练量吗?所以,基本上,如果我将batch_size 分成两半,我应该通过将steps_per_epoch 的数量加倍来训练相同数量的示例,其中每一步我都会输入batch_size 数量的示例。您对此有何看法?
  • (并且知道这种关系并不完全是线性的,而是非常接近线性)
  • 你说得对:我使用常识中的“关键”来表示总训练量。是的,steps_per_epoch 是您定义它的地方。我总是觉得这个参数名称有悖常理,因为它源自 epoch(一个独立定义的术语)和批量大小。
  • 这种关系实际上只是接近线性。但是,线性提供了非常好的近似值。我的方法是让它运行一段时间并观察测试的准确性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多