我使用两个worker / replicas和一个参数服务器。像
--ps_hosts='hosta.com:2222' --worker_hosts='hosta.com:2223,hostb.com:2223'
使用 tf.train.SyncReplicasOptimizer 之类的
opt = tf.train.SyncReplicasOptimizer(
opt,
replicas_to_aggregate=2,
replica_id=FLAGS.task_id,
total_num_replicas=2,
variables_to_average=variables_to_average)
从日志中我看到worker0(hosta.com:2223)由于跨机器网络通信而比worker1(hostb.com:2223)快得多。 看起来worker0没有等待来自worker1的渐变。即使我杀死了worker1的工作,worker0仍在处理。而worker0有许多重复的日志,如
INFO:tensorflow:Worker 0: 2016-04-21 03:24:02.659749: step 29010, loss = 0.40(812.0 examples/sec; 0.315 sec/batch)
INFO:tensorflow:Worker 0: 2016-04-21 03:24:02.990509: step 29010, loss = 0.59(775.3 examples/sec; 0.330 sec/batch)
INFO:tensorflow:Worker 0: 2016-04-21 03:24:04.650522: step 29013, loss = 0.56(774.0 examples/sec; 0.331 sec/batch)
INFO:tensorflow:Worker 0: 2016-04-21 03:24:04.989555: step 29013, loss = 0.47(756.3 examples/sec; 0.338 sec/batch)
INFO:tensorflow:Worker 0: 2016-04-21 03:24:06.549120: step 29016, loss = 0.49(816.6 examples/sec; 0.313 sec/batch)
INFO:tensorflow:Worker 0: 2016-04-21 03:24:06.867229: step 29016, loss = 0.48(806.1 examples/sec; 0.318 sec/batch)
那么,不应该将tf.train.SyncReplicasOptimizer挂起并等待所有replicas_to_aggregate工作人员吗?
答案 0 :(得分:8)
tf.train.SyncReplicasOptimizer
只需要在汇总和应用它们之前从replicas_to_aggregate
个不同的步骤接收渐变,但不要求它们来自不同的进程。您的worker0
似乎的运行速度至少是worker1
的两倍,并且在worker1
完成一步之前完成了两个步骤。
正如您所注意到的,这不是分布式资源的有效使用!我建议尝试平衡您的系统,以便从一台或多台具有与两名工作人员相同带宽的机器提供参数。一种可能性是添加另一个参数服务器,在hostb.com:2222
上运行,以便(大约)一半参数对每个工作者来说是本地的。