GPU Tensorflow 2.0 Keras не может очистить серверную часть, что приводит к утечкам памяти в мультимодельных циклах - PullRequest
0 голосов
/ 09 ноября 2019

Я получал странные ошибки памяти, поэтому я добавил функцию для контроля использования памяти.

Это мой код:

import pickle, psutil, os, gc
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, LSTM, BatchNormalization
from tensorflow.keras import callbacks, optimizers, backend

def print_memory_status():
    # Print the amount of RAM used by the process in gigabytes
    print(psutil.Process(os.getpid()).memory_info().rss * 0.00000001)

def run(train_x, train_y):
    model = Sequential()

    model.add(LSTM(128, input_shape=(train_x.shape[1:]), return_sequences=True))
    model.add(Dropout(0.2))
    model.add(BatchNormalization())

    model.add(LSTM(128))
    model.add(Dropout(0.2))
    model.add(BatchNormalization())

    model.add(Dense(32, activation='relu'))
    model.add(Dropout(0.2))

    model.add(Dense(3, activation='softmax'))

    model.compile(
        loss='sparse_categorical_crossentropy',
        optimizer=optimizers.Adam(lr=0.001, decay=1e-6),
        metrics=['accuracy']
    )

    model.fit(
        train_x, train_y,
        batch_size=batch_size,
        epochs=5,
    )

    backend.clear_session()
    del model
    gc.collect()

def main():
    train_x = pickle.load(open("train_x.pickle", 'rb'))
    train_y = pickle.load(open("train_y.pickle", 'rb'))

    print_memory_status()

    for _ in range(5):
        run(train_x, train_y)
        print_memory_status()

main()

Я получаю этот вывод:

0.261394432
2.304380928
2.412531712
2.497695744
2.582204416
2.667970560

но из-за строк:

backend.clear_session()
del model
del opt
gc.collect()

Я не ожидал бы увеличения использования памяти или, по крайней мере, получения небольших положительных и отрицательных изменений, которые суммируются, что не приведет к увеличению памяти с течением времени. Я надеюсь, что что-то упустил, но я все еще не понял.

Кроме того, я заметил, что если я удалю все из функции run(), кроме model = Sequential() и первого model.add()линия, так что функция:

def run(train_x, train_y):
    model = Sequential()
    model.add(LSTM(128, input_shape=(train_x.shape[1:]), return_sequences=True))

    backend.clear_session()
    del model
    gc.collect()

Я все еще получаю увеличивающееся использование памяти, хотя и намного медленнее, вероятно, из-за меньшего количества слоев.

Настройка:

-RAM: 12Gb (2x XMS, 1x Vengeance)

-GPU: 6Gb (GeForce GTX 1060)

-OS: Ubuntu 18.04 64x

-Nvidia драйвер: 430.26

Среда:

-Виртуальная среда Anaconda

-Pyhton 3.7.5 (64bit)

-CUDA Toolkit 10.0.130

-CuDNN 7.6.4

-Tensorflow GPU 2.0.0

1 Ответ

0 голосов
/ 09 ноября 2019

Вы пробовали:

from numba import cuda
cuda.select_device(0)
cuda.close()

См. Также:

https://github.com/keras-team/keras/issues/9379

...