如何解决 keras 上的错误“分配超过 10 的系统内存”?

Posted

技术标签:

【中文标题】如何解决 keras 上的错误“分配超过 10 的系统内存”?【英文标题】:How can I solve error "allocation exceeds 10 of system memory" on keras? 【发布时间】:2019-06-06 02:08:09 【问题描述】:

我在 Keras 上使用 Tensorflow 后端制作了一个 CNN,我的训练集有 144 个示例,但每个示例的大小为 3200*101。我的 CNN 非常基础,仅用于学习,batch_size 为 2(我尝试将其从 32 减少,但没有任何改进)。一层 CNN 层、一层展平层和一层密集层用于输出(11 类)。当我安装模型时,我的笔记本电脑显示“分配(一个大数字)超过 10 个系统内存”然后冻结,即使没有运行 1 个 epoch。我不能“压缩”这些例子,它们中的每一个都必须有这个大小。我在我的 CPU(我没有 GPU)、8 gb 内存、1 tb 磁盘上运行模型。我能做什么?

Psdt:抱歉英语不好,我还在学习。并感谢您的任何回答!

更新编辑:只是添加更多信息。

对于示例,我的火车集的形状为 (144, 3400, 101, 1),而标签的形状为 (144,11) 我的模型是这样的:

model.add(Conv2D(8, kernel_size=6, activation='linear', input_shape=(3400,101,1), batch_size=2))
model.add(Flatten())
model.add(Dense(11, activation='softmax'))
model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=100)

【问题讨论】:

对于该输入大小,您可能希望拥有一台具有更多 RAM 的计算机。 8 GB 可能还不够。 根据您添加的信息很难回答您的问题。添加更多关于它的信息,比如模型架构的代码,层输入的维度是多少。这可能不是内存问题,但可能是您向其提供数据的方式。 我刚刚更新了我的问题,添加了输入尺寸和模型 【参考方案1】:

在 Keras 的普通前馈网络中使用非常长的输入编码时,这看起来与我遇到的错误相同。我一直在使用词嵌入,没有问题,但现在我在输入中添加了额外的功能,我得到了和你一样的错误。 您需要启用更多内存以供脚本使用。 在 kubernetes 中对我有用的是增加我的 pod 的 yml 文件中的内存:

spec:
  containers:
  - name: yourname
    image: yourimage
    command: yourcommand
    args: yourargs
    resources:
      limits:
         nvidia.com/gpu: 1 # requesting 1 GPU
         memory: 100Gi

它最初是 8G,在我介绍附加功能之前它已经工作了。 如果您不使用 docker 和 K8s,则可以在 tensorflow 会话中执行此操作,而不是: config.gpu_options.allow_growth = True

在 Keras 中,我认为应该是:

import tensorflow as tf
from keras import backend as K
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
config.log_device_placement = True
session = tf.Session(config=config)
K.set_session(session)
# do your ML task
K.get_session().close();

batch_size 减少到 1 可能会解决问题。 通常,此错误只是一个警告,即使作业冻结,如果您让它继续运行,它也可能会完成。如果这项工作被终止了(就像我的工作一样),那么你肯定需要给它更多的内存,而 GPU 服务器可能比你的笔记本电脑更好。您还可以确保您使用的是float32 而不是float64,因为这样会使用双倍的内存。此外,据我所知,此错误通常出现在 Adam 优化器中,因此您使用 SGD 的事实意味着问题可能不在您的优化过程中。

【讨论】:

【参考方案2】:
sudo swapoff /swapfile
sudo rm  /swapfile
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

swapon -s

以上步骤产生 32G 交换空间。然后运行您的深度学习代码。我的很好用。

我的笔记本电脑规格是 HP 430 g2 4G 内存 + 500 G SSD

【讨论】:

以上是关于如何解决 keras 上的错误“分配超过 10 的系统内存”?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 tensorflow.keras 中的值错误?

如何从 wine 数据集中解决 Keras 神经网络实现中的错误

在 Keras 中使用自定义步骤激活函数会导致“'tuple' object has no attribute '_keras_shape'”错误。如何解决这个问题?

在谷歌 colab 中使用带有 TPU 的 Keras 调谐器搜索方法时如何解决“从空列表中弹出”错误?

当 input_shape 指定为 3-d 时,Keras SimpleRNN 上的错误

keras上的多GPU训练错误(OOM)(足够的内存,可能是配置问题)