#keras #memory-management #conv-neural-network #gpu #google-colaboratory
Вопрос:
Я хотел знать, есть ли способ освободить память GPU в Google Colab.
Я тренирую некоторые CNN в цикле с eurosat/rgb/
набором данных из tf.datasets
. Модели не настолько велики, как и набор данных.
Ошибка заключается в следующем:
Epoch 1/8 --------------------------------------------------------------------------- ResourceExhaustedError Traceback (most recent call last) lt;ipython-input-15-c4badfe8da7dgt; in lt;modulegt;() 27 nclasses=NCLASSES, 28 metadic = METADIC, ---gt; 29 val_split = 0.20) 30 plot_results(record=current_exp,run='avg',batch=False,save=True) 31 plot_results(record=current_exp,run='avg',batch=True,save=True) 7 frames lt;ipython-input-6-f1fac48c4ac9gt; in run_experiment(bloques, input_shape, init_conv_filters, batch_size, epochs, init_lr, end_lr, nruns, optimizer, sma_periods, nclasses, metadic, val_split) 75 epochs = epochs, 76 workers = 1, ---gt; 77 callbacks = [LRFinder] 78 ) 79 /usr/local/lib/python3.7/dist-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing) 1182 _r=1): 1183 callbacks.on_train_batch_begin(step) -gt; 1184 tmp_logs = self.train_function(iterator) 1185 if data_handler.should_sync: 1186 context.async_wait() /usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/def_function.py in __call__(self, *args, **kwds) 883 884 with OptionalXlaContext(self._jit_compile): --gt; 885 result = self._call(*args, **kwds) 886 887 new_tracing_count = self.experimental_get_tracing_count() /usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/def_function.py in _call(self, *args, **kwds) 948 # Lifting succeeded, so variables are initialized and we can run the 949 # stateless function. --gt; 950 return self._stateless_fn(*args, **kwds) 951 else: 952 _, _, _, filtered_flat_args = /usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/function.py in __call__(self, *args, **kwargs) 3038 filtered_flat_args) = self._maybe_define_function(args, kwargs) 3039 return graph_function._call_flat( -gt; 3040 filtered_flat_args, captured_inputs=graph_function.captured_inputs) # pylint: disable=protected-access 3041 3042 @property /usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/function.py in _call_flat(self, args, captured_inputs, cancellation_manager) 1962 # No tape is watching; skip to running the function. 1963 return self._build_call_outputs(self._inference_function.call( -gt; 1964 ctx, args, cancellation_manager=cancellation_manager)) 1965 forward_backward = self._select_forward_and_backward_functions( 1966 args, /usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/function.py in call(self, ctx, args, cancellation_manager) 594 inputs=args, 595 attrs=attrs, --gt; 596 ctx=ctx) 597 else: 598 outputs = execute.execute_with_cancellation( /usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name) 58 ctx.ensure_initialized() 59 tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name, ---gt; 60 inputs, attrs, num_outputs) 61 except core._NotOkStatusException as e: 62 if name is not None: ResourceExhaustedError: failed to allocate memory [[node dense1/kernel/Regularizer/Square (defined at lt;ipython-input-6-f1fac48c4ac9gt;:77) ]] Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info. This isn't available when running in Eager mode. [Op:__inference_train_function_309982] Function call stack: train_function
То, что я пробовал до сих пор:
Я провел некоторое исследование и после обучения каждой модели вызываю следующую функцию
def reset_tensorflow_keras_backend(): # to be further investigated, but this seems to be enough import tensorflow as tf import tensorflow.keras as keras tf.keras.backend.clear_session() tf.compat.v1.reset_default_graph() _ = gc.collect()
Как способ получить новую сессию для каждой модели. Мне удалось запустить цикл с несколькими моделями и не получить ошибку, но сегодня ошибка снова возникла в одной из самых простых моделей, что странно.
Использование графического процессора в момент сбоя составляет:
!nvidia-smi ----------------------------------------------------------------------------- | NVIDIA-SMI 470.74 Driver Version: 460.32.03 CUDA Version: 11.2 | |------------------------------- ---------------------- ---------------------- | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=============================== ====================== ======================| | 0 Tesla K80 Off | 00000000:00:04.0 Off | 0 | | N/A 48C P0 57W / 149W | 11077MiB / 11441MiB | 0% Default | | | | N/A | ------------------------------- ---------------------- ----------------------
Что явно близко к 100%.
Ответ №1:
Вероятно, это произошло потому, что каждый раз, когда вы открываете сеанс в colab, вы не всегда получаете один и тот же графический процессор, вы можете проверить назначенный графический процессор следующим образом.
!nvidia-smi -L
Что я делаю, так это сбрасываю сеанс, пока Google не благословит меня Tesla T4.
Я искал в прошлом способ освободить память, но единственный способ-перезапустить сеанс.
Я уверен, что, выбрав графический процессор, вы больше не столкнетесь с этой проблемой.
Как вы можете видеть , Google назначил вам Tesla K80
наихудшее из возможных
Комментарии:
1. Вам нужно делать это вручную? Это может занять много времени, верно?
2. вы намерены произвести перезагрузку? нет, вам просто нужно закрывать сеанс пару раз большую часть времени, это операция продолжительностью 1-2 минуты, но это зависит от того, насколько перегружены серверы, если вам нужна услуга премиум-класса, вы можете купить премиум-версию colab, но она доступна не везде