我试图了解为什么我在子进程中启动使用TensorFlow时无法正确运行(最新)。
父进程运行import tensorflow
,但是除非我做一些令人不快的操作,否则后续对sess.run(...)
的调用将挂起。
(顺便说一句,这是非常棘手的事情。目标是使TensorFlow在multiprocessing.Process
子类中工作。仅在__init__
子类实例和调用start()
,然后调用sess.run(...)
。)
由于这些原因,我认为问题出在我在父进程中致电import
。我想避免非常棘手的解决方法。当调用import tensorflow
阻止tf.Session
在子进程中工作时会发生什么?
更新:
在简化代码中,让我准确描述发生的事情。
子进程挂在sess.run(...)
上:
import tensorflow as tf
class Subprocess(multiprocessing.Process):
def __init__(self):
...
self.model = ...
self.output = ...
self.sess = tf.Session(...)
self.sess.run(...)
def run(self):
while True:
self.sess.run(self.output)
child = Subprocess()
child.start()
但这可行:
import tensorflow as tf
class Subprocess(multiprocessing.Process):
def __init__(self):
...
def run(self):
self.model = ...
self.output = ...
self.sess = tf.Session(...)
self.sess.run(...)
while True:
self.sess.run(self.output)
child = Subprocess()
child.start()
这也可行:
import tensorflow as tf
class Subprocess(multiprocessing.Process):
def __init__(self):
...
self.model = ...
self.output = ...
def run(self):
self.sess = tf.Session(...)
self.sess.run(...)
while True:
self.sess.run(self.output)
child = Subprocess()
child.start()
由此看来,在子进程中启动TensorFlow的问题与导入TensorFlow无关(正如许多SO答案所建议的)。相反,问题与在不同(父)进程中创建的 child 进程中使用tf.Session
有关。
我有一个预感tf.Session
实例无法在进程之间共享,但是问题仍然存在。