Tensorflow分配内存:分配38535168超过系统内存的10%

Posted

技术标签:

【中文标题】Tensorflow分配内存:分配38535168超过系统内存的10%【英文标题】:Tensorflow Allocation Memory: Allocation of 38535168 exceeds 10% of system memory 【发布时间】:2018-10-22 13:40:03 【问题描述】:

使用 ResNet50 预训练的权重我正在尝试构建一个分类器。代码库完全在 Keras 高级 Tensorflow API 中实现。完整代码发布在下面的 GitHub 链接中。

源代码:Classification Using RestNet50 Architecture

预训练模型的文件大小为94.7mb

我加载了预训练的文件

new_model = Sequential()

new_model.add(ResNet50(include_top=False,
                pooling='avg',
                weights=resnet_weight_paths))

并拟合模型

train_generator = data_generator.flow_from_directory(
    'path_to_the_training_set',
    target_size = (IMG_SIZE,IMG_SIZE),
    batch_size = 12,
    class_mode = 'categorical'
    )

validation_generator = data_generator.flow_from_directory(
    'path_to_the_validation_set',
    target_size = (IMG_SIZE,IMG_SIZE),
    class_mode = 'categorical'
    )

#compile the model

new_model.fit_generator(
    train_generator,
    steps_per_epoch = 3,
    validation_data = validation_generator,
    validation_steps = 1
)

在训练数据集中,我有两个文件夹 dog 和 cat,每个文件夹包含近 10,000 张图像。编译脚本时,出现以下错误

时代 1/1 2018-05-12 13:04:45.847298: W tensorflow/core/framework/allocator.cc:101] 分配38535168 超过系统内存的 10%。 2018-05-12 13:04:46.845021: W tensorflow/core/framework/allocator.cc:101] 分配37171200 超过系统内存的 10%。 2018-05-12 13:04:47.552176: W tensorflow/core/framework/allocator.cc:101] 分配37171200 超过系统内存的 10%。 2018-05-12 13:04:48.199240: W tensorflow/core/framework/allocator.cc:101] 分配37171200 超过系统内存的 10%。 2018-05-12 13:04:48.918930: W tensorflow/core/framework/allocator.cc:101] 分配37171200 超过系统内存的 10%。 2018-05-12 13:04:49.274137: W tensorflow/core/framework/allocator.cc:101] 分配19267584 超过系统内存的 10%。 2018-05-12 13:04:49.647061: W tensorflow/core/framework/allocator.cc:101] 分配19267584 超过系统内存的 10%。 2018-05-12 13:04:50.028839: W tensorflow/core/framework/allocator.cc:101] 分配19267584 超过系统内存的 10%。 2018-05-12 13:04:50.413735: W tensorflow/core/framework/allocator.cc:101] 分配19267584 超过系统内存的 10%。

有什么想法可以优化加载预训练模型(或)摆脱此警告消息的方式吗?

谢谢!

【问题讨论】:

澄清一下,模型是否在这些消息之后运行? 是的,它运行..... 这样的话,看看***.com/a/42121886/6824418 ?除非有其他原因需要减少内存使用量。 【参考方案1】:

尝试将 batch_size 属性减少到一个小数字(如 1,2 或 3)。 示例:

train_generator = data_generator.flow_from_directory(
    'path_to_the_training_set',
    target_size = (IMG_SIZE,IMG_SIZE),
    batch_size = 2,
    class_mode = 'categorical'
    )

【讨论】:

如何减少 batch_size 来解决这个问题? (直观地说,这意味着训练/验证数据占用的内存更少,但我不知道如何!) @Omrii 这是缓存的问题。大多数数据加载器不会始终将所有数据保存在内存中,而且几乎所有数据加载器都不会将重要数据保存在 GPU 内存中。通过减少 batch_size,您可以减少训练的任何步骤所需的数据量,从而允许一次加载更少的数据,并且仍然保持最佳吞吐量。所以不,数据并没有变小,但是是的,它确实占用了更少的 RAM 和视频 RAM。 Tensorflow 在这里很聪明,可以省去你的麻烦。【参考方案2】:

或者,您可以设置环境变量TF_CPP_MIN_LOG_LEVEL=2 以过滤掉信息和警告消息。我在this github issue where they complain about the same output 上发现了这一点。要在 python 中执行此操作,您可以使用来自here 的解决方案:

import os
import tensorflow as tf
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

您甚至可以使用它随意打开和关闭它。在运行我的代码之前,我会测试最大可能的批处理大小,并且我可以在执行此操作时禁用警告和错误。

【讨论】:

这样消息不显示,但问题仍然存在 @VMMF 在我的情况和原始问题的情况下,这不是问题。它只使用了 10% 以上,我明确测试了最大利用率,所以我当然会超过这个。如果您遇到实际上是一个问题的利用率问题,那么您可能需要做更多的工作。减小批量大小。减小图像大小或网络大小,这在问题中的预训练模型中可能是不可撤销的。如果您仍然有问题,我建议您提出一个更符合您遇到的问题的问题,我们将尽最大努力提供帮助。【参考方案3】:

我在 CPU 上运行了一个小型模型并且遇到了同样的问题。添加:os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' 解决了。

【讨论】:

这样消息不显示,但问题仍然存在【参考方案4】:

我在使用 Docker 和 Jupyter notebook 运行 Tensorflow 容器时遇到了同样的问题。我能够通过增加容器内存来解决这个问题。

Mac OS 上,您可以通过以下方式轻松做到这一点:

       Docker Icon > Preferences >  Advanced > Memory

将滚动条拖到最大(例如 4GB)。应用,它将重新启动 Docker 引擎。

现在再次运行您的张量流容器。

在单独的终端中使用docker stats 命令很方便 它实时显示容器内存使用情况,你可以看到有多少内存消耗在增长:

CONTAINER ID   NAME   CPU %   MEM USAGE / LIMIT     MEM %    NET I/O             BLOCK I/O           PIDS
3170c0b402cc   mytf   0.04%   588.6MiB / 3.855GiB   14.91%   13.1MB / 3.06MB     214MB / 3.13MB      21

【讨论】:

【参考方案5】:

我遇到了同样的问题,我得出的结论是,看到此错误时需要考虑两个因素: 1- batch_size ==> 因为这负责每个时期要处理的数据大小 2- image_size ==> 更高的图像尺寸(图像尺寸),更多的数据要处理

因此对于这两个因素,RAM 无法处理所有需要的数据。

为了解决这个问题,我尝试了两种情况: 首先将batch_size形式从32改为3或2 第二次将 image_size 从 (608,608) 减小到 (416,416)

【讨论】:

【参考方案6】:

我遇到了同样的错误,我尝试设置 os.environment 标志...但没有成功。

然后我继续将批量大小从 16 减少到 8,然后它开始正常工作。 因为,train 方法考虑了批量大小……我觉得减小图像大小也可以……如上所述。

【讨论】:

【参考方案7】:

我在 Linux 平台上运行代码时遇到了同样的问题。 我将之前设置为 0 的交换内存大小更改为 1 GB,问题得到了修复。

有关更多详细信息,您可以查阅此链接。

https://linuxize.com/post/create-a-linux-swap-file/

【讨论】:

以上是关于Tensorflow分配内存:分配38535168超过系统内存的10%的主要内容,如果未能解决你的问题,请参考以下文章

用于递归连接的 TensorFlow 高效共享内存分配

TensorFlow 为任何程序分配所有内存

在 TensorFlow 中的 GPU 之间平均分配 RNN 内存消耗

tensorflow.python.framework.errors_impl.ResourceExhaustedError:分配内存失败 [Op:AddV2]

Tensorflow:将 allow_growth 设置为 true 仍然会分配我所有 GPU 的内存

TensorFlow 内存不足