Python Tensorflow和多处理:传递会话

Python Tensorflow和多处理:传递会话,python,parallel-processing,multiprocessing,tensorflow,reinforcement-learning,Python,Parallel Processing,Multiprocessing,Tensorflow,Reinforcement Learning,我最近一直在从事一个使用神经网络进行虚拟机器人控制的项目。我使用tensorflow对其进行编码,它运行平稳。到目前为止,我使用顺序模拟来评估神经网络的性能,但是,我想并行运行几个模拟,以减少获取数据所需的时间 为此,我导入python的多处理包。最初,我将sess变量(sess=tf.Session())传递给一个将运行模拟的函数。但是,一旦我找到使用此sess变量的任何语句,进程将在没有警告的情况下退出。在搜索了一段时间后,我发现了以下两个帖子: 及 虽然它们高度相关,但我还没有弄明白如何让

我最近一直在从事一个使用神经网络进行虚拟机器人控制的项目。我使用tensorflow对其进行编码,它运行平稳。到目前为止,我使用顺序模拟来评估神经网络的性能,但是,我想并行运行几个模拟,以减少获取数据所需的时间

为此,我导入python的
多处理
包。最初,我将sess变量(
sess=tf.Session()
)传递给一个将运行模拟的函数。但是,一旦我找到使用此
sess
变量的任何语句,进程将在没有警告的情况下退出。在搜索了一段时间后,我发现了以下两个帖子: 及

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

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


谢谢。

我使用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
会话
直接传递到
多处理.Pool
中,因为
会话
对象不能被pickle(它基本上是不可序列化的,因为它可能会管理GPU内存和类似的状态)

我建议使用并行化代码,它本质上是“对象”的并行计算模拟,用于管理分布式环境中的状态

是一个很好的框架。您可以定义一个Python类来管理TensorFlow
会话
,并公开运行模拟的方法

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])
这里还有几个例子


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

我怀疑您无法在进程之间传递会话克隆,因为C地址空间中存在Python不知道如何复制的状态。但是在每个新进程中创建全新会话应该是可行的。我没有使用多进程,但我经常有两个进程并行打开保持自己的TensorFlow会话我提供的第二个链接并行运行多个进程,但问题是我需要所有进程的神经网络都是相同的。您可以使用TensorFlow distributed解决这个问题——即,让一个本地工作者和ps并行创建多个会话,如
tf.Session("grpc://localhost:2222“
@YaroslavBulatov,你有没有可能详细说明一下?我正在实现并行TRPO(Viva RL),但现在使用的是最简单的示例[].基本上我想在主进程中启动会话,做一些计算,然后将网络转移到另一个X并行进程,并在那里并行进行一些计算。然后重复Y次。但我被这个最小的示例卡住了,因为我似乎需要一直在一个会话中工作。官方教程是模糊的。欣赏谢谢你的帮助和建议。TensorFlow的多处理功能似乎是半破坏性的。下面是一个使用分布式TensorFlow的例子——这刚刚救了我一天。谢谢!非常感谢你的帮助-我想保证这一点(可能很明显)与Keras一起使用。我需要一种在多个进程中同时运行预测的方法。我的具体实现需要围绕Keras模型创建包装类,每个类都有自己的
tf.Graph()
tf.Session()
objects,并从一个入口点模块创建一个
ray
actor,该模块公开一个
run\u prediction()
方法。