Уже подходящая модель, занимающая место в памяти GPU даже без загрузки - PullRequest
0 голосов
/ 29 сентября 2019
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), то проблем нет иУ меня нет проблем с заполнением памяти.

Итак, вкратце, мой вопрос: когда завершается дочерний процесс, освобождается память, тогда зачем возвращаться к основному процессу и просто получатьмодель из очереди или выбор модели объекта заполняет память графического процессора?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...