如何在 Keras 中将 report_tensor_allocations_upon_oom 添加到 RunOptions

Posted

技术标签:

【中文标题】如何在 Keras 中将 report_tensor_allocations_upon_oom 添加到 RunOptions【英文标题】:How to add report_tensor_allocations_upon_oom to RunOptions in Keras 【发布时间】:2018-09-14 21:16:09 【问题描述】:

我正在尝试使用 Keras 在 GPU 上训练神经网络,但出现“资源耗尽:分配张量时出现 OOM”错误。它试图分配的特定张量不是很大,所以我假设以前的一些张量消耗了几乎所有的 VRAM。错误消息带有暗示这一点的提示:

提示:如果您想在 OOM 发生时查看已分配张量的列表,请将 report_tensor_allocations_upon_oom 添加到 RunOptions 以获取当前分配信息。

听起来不错,但我该怎么做呢? RunOptions 似乎是 Tensorflow 的东西,我能找到的很少文档将它与“会话”相关联。我使用的是 Keras,所以 Tensorflow 隐藏在一个抽象层之下,它的会话隐藏在该抽象层之下。

如何深入了解所有内容以设置此选项以使其生效?

【问题讨论】:

【参考方案1】:

得到了同样的错误,但只是以防万一,训练数据集与我的 GPU 内存大致相同。例如,使用 4 Gb 视频卡内存,我可以使用 ~3.5 GB 数据集训练模型。我的解决方法是使用yieldindiceslookback 创建data_generator 自定义函数。 有人建议我的另一种方法是开始学习真正的 tensorflow 框架和with tf.Session (example)。

【讨论】:

【参考方案2】:

TF1 解决方案:

它并不像看起来那么难,你需要知道的是,根据documentation,传递给model.compile的**kwargs参数将传递给session.run

所以你可以这样做:

import tensorflow as tf
run_opts = tf.RunOptions(report_tensor_allocations_upon_oom = True)

model.compile(loss = "...", optimizer = "...", metrics = "..", options = run_opts)

并且每次调用session.run时都应该直接传递。

TF2:

上述解决方案仅适用于 tf1.不幸的是,对于 tf2,似乎还没有简单的解决方案。

【讨论】:

我使用了 options=run_opts,因为这是一个 kwargs 的东西,而且有效 @Matias Valdenegro 我得到ValueError: ('Some keys in session_kwargs are not supported at this time: %s', dict_keys(['options']))。知道我做错了什么吗? 我遇到了同样的问题。使用keras 2.2.4版本……有什么解决办法吗? 另外,我收到了这个错误'Protocol message RunOptions has no "report_tensor_allocations_upon_oom" field.' 由于某种原因导致我出现分段错误:[1] 3957 segmentation fault python oom_net.py【参考方案3】:

OOM 表示内存不足。可能是当时正在使用更多的内存。 显着减小 batch_size。我设置为 16,然后它工作正常

【讨论】:

这是否可行,以及合适的批量大小将完全取决于相关模型以及数据集。如果尝试调试不依赖于批量大小的内存问题,这根本没有帮助。【参考方案4】:

目前,无法将选项添加到model.compile。见:https://github.com/tensorflow/tensorflow/issues/19911

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。

以上是关于如何在 Keras 中将 report_tensor_allocations_upon_oom 添加到 RunOptions的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 中将顺序模型添加到预训练模型?

如何在 Keras 中将损失函数指定为二次加权 kappa?

如何在 Keras 中将标量添加到张量或从标量创建张量?

如何在keras中将三维数组转换为五维数组[重复]

如何在 scikit-learn 管道中将时代添加到 Keras 网络

如何在 Keras 中将 report_tensor_allocations_upon_oom 添加到 RunOptions