首页 文章

Keras / Tensorflow:在循环中或使用Process在同一GPU上训练多个模型

提问于
浏览
0

我有多个模型在Keras / Tensorflow中一个接一个地训练而不需要手动调用 train.py ,所以我做了:

for i in range(0, max_count):
    model = get_model(i)   # returns ith model
    model.fit(...)
    model.save(...)

它运行良好 i=0 (事实上,当单独运行时运行完美) . 问题是当第二次加载模型时,我得到 ResourceExhaustedError OOM ,所以我试着在for循环结束时释放内存

del model
keras.backend.clear_session()
tf.clear_session()
tf.reset_default_graph()
gc.collect()

没有一个单独或共同起作用 .

我进一步向上看,发现释放GPU内存的唯一方法是结束这个过程 .

也是这个keras issue

更新(2018/08/01):目前只有TensorFlow后端支持正确清理会话 . 这可以通过调用K.clear_session()来完成 . 这将从内存中删除所有内容(模型,优化器对象以及内部具有张量的任何内容) . 因此无法删除特定的陈旧模型 . 这不是Keras的错误,而是后端的限制 .

因此,显然要做的就是每次加载模型并等待它结束然后在新流程中创建另一个模型时创建一个流程,如下所示:

import multitasking
def train_model_in_new_process(model_module, kfold_object, x, y, x_test, y_test, epochs, model_file_count):
    training_process = multiprocessing.Process(target=train_model, args=(x, y, x_test, y_test, epochs, model_file_count, ))
    training_process.start()
    training_process.join()

但后来它抛出了这个错误:

File "train.py", line 110, in train_model_in_new_process
    training_process.start()
  File "F:\Python\envs\tensorflow\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "F:\Python\envs\tensorflow\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "F:\Python\envs\tensorflow\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "F:\Python\envs\tensorflow\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
    reduction.dump(process_obj, to_child)
  File "F:\Python\envs\tensorflow\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
TypeError: can't pickle module objects
Using TensorFlow backend.
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "F:\Python\envs\tensorflow\lib\multiprocessing\spawn.py", line 105, in spawn_main
    exitcode = _main(fd)
  File "F:\Python\envs\tensorflow\lib\multiprocessing\spawn.py", line 115, in _main
    self = reduction.pickle.load(from_parent)
EOFError: Ran out of input

我真的无法利用错误中提供的信息来查看我做错了什么 . 它显然指向 training_process.start() 行,但我可以't seem to understand what'导致问题 .

任何使用 for 循环或使用 Process 训练模型的帮助都表示赞赏 .

1 回答

  • 0

    显然, Multiprocessing 不喜欢 modules 或更确切地说 importlib 模块 . 我正在使用 importlib 从编号为 .py 的文件中加载模型

    model_module = importlib.import_module(model_file)
    

    因此麻烦 .

    我在 Process 内做了同样的事情,一切都很好:)

    但是,如果没有 Process es,使用 for ,我仍然找不到办法 . 如果您有答案,请在此处发布,您继续处理流程,因为我认为流程是以隔离的方式清理的,并且在完成后清除为该特定流程分配的所有内存 .

相关问题