当您使用python的multiprocessing
创建过程的Pool
时,这些过程将在父进程中分叉,并且在子进程中显示全球,请在下面的问题中指出:
如何限制多处理过程的范围?
这似乎包括导入的模块。这是在__init__
中具有副作用的模块的问题。TensorFlow就是这样的模块,一旦导入它,它就会尝试将内存分配给GPU。这导致子过程崩溃,因为父母已经采取了该操作。
有没有一个很好的方法来避免在分叉过程中加载张量的模块?
python 2.7在ubuntu(posix(
在大量调试之后,我意识到我的问题陈述真的不够。问题是我确实在一个子过程之一(我忘记!(中加载了TensorFlow,并且仅使用CPU而不是GPU所需的子过程。我被迫更改环境变量以通过以下方式禁用子流程上的cuda
os.environ['CUDA_VISIBLE_DEVICES'] = ''
p = multiprocessing.Pool(processes=4)
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
除了戴维·帕克斯(David Parks(的自我答案之外,在导入tensorflow或可能被os.fork()
毁坏的模块之前,创建Pool
和Worker实例更安全。