tensorflow.python.framework.errors_impl.ResourceExhaustedError: 内存不足,无法分配空间 [Op:AddV2]

9

你好,我是一个DL和TensorFlow的初学者,

我创建了一个CNN(您可以在下面看到模型),

model = tf.keras.Sequential()

model.add(tf.keras.layers.Conv2D(filters=64, kernel_size=7, activation="relu", input_shape=[512, 640, 3]))
model.add(tf.keras.layers.MaxPooling2D(2))
model.add(tf.keras.layers.Conv2D(filters=128, kernel_size=3, activation="relu"))
model.add(tf.keras.layers.Conv2D(filters=128, kernel_size=3, activation="relu"))
model.add(tf.keras.layers.MaxPooling2D(2))
model.add(tf.keras.layers.Conv2D(filters=256, kernel_size=3, activation="relu"))
model.add(tf.keras.layers.Conv2D(filters=256, kernel_size=3, activation="relu"))
model.add(tf.keras.layers.MaxPooling2D(2))

model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(64, activation='relu'))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(2, activation='softmax'))

optimizer = tf.keras.optimizers.SGD(learning_rate=0.2) #, momentum=0.9, decay=0.1)
model.compile(optimizer=optimizer, loss='mse', metrics=['accuracy'])

我尝试使用CPU构建并训练它,虽然成功完成了(但速度非常慢),所以我决定安装tensorflow-gpu。按照https://www.tensorflow.org/install/gpu中的说明安装了所有内容。
但是现在在尝试构建模型时出现以下错误:
> Traceback (most recent call last):   File
> "C:/Users/thano/Documents/Py_workspace/AI_tensorflow/fire_detection/main.py",
> line 63, in <module>
>     model = create_models.model1()   File "C:\Users\thano\Documents\Py_workspace\AI_tensorflow\fire_detection\create_models.py",
> line 20, in model1
>     model.add(tf.keras.layers.Dense(128, activation='relu'))   File "C:\Python37\lib\site-packages\tensorflow\python\training\tracking\base.py",
> line 530, in _method_wrapper
>     result = method(self, *args, **kwargs)   File "C:\Python37\lib\site-packages\keras\engine\sequential.py", line 217,
> in add
>     output_tensor = layer(self.outputs[0])   File "C:\Python37\lib\site-packages\keras\engine\base_layer.py", line 977,
> in __call__
>     input_list)   File "C:\Python37\lib\site-packages\keras\engine\base_layer.py", line 1115,
> in _functional_construction_call
>     inputs, input_masks, args, kwargs)   File "C:\Python37\lib\site-packages\keras\engine\base_layer.py", line 848,
> in _keras_tensor_symbolic_call
>     return self._infer_output_signature(inputs, args, kwargs, input_masks)   File
> "C:\Python37\lib\site-packages\keras\engine\base_layer.py", line 886,
> in _infer_output_signature
>     self._maybe_build(inputs)   File "C:\Python37\lib\site-packages\keras\engine\base_layer.py", line 2659,
> in _maybe_build
>     self.build(input_shapes)  # pylint:disable=not-callable   File "C:\Python37\lib\site-packages\keras\layers\core.py", line 1185, in
> build
>     trainable=True)   File "C:\Python37\lib\site-packages\keras\engine\base_layer.py", line 663,
> in add_weight
>     caching_device=caching_device)   File "C:\Python37\lib\site-packages\tensorflow\python\training\tracking\base.py",
> line 818, in _add_variable_with_custom_getter
>     **kwargs_for_getter)   File "C:\Python37\lib\site-packages\keras\engine\base_layer_utils.py", line
> 129, in make_variable
>     shape=variable_shape if variable_shape else None)   File "C:\Python37\lib\site-packages\tensorflow\python\ops\variables.py",
> line 266, in __call__
>     return cls._variable_v1_call(*args, **kwargs)   File "C:\Python37\lib\site-packages\tensorflow\python\ops\variables.py",
> line 227, in _variable_v1_call
>     shape=shape)   File "C:\Python37\lib\site-packages\tensorflow\python\ops\variables.py",
> line 205, in <lambda>
>     previous_getter = lambda **kwargs: default_variable_creator(None, **kwargs)   File "C:\Python37\lib\site-packages\tensorflow\python\ops\variable_scope.py",
> line 2626, in default_variable_creator
>     shape=shape)   File "C:\Python37\lib\site-packages\tensorflow\python\ops\variables.py",
> line 270, in __call__
>     return super(VariableMetaclass, cls).__call__(*args, **kwargs)   File
> "C:\Python37\lib\site-packages\tensorflow\python\ops\resource_variable_ops.py",
> line 1613, in __init__
>     distribute_strategy=distribute_strategy)   File "C:\Python37\lib\site-packages\tensorflow\python\ops\resource_variable_ops.py",
> line 1740, in _init_from_args
>     initial_value = initial_value()   File "C:\Python37\lib\site-packages\keras\initializers\initializers_v2.py",
> line 517, in __call__
>     return self._random_generator.random_uniform(shape, -limit, limit, dtype)   File
> "C:\Python37\lib\site-packages\keras\initializers\initializers_v2.py",
> line 973, in random_uniform
>     shape=shape, minval=minval, maxval=maxval, dtype=dtype, seed=self.seed)   File
> "C:\Python37\lib\site-packages\tensorflow\python\util\dispatch.py",
> line 206, in wrapper
>     return target(*args, **kwargs)   File "C:\Python37\lib\site-packages\tensorflow\python\ops\random_ops.py",
> line 315, in random_uniform
>     result = math_ops.add(result * (maxval - minval), minval, name=name)   File
> "C:\Python37\lib\site-packages\tensorflow\python\util\dispatch.py",
> line 206, in wrapper
>     return target(*args, **kwargs)   File "C:\Python37\lib\site-packages\tensorflow\python\ops\math_ops.py",
> line 3943, in add
>     return gen_math_ops.add_v2(x, y, name=name)   File "C:\Python37\lib\site-packages\tensorflow\python\ops\gen_math_ops.py",
> line 454, in add_v2
>     _ops.raise_from_not_ok_status(e, name)   File "C:\Python37\lib\site-packages\tensorflow\python\framework\ops.py",
> line 6941, in raise_from_not_ok_status
>     six.raise_from(core._status_to_exception(e.code, message), None)   File "<string>", line 3, in raise_from
> tensorflow.python.framework.errors_impl.ResourceExhaustedError: failed
> to allocate memory [Op:AddV2]

有什么想法,可能是什么问题?

1
你使用的是哪款GPU,它有多少VRAM?此外,在训练模型时你使用的batch_size是多少? - evantkchong
1
请分享您的训练代码。 - Rafael-WO
5个回答

7
错误消息告诉你无法分配所需的VRAM。最简单的解决方法是将batch-size减小到可以适应GPU的VRAM的数字。

4
您收到的错误信息 tensorflow.python.framework.errors_impl.ResourceExhaustedError: failed to allocate memory [Op:AddV2] 可能意味着您的GPU内存不足以运行您想要运行的训练作业。请问您使用的是哪种GPU?它有多少vRAM?
在训练时出现“内存不足”(OOM)错误时,最简单的方法是降低批量大小(batch_size)的超参数
除了试错之外,没有一种简单的确定在训练时可以使用的最大batch_size以适应GPU可用的vRAM的方法。通常的规则是使用2的幂次方(例如81632)。

1
谢谢您的回复!是的,根据错误信息来看这很有道理,但是错误出现在创建模型的第一个密集层时。它没有到达训练阶段,所以我不认为问题在于batch_size。(顺便说一下,我使用了sgd优化器。那是一次训练实例,对吧?) GPU:GTX 1050,专用视频内存=2048MB,总视频内存=10206MB。 - Thanos
@Thanos 如果您能分享您的训练代码,我们将更容易地帮助您。如果它足够短,您可以编辑原始问题以包含它,或者包含指向您的代码存储库的GitHub链接。 - evantkchong
  1. 啊,我错过了那个。2GB的视频内存不算多,但应该足够Tensorflow构建您的第一个密集层的权重。您可以尝试通过关闭一些其他应用程序来释放视频内存。
  2. 优化器不确定批量大小,这是在调用训练函数时确定的,通常是Model.fit(),请参见文档并注意batch_size参数
- evantkchong
即使模型很简单,对于GTX 1050来说,输入分辨率似乎相当高,您尝试过减少[512、640、3]参数吗? - Mr K.
@MrK. 不,我还没有尝试过这个。 - Thanos
在更多地使用tf后,我有一些观察结果。 当使用GPU时,我发现(从Windows 10资源监视器中)GPU的内存在我加载数据集的时候被填满。但只有真正的GPU内存(1.9GB),而不是VRAM。我尝试使用tfRecords、keras_image_data_generator和numpy数组,它们都会在加载数据集时填充GPU内存。 然而,在训练期间,tfRecords和keras数据生成器对于一些简单的模型可以胜任。当我说简单的时候,我的意思是第一个密集层最多只有32个神经元。超过这个数量的话,在训练期间会出现OOM错误。 - Thanos

0
在我的情况下,批量大小不是问题。我之前运行的脚本,在脚本成功运行后,GPU内存仍然被分配。我使用nvidia-smi命令进行了验证,并发现15GB vram中有14GB被占用。因此,为了释放vram,您可以运行以下脚本,然后尝试使用相同的批量大小再次运行代码。
from numba import cuda
cuda.select_device(0)
cuda.close()

0

由于这意味着内存不足的情况,你应该尝试的第一件事是减少批处理大小。如果您的训练数据集非常大,则也可能发生这种情况。您可以尝试在训练数据的子集上训练模型,并查看是否有所帮助。


0

如果您有大量的训练样本,可能会出现ResourceExhaustedError

tensorflow中的ResourceExhaustedError

例如,如果超过了每个用户的配额,或者整个文件系统已满,则可能会引发此错误。

如何解决此错误:

  • 使用fit方法训练模型时,设置较小的batch_size

batch_size:整数或无。每个梯度更新的样本数。

这意味着批处理大小越大,训练所需的内存就越多。

  • 如果您正在使用Jupyter笔记本,请尝试重新启动内核
重新启动内核将重置您的笔记本电脑并删除您定义的变量或方法分配的所有内存!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接