如何计算最佳批量大小

And*_*Gis 16 machine-learning neural-network gradient-descent deep-learning keras

有时我遇到一个问题:

OOM在分配形状的张量时

EQ

OOM在分配形状的张量时(1024,100,160)

1024是我的批量大小,我不知道剩下的是什么.如果我减少批量大小或模型中的神经元数量,它运行正常.

是否有基于模型和GPU内存计算最佳批量大小的通用方法,因此程序不会崩溃?

编辑

由于我的问题可能看起来不清楚,让我按照他的方式说:我希望我的模型可以使用最大的批量大小,这将适合我的GPU内存并且不会使程序崩溃.

编辑2

对于那些因为过于宽泛而投票结束这个问题的人:这个问题到底有多宽?有一些算法可以选择一部分数据放入GPU内存.它显然是不完美的,因为数据有时会超过GPU内存.询问算法如何工作,以防止随机崩溃,对我来说似乎很合理.

des*_*aut 14

来自Goodfellow等人最近的深度学习书,第8章:

迷你尺寸通常由以下因素驱动:

  • 较大的批次提供了更准确的梯度估计,但回报率低于线性.
  • 多核架构通常未被极小批量利用.这促使使用一些绝对最小批量,在此之下,处理小批量的时间没有减少.
  • 如果批处理中的所有示例都要并行处理(通常是这种情况),则内存量会随批量大小而变化.对于许多硬件设置,这是批量大小的限制因素.
  • 某些类型的硬件通过特定大小的阵列实现更好的运行时间.特别是在使用GPU时,通常2个批量大小的电源可以提供更好的运行时间.2个批量大小的典型功率范围从32到256,有时大型模型尝试16个.
  • 小批量可以提供正规化效果(Wilson和Martinez,2003),可能是由于它们为学习过程增加了噪音.对于批量大小为1的广义误差通常是最佳的.具有如此小批量的训练可能需要较小的学习率来维持稳定性,因为梯度估计的方差很大.由于需要制定更多步骤,总运行时间可能非常高,这是因为学习率降低,并且因为需要更多步骤来观察整个训练集.

实际上通常意味着" 在2的幂中,越大越好,只要批量适合你的(GPU)内存 ".

您可能还想在Stack Exchange中查阅几篇好帖子:

请记住Keskar等人的论文." 在深学习大批量培训:推广Gap和尖最小值 ",通过以上几个职位的报价,已经收到了一些异议通过深学习社区的其他研究人员可敬.

希望这可以帮助...

更新(2017年12月):Yoshua Bengio&团队发表了一篇新论文,"影响Minima的三个因素"(2017年11月); 值得一读的是,它报告了学习率和批量大小之间相互作用的新理论和实验结果.

  • 它并没有真正回答我的问题。我想要尽可能大的批量大小,这将适合我的 GPU 内存。 (3认同)
  • 当您尝试超参数和拓扑时,如果发生错误则减小大小是一个很大的麻烦。如果有一个通用公式就太好了。即使结果会四舍五入到 2 次方。 (2认同)

ila*_*lan 10

您可以使用以下方法估算最大批量大小:

最大批量大小=可用GPU内存字节数/ 4 /(张量大小+可训练参数)

  • 如何获得张量的大小和可训练参数的数量?您不是在方程式中缺少模型尺寸吗? (3认同)
  • 什么是张量的_size_?我仍然对那部分感到困惑。 (2认同)
  • @Melike每层都有张量+一个或多个权重矩阵(通常称为可训练参数).例如:如果您使用200x200 RGB图像为网络供电,则输入张量(以字节为单位)的大小为[批量大小]*3*200*200(如果使用64位整数,则为*4) (2认同)

0-_*_*_-0 6

使用 pytorchsummary (pip install) 或 keras (builtin) 提供的摘要。

例如

from torchsummary import summary
summary(model)
.....
.....
================================================================
Total params: 1,127,495
Trainable params: 1,127,495
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.02
Forward/backward pass size (MB): 13.93
Params size (MB): 4.30
Estimated Total Size (MB): 18.25
----------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

您放入批处理中的每个实例都需要在内存中进行完整的向前/向后传递,您的模型只需要一次。人们似乎更喜欢 2 的幂的批量大小,可能是因为 GPU 上的自动布局优化。

不要忘记在增加批量大小时线性增加学习率。

假设我们手头有一台配备 16 GB 内存的 Tesla P100。

(16000 - model_size) / (forward_back_ward_size)
(16000 - 4.3) / 18.25 = 1148.29
rounded to powers of 2 results in batch size 1024
Run Code Online (Sandbox Code Playgroud)