tensorflow.python.framework.errors_impl.ResourceExhaustedError: не удалось выделить память [Op: AddV2]

#python #tensorflow #deep-learning #conv-neural-network #gpu

Вопрос:

Привет, я новичок в 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'])
 

Я попытался создать и обучить его с помощью процессора, и он был успешно завершен (но очень медленно), поэтому я решил установить 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:UsersthanoDocumentsPy_workspaceAI_tensorflowfire_detectioncreate_models.py",
> line 20, in model1
>     model.add(tf.keras.layers.Dense(128, activation='relu'))   File "C:Python37libsite-packagestensorflowpythontrainingtrackingbase.py",
> line 530, in _method_wrapper
>     result = method(self, *args, **kwargs)   File "C:Python37libsite-packageskerasenginesequential.py", line 217,
> in add
>     output_tensor = layer(self.outputs[0])   File "C:Python37libsite-packageskerasenginebase_layer.py", line 977,
> in __call__
>     input_list)   File "C:Python37libsite-packageskerasenginebase_layer.py", line 1115,
> in _functional_construction_call
>     inputs, input_masks, args, kwargs)   File "C:Python37libsite-packageskerasenginebase_layer.py", line 848,
> in _keras_tensor_symbolic_call
>     return self._infer_output_signature(inputs, args, kwargs, input_masks)   File
> "C:Python37libsite-packageskerasenginebase_layer.py", line 886,
> in _infer_output_signature
>     self._maybe_build(inputs)   File "C:Python37libsite-packageskerasenginebase_layer.py", line 2659,
> in _maybe_build
>     self.build(input_shapes)  # pylint:disable=not-callable   File "C:Python37libsite-packageskeraslayerscore.py", line 1185, in
> build
>     trainable=True)   File "C:Python37libsite-packageskerasenginebase_layer.py", line 663,
> in add_weight
>     caching_device=caching_device)   File "C:Python37libsite-packagestensorflowpythontrainingtrackingbase.py",
> line 818, in _add_variable_with_custom_getter
>     **kwargs_for_getter)   File "C:Python37libsite-packageskerasenginebase_layer_utils.py", line
> 129, in make_variable
>     shape=variable_shape if variable_shape else None)   File "C:Python37libsite-packagestensorflowpythonopsvariables.py",
> line 266, in __call__
>     return cls._variable_v1_call(*args, **kwargs)   File "C:Python37libsite-packagestensorflowpythonopsvariables.py",
> line 227, in _variable_v1_call
>     shape=shape)   File "C:Python37libsite-packagestensorflowpythonopsvariables.py",
> line 205, in <lambda>
>     previous_getter = lambda **kwargs: default_variable_creator(None, **kwargs)   File "C:Python37libsite-packagestensorflowpythonopsvariable_scope.py",
> line 2626, in default_variable_creator
>     shape=shape)   File "C:Python37libsite-packagestensorflowpythonopsvariables.py",
> line 270, in __call__
>     return super(VariableMetaclass, cls).__call__(*args, **kwargs)   File
> "C:Python37libsite-packagestensorflowpythonopsresource_variable_ops.py",
> line 1613, in __init__
>     distribute_strategy=distribute_strategy)   File "C:Python37libsite-packagestensorflowpythonopsresource_variable_ops.py",
> line 1740, in _init_from_args
>     initial_value = initial_value()   File "C:Python37libsite-packageskerasinitializersinitializers_v2.py",
> line 517, in __call__
>     return self._random_generator.random_uniform(shape, -limit, limit, dtype)   File
> "C:Python37libsite-packageskerasinitializersinitializers_v2.py",
> line 973, in random_uniform
>     shape=shape, minval=minval, maxval=maxval, dtype=dtype, seed=self.seed)   File
> "C:Python37libsite-packagestensorflowpythonutildispatch.py",
> line 206, in wrapper
>     return target(*args, **kwargs)   File "C:Python37libsite-packagestensorflowpythonopsrandom_ops.py",
> line 315, in random_uniform
>     result = math_ops.add(result * (maxval - minval), minval, name=name)   File
> "C:Python37libsite-packagestensorflowpythonutildispatch.py",
> line 206, in wrapper
>     return target(*args, **kwargs)   File "C:Python37libsite-packagestensorflowpythonopsmath_ops.py",
> line 3943, in add
>     return gen_math_ops.add_v2(x, y, name=name)   File "C:Python37libsite-packagestensorflowpythonopsgen_math_ops.py",
> line 454, in add_v2
>     _ops.raise_from_not_ok_status(e, name)   File "C:Python37libsite-packagestensorflowpythonframeworkops.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. Какой графический процессор вы используете и сколько у него видеопамяти? Также что batch_size вы используете при обучении модели?

2. Пожалуйста, поделитесь своим кодом для обучения

Ответ №1:

Ошибка сообщает вам, что не удалось выделить столько видеопамяти, сколько вы используете. Самый простой способ преодолеть такого рода проблемы — уменьшить размер пакета до числа, которое помещается в видеопамять вашего графического процессора.

Ответ №2:

Полученное вами сообщение об ошибке tensorflow.python.framework.errors_impl.ResourceExhaustedError: failed to allocate memory [Op:AddV2] может указывать на то, что вашему графическому процессору недостаточно памяти для задания обучения, которое вы хотите запустить. Какой графический процессор вы используете и сколько у него видеопамяти?

Когда дело доходит до ошибок «из памяти» (ООМ) при обучении, самое простое, что можно сделать, это уменьшить batch_size гиперпараметр.

Нет простого способа определить, какой самый большой batch_size вы можете использовать во время обучения, который будет соответствовать доступной видеопамяти вашего графического процессора, кроме метода проб и ошибок. Однако общим правилом является использование степени 2 (например 8 , 16 , 32 ).

Комментарии:

1. Спасибо за ответ! Да, это имеет смысл на основе сообщения об ошибке, но ошибка возникает при создании модели во время первого плотного слоя. Он не достигает фазы обучения, поэтому я не думаю, что проблема в batch_size. (кстати, я использовал sgd optimizer. это один обучающий экземпляр за раз, верно?) Графический процессор: GTX 1050, выделенная видеопамять = 2048 МБ, общая видеопамять = 10206 МБ

2. @Thanos Нам будет проще всего помочь вам, если вы поделитесь своим обучающим кодом. Если он достаточно короткий, вы можете отредактировать исходный вопрос, чтобы включить его, или включить ссылку на репозиторий GitHub с вашим кодом.

3. 1. Ах да, я это пропустил. 2 ГБ видеопамяти — это немного, но этого должно быть достаточно, чтобы Tensorflow построил веса для вашего первого плотного слоя. Не могли бы вы попробовать освободить свою видеопамять, отключив некоторые другие приложения? 2. Оптимизатор не определяет размер пакета, который определяется при вызове вашей обучающей функции, что обычно и происходит Model.fit() , см. Документацию и обратите внимание на batch_size аргумент

4. Даже если модель проста, разрешение ввода кажется мне довольно высоким для GTX 1050, вы тоже пытались уменьшить параметры [512, 640, 3]?

5. @MrK. нет, я этого не пробовал.