Session 分布式张量流中的并行过程

Session 分布式张量流中的并行过程,session,parallel-processing,tensorflow,distributed,reinforcement-learning,Session,Parallel Processing,Tensorflow,Distributed,Reinforcement Learning,我在tensorflow中有一个神经网络,带有经过训练的参数,这是代理的“策略”。在核心计划的主要tensorflow课程中,网络正在训练循环中更新 在每个培训周期结束时,我需要将此网络传递给几个并行进程(“worker”),这些进程将使用它从代理的策略与环境的交互中收集样本 我需要并行进行,因为模拟环境占用了大部分时间,而且只运行单核。因此,几乎不需要并行采样过程。我正在为如何在分布式tensorflow中构造它而苦苦挣扎。到目前为止,我考虑的是: 在核心程序中创建主会话,更新全球网络。 使用

我在tensorflow中有一个神经网络,带有经过训练的参数,这是代理的“策略”。在核心计划的主要tensorflow课程中,网络正在训练循环中更新

在每个培训周期结束时,我需要将此网络传递给几个并行进程(“worker”),这些进程将使用它从代理的策略与环境的交互中收集样本

我需要并行进行,因为模拟环境占用了大部分时间,而且只运行单核。因此,几乎不需要并行采样过程。我正在为如何在分布式tensorflow中构造它而苦苦挣扎。到目前为止,我考虑的是:

  • 在核心程序中创建主会话,更新全球网络。 使用python多处理生成进程,并将其传递给网络的全局参数(我可以将网络作为参数传递吗?)。然后在每个进程中创建单独的会话,网络在其中运行
  • 这方面的最低示例如下(也插入了下面的代码):

    此示例的问题是,它有时挂起在第二个进程中的sess.run上。有时它运行平稳(!)。所以,这种方法肯定存在一些根本性的问题。。 在我的真实代码中,第二个代理总是挂在sess.run上

  • 以某种方式在图形复制和主管(用于管理会话)之间使用,以便创建一个主会话(在核心程序中)并在工作机上使用全局网络的副本。 似乎更准确,但我不知道如何构造它。官方教程中的代码示例完全不同 如蒙指教,我将不胜感激

    第1页的代码:

    import time
    import tensorflow as tf
    
    from multiprocessing import Process
    
    N_WORKERS = 2
    SPEC = {'worker': ['127.0.0.1:12824', '127.0.0.1:12825']}
    
    def run_worker(task):
        spec = tf.train.ClusterSpec(SPEC)
        server = tf.train.Server(spec, job_name='worker', task_index=task)
        sess = tf.Session(server.target)
        x = tf.Variable(0., dtype=tf.float32, name='x')
        sess.run(tf.global_variables_initializer())
        print 'result: ', sess.run(x)
    
    def main(_):
        workers = []
        for i in xrange(2):
            p = Process(target=run_worker, args=(i,))
            p.start()
            workers.append(p)
            time.sleep(1)
        for w in workers: w.join()
    
    if __name__ == '__main__':
        tf.app.run()
    

    查看中的代码,它确实做到了(即,在不同进程中运行多个atari环境并从中学习)顺便说一句,TensorFlow与多进程有些不兼容,这种挂起行为在组合时很常见them@YaroslavBulatov是的,我看到了这个代理(A3C)并将其用于python进程,但它有点不同。在A3C中,所有流程都是独立的,从一开始就并行运行。它们只会不时地与全局参数网络同步,但通常它们都做相同的事情(收集样本、计算梯度)。我指的是另一种情况,当培训循环中有两个步骤:a)从N个工人收集样本,b)基于样本计算opt步骤,然后重复a)和b)。或者你的意思是我可以把b)的所有计算都放在一个有某种“障碍”的“大师”工人身上?是的,这应该行得通。多处理的问题是它调用
    fork
    ,TensorFlow可能具有与不兼容的全局状态forking@YaroslavBulatov关于多重处理。我发现了这个github问题(),有人建议让进程成为守护进程以避免挂起会话。这似乎对我有帮助,或者说我只是运气好。你知道,这是一个真正的修复还是一些意外的行为?