【问题标题】:Tensorflow and Multiprocessing: Passing SessionsTensorflow 和多处理:传递会话
【发布时间】:2016-04-13 21:54:48
【问题描述】:

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

为此,我正在导入 python 的 multiprocessing 包。最初,我将 sess 变量 (sess=tf.Session()) 传递给将运行模拟的函数。但是,一旦我得到任何使用此sess 变量的语句,该过程就会退出而不会发出警告。经过一番搜索,我发现了这两个帖子: Tensorflow: Passing a session to a python multiprocessRunning multiple tensorflow sessions concurrently

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

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

谢谢。

【问题讨论】:

  • 我怀疑你不能在进程之间传递会话的克隆,因为 C 地址空间中有 Python 不知道如何复制的状态。但是在每个新流程中创建全新的会话应该是可行的。我没有使用多处理,但我经常有几个并行打开的进程保持自己的 TensorFlow 会话
  • 我提供的第二个链接并行运行多个进程,但问题是我需要神经网络对所有进程都相同。
  • 你可以通过使用分布式 TensorFlow 来解决这个问题——即,有一个本地工作人员和 ps 并并行创建多个会话,如tf.Session("grpc://localhost:2222")github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/…
  • @YaroslavBulatov ,你有机会详细说明一下吗?我正在实现并行 TRPO (Viva RL),但现在使用最小示例 [gist.github.com/dd210/e8bad8eadc19f44cafcdc5313a39a53f]。基本上我想在主进程中启动会话,做一些计算,然后将网络转移到另一个 X 并行进程并在那里并行做一些计算。然后重复 Y 次。但是我被这个最小的例子卡住了,因为我似乎需要一直在一个会话中工作。官方教程是 模糊的。感谢任何帮助和建议。
  • 多处理似乎被 TensorFlow 破坏了。下面是一个使用分布式张量流的例子——gist.github.com/yaroslavvb/ea1b1bae0a75c4aae593df7eca72d9ca

标签: python parallel-processing multiprocessing tensorflow reinforcement-learning


【解决方案1】:

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

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

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])

这里还有一些parallelizing TensorFlow with Ray 的示例。

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

【讨论】:

  • 非常感谢 - 我想保证这也(可能很明显)适用于 Keras。我需要一种同时在多个进程中运行预测的方法。我的具体实现需要围绕我的 Keras 模型创建包装类,每个模型都有自己的 tf.Graph()tf.Session() 对象,并从公开单个 run_prediction() 方法的入口点模块创建 ray 演员。
【解决方案2】:

我使用 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。

【讨论】:

  • 这只是节省了我的一天。谢谢!
  • 你是一个救生员,这就像一个魅力! (多次加载我的模型的“惩罚”甚至不到总计算时间的一分之一。)比你!
猜你喜欢
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
相关资源
最近更新 更多