如何在 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 数据集训练模型。我的解决方法是使用yield
、indices
和lookback
创建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 中将损失函数指定为二次加权 kappa?
如何在 scikit-learn 管道中将时代添加到 Keras 网络
如何在 Keras 中将 report_tensor_allocations_upon_oom 添加到 RunOptions