Невозможно освободить память GPU после тренировки модели CNN с использованием кераса - PullRequest
1 голос
/ 06 июня 2019

На ноутбуке 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())
...