当您使用Python Pool
创建multiprocessing
进程时,这些进程将fork和父进程中的全局变量将显示在子进程中,如下面的问题所示:
How can I restrict the scope of a multiprocessing process?
这似乎包括导入的模块。对于__init__
中有副作用的模块而言,这是一个问题。 Tensorflow就是这样一个模块,只要它导入它就会尝试为GPU分配内存。这会导致子进程崩溃,因为父进程已经执行了该操作。
有没有一种好方法可以避免在分叉过程中加载tensorflow模块?
Ubuntu上的Python 2.7(posix)
答案 0 :(得分:1)
经过大量调试后,我意识到我的问题陈述并不充分。问题是我在其中一个子进程中加载了tensorflow(我忘了!)和仅使用CPU而不是GPU所需的子进程。我被迫更改环境变量以禁用子进程上的CUDA:
os.environ['CUDA_VISIBLE_DEVICES'] = ''
p = multiprocessing.Pool(processes=4)
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
答案 1 :(得分:1)
除了David Parks的自我回答之外,在导入TensorFlow或可能被Pool
破坏的模块之前创建os.fork()
和工作者实例更安全。