首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何计算最佳批次尺寸

如何计算最佳批次尺寸
EN

Stack Overflow用户
提问于 2017-10-09 20:25:09
回答 5查看 54.4K关注 0票数 40

有时我会遇到一个问题:

代码语言:javascript
运行
复制
OOM when allocating tensor with shape

例如:

代码语言:javascript
运行
复制
OOM when allocating tensor with shape (1024, 100, 160)

1024是我的批号,我不知道剩下的是什么。如果我减少了模型中的批次大小或神经元数量,它就运行得很好。

是否有一种基于模型和GPU内存计算最佳批处理大小的通用方法,这样程序就不会崩溃?

简而言之:我希望在我的模型中尽可能大的批处理大小,这将适合我的GPU内存,不会使程序崩溃。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-10-09 23:33:19

您可以使用以下方法估计最大批次大小:

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

票数 26
EN

Stack Overflow用户

发布于 2017-10-09 22:27:55

摘自古德费罗等人最近出版的“深度学习”一书,第八章

小型批次的大小通常由以下因素驱动:

  • 更大的批次提供了一个更精确的梯度估计,但没有线性回报。
  • 多核体系结构通常被极小的批处理所未充分利用。这就激发了使用一些绝对最小批量大小的动机,在此以下,处理小型批处理的时间不会减少。
  • 如果批处理中的所有示例都是并行处理的(通常是这样的),那么内存量与批处理大小成比例。对于许多硬件设置来说,这是批处理大小的限制因素。
  • 一些硬件通过使用fic#大小的数组来实现更好的运行时。特别是在使用GPU时,通常使用两个批处理大小的电源来提供更好的运行时。典型的2批大小的功率范围从32到256,其中16有时尝试大型号。
  • 小批次可以提供正规化效应(Wilson和Martinez,2003),也许是因为它们给学习过程增加了噪音。当批数为1时,泛化误差往往是最好的。由于梯度估计的方差很大,使用这样小的批次大小的训练可能需要较小的学习速率来保持稳定性。由于需要执行更多的步骤,总运行时可能非常高,这既是因为学习速度降低,也是因为它需要更多步骤来观察整个培训集。

在实践中,这通常意味着“以2的幂和越大越好,只要批处理符合您的(GPU)内存”。

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

请记住Keskar等人的论文。上面的几篇文章引用了“论深度学习的大批次训练:泛化差距与锐利最小”,它得到了其他值得尊敬的深度学习社区的研究人员的一些反对意见

希望这能帮上忙。

更新(2017年12月):

有一篇由Yoshua Bengio & team,影响SGD最小in的三个因素 (2017年11月)发表的新论文,值得一读,因为它报告了关于学习率与批次大小之间相互作用的新的理论和实验结果。

更新(2021年3月):

令人感兴趣的还有2018年的另一篇论文,深度神经网络小批量训练的再探讨 (h/t to Nicolas ),它违背了更大的、更好的建议,引用了抽象的话:

m=2和m=32之间的小批量大小一直以来都是性能最好的,这与最近提倡使用数千个小批量尺寸的工作形成了鲜明的对比。

票数 39
EN

Stack Overflow用户

发布于 2020-01-26 23:13:24

使用pytorch汇总(pip )或keras (内置)提供的摘要。

例如。

代码语言:javascript
运行
复制
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
----------------------------------------------------------------

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

当增加批次大小时,不要忘记线性地增加您的学习速率。

假设我们手头有一个带有16 GB内存的Tesla P100。

代码语言:javascript
运行
复制
(16000 - model_size) / (forward_back_ward_size)
(16000 - 4.3) / 18.25 = 1148.29
rounded to powers of 2 results in batch size 1024
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46654424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档