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

smdncfj3  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(197)

我用Tensorflow后端在Keras上做了一个CNN,我的训练集有144个例子,但是每个例子的大小都是3200*101。我的CNN非常基本,只是为了学习,batch_size为2(我试着把它从32减少,但没有任何改善)。一个CNN图层,一个平面图层和一个密集图层用于输出(11个类)。当我拟合模型时,我的笔记本电脑显示“分配(一个大数字)超过10的系统内存”,然后冻结,甚至没有运行1个历元。我不能“压缩”的例子,我运行的是我的CPU(我没有GPU),8 GB内存,1 TB磁盘上的模型。我能做什么?
对不起,我的英语不好,我还在学习中。谢谢你的回答!
更新-编辑:只是添加更多信息。
例如,我的火车集的形状为(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)
ddhy6vgd

ddhy6vgd1#

sudo swapoff /swapfile
sudo rm  /swapfile
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

swapon -s

以上步骤使32G交换空间。然后运行你的深度学习代码。我的工作很好。
我的笔记本电脑规格是惠普430 g2 4G内存+ 500 G固态硬盘

mbzjlibv

mbzjlibv2#

这看起来和我在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
在凯拉斯,我想那会是:

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的事实意味着问题可能不在优化过程中。

相关问题