RAM耗尽太快

时间:2020-04-26 00:49:42

标签: tensorflow keras ram reinforcement-learning fractals

所以我正在尝试使用此代码的修改版本

https://github.com/snf/keras-fractalnet

使用密集层512、128、32、8而不是卷积层的

。我相信原始版本使用(63,3,3),(128,3,3),(256,3,3),(512,3,3),(512,3,3)。由于使用的4个块的宽度为3,所以如果我是正确的话,则在我的版本中总共使用了4536个节点。另外,除了最后一块的最后一行之外,所有层都使用tanh激活。

我在具有16GB RAM的Ubuntu 18.04上运行,但是我注意到它(运行keras以及TF2)执行train_on_batch之后,可用内存从free -m命令上的13232降至9718,然后继续减少每20集后第一次调用train_on_batch的费用。

现在,我对Tensorflow还是陌生的,但是每次调用train_on_batch时大约减少3GB(如果我没看错的话)对我来说似乎有点极端,所以我希望有人可以告诉我我的数量是否节点似乎有点极端?或者,也许可以为我找寻正确的方向?如果您愿意,我可以发布代码,但是我也尝试使用pat-coady的TRPO代码的修改版本,该代码使用PyBullet来构建NN,这意味着它很长,但是如果需要,我可以至少在github上分享它。

更新: 这是输入数据的直方图。histogram of input data

更新2:

多亏了Prouast,我已被指示正确的方向,但我仍然有些困惑。当尝试切换到float16而不是float32时,我发现在每个fractal_net调用上都会创建1000个新的密集层。但是,我只能通过在代码中同时显示有关float32和float16值的警告来看到这一点。因此,我更改了代码以一次初始化20个密集层,然后在每次调用fractal_net时都使用它们。这似乎有点奏效,因为在train_on_batch调用中释放2 + Gb RAM的频率降低了。但它仍然在这里和那里。

所以我的下一个问题是,无论如何,要让子类化模型报告当前正在使用多少密集层并占用RAM?我将尝试再次重新创建float16 vs float32警告,因为我忘记了它们是如何创建的,但我希望有更直接的方法来查看模型的大小。

在调用train_on_batch之前和之后,我已经检查了权重,但我担心的是权重没有更新。

2 个答案:

答案 0 :(得分:0)

密集层比卷积层具有更多的参数,因为它们与每个神经元都有联系,而卷积层具有稀疏的连通性。

如果要减少训练期间使用的内存量,可以尝试

  • 减小批次大小
  • 减少密集层中的单元数或密集层数
  • 切换回使用卷积层
  • 使用较低的浮点精度(例如,用fp16代替fp32),但这比其他可能性要花更多的精力

答案 1 :(得分:0)

我终于找到了为什么如此大量使用内存的罪魁祸首。事实证明,问题出在代码行:tf.random.shuffle(arr,seed)

我仍然不确定为什么会引起这么多问题,但是我有一个假设。我的猜测是,由于其余代码使用的是Keras后端,而本部分直接使用Tensorflow而不是通过Keras,这会导致很多棘手的问题。也许其他人会更好地解释当您尝试直接同时使用Tensorflow和Keras时会发生什么

更新: 似乎有时使用Keras后端也会招致大量内存使用方面的损失。但仅适用于某些命令。例如,在我的代码中,K.switch,K.not_equal,K.equal和K.random_binomial似乎随着时间的推移(不太剧烈)增加了内存使用量。但是,当我只用numpy命令替换这些部件时,它就没有了(它确实在开始时就减少了更多的内存,但是随后将停止消耗更多的内存)。

这很奇怪,因为并不是所有的后端命令都会减少内存使用量。例如,K.in_train_phase似乎对其影响不大。

最后一条评论:我不确定这是否与它有关,但是每次初始化另一个类时,这也可能是一个原因,这就是为什么我删除了不必要的类的原因叫了上千遍。

相关问题