【问题标题】:RAM depleted too fastRAM 耗尽过快
【发布时间】:2020-04-26 00:49:42
【问题描述】:

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

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

使用 Dense 层 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上。

更新: 这是输入数据的直方图。

更新 2:

感谢 prouast,我已经指出了正确的方向,但我仍然有点困惑。在尝试切换到 float16 而不是 float32 时,我发现每次调用 fractal_net 都会创建 1000 个新的密集层。但是,我只能通过在我的代码中开始出现关于同时使用 float32 和 float16 值的警告来看到这一点。所以我更改了代码,将 20 个密集层初始化一次,然后在每次调用 fractal_net 时使用它们。这似乎有点工作,因为在 train_on_batch 调用上丢失 2+Gb 的 RAM 变得不那么频繁了。但它仍然在这里和那里。

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

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

【问题讨论】:

    标签: tensorflow keras ram reinforcement-learning fractals


    【解决方案1】:

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

    如果你想减少训练时使用的内存量,你可以试试

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

    【讨论】:

    • 您好,感谢您的快速回复!我实际上通过用 28 个密集层 (512->128->32->8) 替换分形网的东西来测试代码,这应该与宽度为 3 的分形网代码的参数数量相同(我认为)但是它使用的内存要少得多。因此,分形网络代码中必须有一些东西,这样当 NN 被多次调用时,就会以某种方式开始生成数千个额外的数字。而且我认为连接层是唯一不同于我创建的 28 个密集层的东西。所以我不确定他们是否可能是问题的根源?
    • 您的问题到底是什么?此外,如果您提供了代码,可能会更容易回答。
    • 好的,我已经在这个 github 站点上上传了适当的 train、policy 和 fractalNN 代码:github.com/ryanmaxwell96/trpo_fractal1NN_3 策略代码的结构为具有类 Policy->TRPO->PolicyNN、LogProb、KLEntropy 和PolicyNN 类是我将 fractal_net 代码插入的类。我的主要问题是,为什么 self.trpo.train_on_batch 占用这么多内存?
    • 分形代码使用“layersizes”构建分形结构,从上到下,从左到右,最左边一列有 4 个 Dense 层,中间一列有 2 个 Dense 层,最右边有 1 个列。
    • 抱歉,还有一条评论。 Fractalnet 被调用了数千次,我知道 train.py 中的轨迹确实很大,但它在 pat-coady 的代码中并且似乎工作正常,即使我已经提到过 28 层(512,128,32,8)。这是他的代码,我修改了 policy.py 函数github.com/pat-coady/trpo
    【解决方案2】:

    我终于找到了为什么内存被如此频繁地使用的罪魁祸首。原来问题出在这行代码: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 似乎对其影响不大。

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

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 2020-03-27
      • 2016-06-09
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 2016-04-18
      • 1970-01-01
      相关资源
      最近更新 更多