Tensorflow和Multiprocessing:传递会话

MrR*_*Red 14 python parallel-processing multiprocessing reinforcement-learning tensorflow

我最近一直致力于一个使用神经网络进行虚拟机器人控制的项目.我使用tensorflow对其进行编码并且运行顺畅.到目前为止,我使用顺序模拟来评估神经网络有多好,但是,我想并行运行多个模拟以减少获取数据所需的时间.

要做到这一点,我正在导入python的multiprocessing包.最初我将sess变量(sess=tf.Session())传递给一个运行模拟的函数.但是,一旦我找到使用此sess变量的任何语句,该进程将退出而不会发出警告.摸索了一会儿后,我发现这两个职位: Tensorflow:传递会话的蟒蛇多进程 ,并同时运行多个tensorflow会议

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

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

谢谢.

Jun*_*ter 6

我使用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)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

它应该工作。尝试为每个进程分别调用tensorflow。

  • 你是一个救星,这就像一个魅力!(多次加载模型的“惩罚”甚至不到总计算时间的千分之一。)比你! (2认同)

Rob*_*ara 5

你不能使用Python多处理到TensorFlow传递Sessionmultiprocessing.Pool在straightfoward方式,因为Session对象不能腌制(这是根本不可序列化,因为它可以管理GPU内存和状态那样)。

我建议使用actor对代码进行并行化,actor本质上是“对象”的并行计算类似物,并用于管理分布式设置中的状态。

Ray是执行此操作的良好框架。您可以定义一个Python类来管理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])
Run Code Online (Sandbox Code Playgroud)

这是将TensorFlow与Ray并行化的更多示例。

请参阅Ray文档。请注意,我是Ray开发人员之一。

  • 非常感谢您 - 我想保证这也(可能很明显)适用于 Keras。我需要一种同时在多个进程中运行预测的方法。我的具体实现需要围绕我的 Keras 模型创建包装类,每个类都有自己的 `tf.Graph()` 和 `tf.Session()` 对象,并从暴露单个 ` run_prediction()` 方法。 (3认同)