Я использую CUDA/CUDNN для обучения нескольких моделей keras тензорного потока на моем графическом процессоре (для эволюционного алгоритма, пытающегося оптимизировать гиперпараметры). Первоначально программа вылетала с ошибкой Out of Memory после пары поколений. В конце концов я обнаружил, что использование нового подпроцесса для каждой модели автоматически очищает память графического процессора.
Однако кажется, что каждый процесс повторно инициализирует CUDA (загружая динамические библиотеки из файлов .dll), что занимает невероятно много времени. Есть ли способ избежать этого?
Код вставлен ниже. Функция «fitness_wrapper» вызывается для каждого indiv
idual.
def fitness_wrapper(indiv):
fit = multi.processing.Value('d', 0.0)
if __name__ == '__main__':
process = multiprocessing.Process(target=fitness, args=(indiv, fit))
process.start()
process.join()
return (fit.value,)
def fitness(indiv, fit):
model = tf.keras.Sequential.from_config(indiv['architecture'])
optimizer_dict = indiv['optimizer']
opt = tf.keras.optimizers.Adam(learning_rate=optimizer_dict['lr'], beta_1=optimizer_dict['b1'],
beta_2=optimizer_dict['b2'],
epsilon=optimizer_dict['epsilon'])
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
model.fit(data_split[0], data_split[2], batch_size=32, epochs=5)
fit = model.evaluate(data_split[1], data_split[3])[1]
Оказывается, решение состоит в том, чтобы просто использовать tensorflow.backend.clear_session() после каждой модели (а не подпроцессов). Я пробовал это раньше, и это не сработало, но по какой-то причине на этот раз все исправилось.
Вы также должны удалить модель и вызвать reset_default_graph(), по-видимому.
def fitness(indiv, fit):
model = tf.keras.Sequential.from_config(indiv['architecture'])
optimizer_dict = indiv['optimizer']
opt = tf.keras.optimizers.Adam(learning_rate=optimizer_dict['lr'], beta_1=optimizer_dict['b1'],
beta_2=optimizer_dict['b2'],
epsilon=optimizer_dict['epsilon'])
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
model.fit(data_split[0], data_split[2], batch_size=32, epochs=5)
fit = model.evaluate(data_split[1], data_split[3])[1]
del model
tf.keras.backend.clear_session()
tf.compat.v1.reset_default_graph()
return fit