Tensorflow 和多处理:传递会话

Tensorflow and Multiprocessing: Passing Sessions

我最近在做一个使用神经网络进行虚拟机器人控制的项目。我使用 tensorflow 对其进行编码,它 运行 很顺利。到目前为止,我使用顺序模拟来评估神经网络的好坏,但是,我想 运行 多个模拟 并行 以减少获得所需的时间数据.

为此,我正在导入 python 的 multiprocessing 包。最初我将 sess 变量 (sess=tf.Session()) 传递给一个将 运行 模拟的函数。但是,一旦我到达任何使用此 sess 变量的语句,该过程就会在没有警告的情况下退出。搜索了一下后,我发现了这两个帖子: Running multiple tensorflow sessions concurrently

虽然它们高度相关,但我一直无法弄清楚如何让它发挥作用。我尝试为每个单独的进程创建一个会话,并将神经网络的权重分配给它的可训练参数,但没有成功。我也试过将会话保存到一个文件中,然后在一个进程中加载​​它,但也没有成功。

有人能够将会话(或会话的克隆)传递给多个进程吗?

谢谢。

我使用 keras 作为包装器,以 tensorflow 作为支持,但应该适用相同的一般原则。

如果您尝试这样的操作:

import keras
from functools import partial
from multiprocessing import Pool

def ModelFunc(i,SomeData):
    YourModel = Here
    return(ModelScore)

pool = Pool(processes = 4)
for i,Score in enumerate(pool.imap(partial(ModelFunc,SomeData),range(4))):
    print(Score)

它会失败。但是,如果您尝试这样的操作:

from functools import partial
from multiprocessing import Pool

def ModelFunc(i,SomeData):
    import keras
    YourModel = Here
    return(ModelScore)

pool = Pool(processes = 4)
for i,Score in enumerate(pool.imap(partial(ModelFunc,SomeData),range(4))):
    print(Score)

应该可以。尝试为每个进程单独调用 tensorflow。

您不能使用 Python 多处理以直接的方式将 TensorFlow Session 传递到 multiprocessing.Pool,因为 Session 对象无法被腌制(它基本上不可序列化,因为它可能会管理 GPU 内存和状态。

我建议使用 actors 并行化代码,它们本质上是 "objects" 的并行计算模拟,用于管理分布式设置中的状态。

Ray 是一个很好的框架。您可以定义一个 Python class 来管理 TensorFlow Session 并公开一个用于 运行 您的模拟的方法。

import ray
import tensorflow as tf

ray.init()

@ray.remote
class Simulator(object):
    def __init__(self):
        self.sess = tf.Session()
        self.simple_model = tf.constant([1.0])

    def simulate(self):
        return self.sess.run(self.simple_model)

# Create two actors.
simulators = [Simulator.remote() for _ in range(2)]

# Run two simulations in parallel.
results = ray.get([s.simulate.remote() for s in simulators])

这里还有几个 parallelizing TensorFlow with Ray 的例子。

Ray documentation。请注意,我是 Ray 开发人员之一。