def get_model():
model = Sequential()
model.add(Dense(20, input_shape=(1,), activation='relu'))
model.add(Dense(1))
print(model.summary())
model.compile(loss='mse', optimizer='adam')
return model
def train_model():
// X and y are input and output labels generated using some logic
epochs = 20
batch_size = 1000
verbose = 1
queue = multiprocessing.Queue()
validation_split = 0.2
model = get_model()
p1 = Process(target = fit_model, args=(model, X, y, validation_split,
epochs, batch_size, verbose, queue))
p1.start()
p1.join()
time.sleep(7)
queue.get()
//check nvidia-smi after this
#model_name = str(time.time()).split('.')[0]
#pickle.dump(model, open('nn_sq_'+model_name, 'wb'))
def fit_model(model, X, y, validation_split, epochs, batch_size, verbose,
queue):
h = model.fit(X, y, validation_split=0.2,
epochs=epochs,
batch_size=batch_size,
verbose=1)
queue.put(model)
if __name__ == '__main__' :
train_model()
Рассмотрим код выше.В приведенном выше коде:
1) вызов train_model в основном методе
2) train_model вызывает другой процесс для model.fit для метода fit_model
3) как только этот процесс завершится,Я передаю модель подгонки в очередь, чтобы вернуться к основному процессу, чтобы завершить дочерний процесс и освободить память GPU.
Но одна проблема, с которой я сталкиваюсь, заключается в том, что если в родительском процессе (метод train_model), если я выполняю queue.get (модель), память GPU снова заполняется (наблюдает nvidia-smi) и не освобождается.
Похожая вещь происходит, если я просто пытаюсь сброситьмодель с использованием рассола (закомментированный код).Даже если я не вызываю многопроцессорный метод и напрямую пытаюсь выбрать модель, я снова заполняю память.
Если я выбираю модель в самом дочернем процессе (fit_model), то проблем нет иУ меня нет проблем с заполнением памяти.
Итак, вкратце, мой вопрос: когда завершается дочерний процесс, освобождается память, тогда зачем возвращаться к основному процессу и просто получатьмодель из очереди или выбор модели объекта заполняет память графического процессора?