На ноутбуке Google Colab с keras (2.2.4) и тензорным потоком (1.13.1) в качестве бэкэнда я пытаюсь настроить CNN, использую простую и простую таблицу гиперпараметров и запускаю свои тесты в набор петель.
Моя проблема в том, что я не могу освободить память GPU после каждой итерации, и Keras не может автоматически освобождать память GPU. Поэтому каждый раз, когда я получаю сообщение об ошибке Ressource Exhausted: Out Of Memory (OOM)
Я немного покопался и побежал в эту функцию, которая собирает различные решения, которые были предложены для решения этой проблемы (хотя у меня не получилось)
for _ in hyper_parameters :
Run_model(_)
reset_keras()
мой набор гиперпараметров:
IMG_SIZE = 800,1000,3
BATCH_SIZEs = [4,8,16]
EPOCHSs = [5,10,50]
LRs = [0.008,0.01]
MOMENTUMs = [0.04,0.09]
DECAYs = [0.1]
VAL_SPLITs = [0.1]
и функция, которую я использовал для освобождения памяти графического процессора:
def reset_keras():
sess = get_session()
clear_session()
sess.close()
sess = get_session()
try:
del model # this is from global space - change this as you need
except:
pass
print(gc.collect()) # if it's done something you should see a number being outputted
# use the same config as you used to create the session
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 1
config.gpu_options.visible_device_list = "0"
set_session(tf.Session(config=config))
Единственное, что я полностью не понял, - это «тот же конфиг, который вы использовали для создания своей модели» (строка 14), поскольку в Keras мы не выбрали явно определенную конфигурацию.
Я обхожусь на одну итерацию, несколько раз два, но я не могу выйти за рамки. Я уже пытался изменить размер batch_size и на данный момент я не могу позволить себе машину с более высокими характеристиками.
Я использую собственный генератор изображений, который наследуется от keras.utils.Sequence .
Я отслеживаю состояние памяти графического процессора, используя этот фрагмент кода:
import psutil
import GPUtil as GPU
def printmm():
GPUs = GPU.getGPUs()
gpu = GPUs[0]
process = psutil.Process(os.getpid())
return(" Util {0:.2f}% ".format(gpu.memoryUtil*100))
print(printmm())