【问题标题】:Why does "load_model" cause RAM memory problems while predicting?为什么“load_model”在预测时会导致 RAM 内存问题?
【发布时间】:2021-09-13 10:11:36
【问题描述】:

我训练了神经网络(变压器架构)并使用以下方法保存了它:

model.save(directory + args.name, save_format="tf")

之后,我想用另一个脚本再次加载模型,通过让它进行迭代预测来测试它:

from keras.models import load_model

model = load_model(args.model)
for i in range(very_big_number):
    out, _ = model(something, training=False)

但是,我注意到每次预测都会增加 RAM 使用量,但我不知道为什么。在某些时候程序停止,因为没有更多的可用内存。您还可以在以下屏幕截图中看到 RAM 消耗:

如果我使用相同的架构,但只使用model.load_weigts( ... ) 加载模型的权重,我没有问题。

我现在的问题是,为什么load_model 似乎会导致这个问题,我该如何解决这个问题?

我使用的是 tensorflow 2.5.0。

编辑:

由于我无法解决问题并且答案也无济于事,我只是使用load_weights 方法创建了一个新模型并像这样加载已保存模型的权重:

model = myModel()
saved_model = load_model(args.model)
model.load_weights(saved_model + "/variables/variables")

这样,RAM 的使用率保持不变。然而,在我看来,这是一个非最佳解决方案。

【问题讨论】:

  • 您是每次都加载模型,必须预测,还是加载一次并根据数据序列进行预测?
  • 我只加载模型一次
  • 好的,我试着在下面回答你的问题:)

标签: python tensorflow tensorflow2.0


【解决方案1】:

load_modelload_weights 之间存在根本区别。当您使用 save_model 保存模型时,您会保存以下内容:

一个 Keras 模型由多个组件组成:

  • 架构或配置,用于指定模型包含哪些层以及它们的连接方式。
  • 一组权重值(“模型的状态”)。
  • 优化器(通过编译模型定义)。
  • 一组损失和指标(通过编译模型或调用 add_loss() 或 add_metric())。

但是,当您使用 save_weights 保存权重时,您只会保存权重,这对于 inference 的目的很有用,而当您想要恢复训练过程时,您需要一个 model 对象,即是我们将所有内容保存在模型中的原因。当您只想预测并获得结果时,save_weights 就足够了。想了解更多,可以查看save/load models的文档。

因此,正如您在执行load_model 时所看到的,与load_weights 相比,它需要加载很多东西,因此它会产生更多的开销,从而导致您的RAM 使用量。

【讨论】:

  • 感谢您的回答。我知道存储的数据要多得多,因此在使用save_model 时也会更多地使用 RAM。正如您在上面的代码中看到的,我只加载模型一次,只让它迭代预测,这实际上不应该增加 RAM。但是,每次迭代时,RAM 使用量都会奇怪地增加,我认为您的解决方案不能解决这种行为。
  • 是的,好吧,something 是您的批量输入吗?
  • 另外,似乎有一个已知问题:github.com/tensorflow/tensorflow/issues/33030 请检查某些解决方案是否适用于您。
  • gc.collect() 后跟 Keras Clear Session 也可能有效,但您必须自己检查,因为很难找出问题所在:medium.com/dive-into-ml-ai/…
  • 是的,其实是比较复杂的代码,我这里已经大大简化了。我不认为这应该是一个问题,因为代码不会像已经描述的那样对model.load_weights 造成任何问题。所以问题似乎出在load_model 上。看起来好像图表(或它后面的任何东西)在每次迭代后都没有重置,因此用于计算旧输入的空间不会重新分配。
猜你喜欢
  • 2020-11-18
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多