我有带有训练参数的张量流神经网络,它是代理的“策略”。网络正在核心程序的主张量流会话的训练循环中进行更新。
在每个训练周期结束时,我需要将该网络传递给几个并行进程(“工作人员”),这些进程将使用它来从代理策略与环境的交互中收集样本。
我需要并行执行,因为模拟环境花费了大部分时间并且仅运行单核。因此,需要很少的并行采样过程。我正在努力如何在分布式张量流中构建它。到目前为止我所考虑的:
- 在核心程序中创建主会话,其中更新全球网络。
使用 python 多重处理生成进程并向它们传递网络的全局参数(我可以只传递网络作为参数吗?)。然后在每个进程中创建单独的会话,其中网络运行。
最小的例子在这里(还在下面插入了代码):https://gist.github.com/dd210/e1808efcc4362cab949ad0337ba600a9 https://gist.github.com/dd210/e1808efcc4362cab949ad0337ba600a9
这个示例的问题是它有时会挂在第二个进程中的 sess.run 上。有时它运行得很顺利(!)。所以,这种方法肯定存在一些根本性的问题。
在我的真实代码中,第二个代理总是挂在 sess.run 上。
- 以某种方式使用图间复制和 Supervisor(用于管理会话)来创建一个主会话(在核心程序中)并在工作线程上使用全局网络的副本。
看起来更准确,但在这里我不知道如何构造它。官方教程中的代码示例有很大不同。
将不胜感激的建议。
第 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()
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)