Session 分布式张量流中的并行过程
我在tensorflow中有一个神经网络,带有经过训练的参数,这是代理的“策略”。在核心计划的主要tensorflow课程中,网络正在训练循环中更新 在每个培训周期结束时,我需要将此网络传递给几个并行进程(“worker”),这些进程将使用它从代理的策略与环境的交互中收集样本 我需要并行进行,因为模拟环境占用了大部分时间,而且只运行单核。因此,几乎不需要并行采样过程。我正在为如何在分布式tensorflow中构造它而苦苦挣扎。到目前为止,我考虑的是:Session 分布式张量流中的并行过程,session,parallel-processing,tensorflow,distributed,reinforcement-learning,Session,Parallel Processing,Tensorflow,Distributed,Reinforcement Learning,我在tensorflow中有一个神经网络,带有经过训练的参数,这是代理的“策略”。在核心计划的主要tensorflow课程中,网络正在训练循环中更新 在每个培训周期结束时,我需要将此网络传递给几个并行进程(“worker”),这些进程将使用它从代理的策略与环境的交互中收集样本 我需要并行进行,因为模拟环境占用了大部分时间,而且只运行单核。因此,几乎不需要并行采样过程。我正在为如何在分布式tensorflow中构造它而苦苦挣扎。到目前为止,我考虑的是: 在核心程序中创建主会话,更新全球网络。 使用
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问题(),有人建议让进程成为守护进程以避免挂起会话。这似乎对我有帮助,或者说我只是运气好。你知道,这是一个真正的修复还是一些意外的行为?