首页 > 解决方案 > 导入 Keras 会破坏多处理

问题描述

在使用 keras 时,我发现我无法使用 multiprocessing.Pool。经过一些故障排除后,我认为导入 keras 是问题的根源,并为此创建了一个简单的示例。

import keras
from multiprocessing import Pool

def foo(q,y):
    print("In foo")
    return q,y
def test(a, b):
    x = []
    if __name__ == '__main__':
        p = Pool(5)
        print("Starting")
        x = p.starmap(foo, [[a,2],[b,4]])
        print("Finished")
        p.close()
        p.join()
    print(x)

if __name__ == '__main__':
    test(1,3)

输出

> Starting

运行时输出“Starting”然后挂起。如果我删除 keras 导入,它运行良好并按预期输出 [(1, 2), (3, 4)]。知道如何解决此问题或可能导致它的原因吗?我还不完全理解多处理如何与 python 一起工作。谢谢!

我正在为我的代码使用 anaconda 和 spyder。

标签: pythonpython-3.xkerasdeep-learning

解决方案


这是一个对我有用的问题的可能解决方案,因为子进程不需要导入 keras。

if __name__ != '__mp_main__': #This line solves the problem
    import keras
from multiprocessing import Pool

def foo(q,y):
    print("In foo")
    return q,y
def test(a, b):
    x = []
    if __name__ == '__main__':
        p = Pool(5)
        print("Starting")
        x = p.starmap(foo, [[a,2],[b,4]])
        print("Finished")
        p.close()
        p.join()
    print(x)

if __name__ == '__main__':
    test(1,3)
    print(keras.backend)

我如何发现这个解决方案很奇怪。我运行了原始代码,它正常挂起。然后,即使它被挂起,我也注释掉了导入行并保存了文件以供下一次测试。一旦我这样做,代码就会以某种方式完成执行。我对此进行了多次测试以确保它不是侥幸。编辑已运行程序的文件如何影响其运行?然后我发现 if __name__ == '__main__' 可能类似于 c 中的 if(fork() == 0) 所以我把它放在导入周围,这样子进程就不会运行它。就像我在运行时手动注释并保存一样。我测试了它并且它有效。

编辑:如果你使用 if __name__ == __main__ 那么继承就会被破坏,因为它们似乎不是主要的。mp_main是池工作人员的名称,这也适用


推荐阅读