SyncReplicasOptimizer不会同步工作人员?

时间:2017-02-27 15:41:34

标签: tensorflow

我正在尝试使用SyncReplicasOptimizer通过同步SGD训练模型。我按照mnist_replicas.py中的示例进行操作。我正在使用1 ps和2名工人。

我添加了一个变量epoch和一个将其增加1的操作(这只是为了了解发生了什么):

 epoch = tf.Variable(0, name="epoch", trainable=False)
 inc_epoch_op = tf.assign_add(epoch, 1)

然后在主持人创建会话后,我在训练循环中执行以下操作:

while True:
    train_feed =  # my train feed
    _, step = sess.run([train_op, global_step], feed_dict=train_feed)
    loss = sess.run(total_loss, feed_dict = train_feed)
    if is_chief:
        sess.run(inc_epoch_op)
    print '## epoch ', epoch.eval(sess)
    if epoch.eval(sess) > 4:
        break

我对here解释的SyncReplicasOptimizer的理解是,每次执行训练循环时,它都会等待我的2名工作人员结束他们的反向传播,平均渐变并应用它们。

所以我希望两位工人都打印出来:

## epoch  1
## epoch  2
## epoch  3
## epoch  4
## epoch  5

我的主要工作人员的情况如何,但另一个是印刷品:

## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  2
## epoch  3
## epoch  3
## epoch  4
## epoch  5

并且执行之间的模式会发生变化。

我误解了什么吗?

此外,主要工作人员结束了,而另一名工人在印刷后没有进一步发展:

## epoch 4

并保持循环。它似乎是一个竞争条件,主要工作人员结束,变量epoch以某种方式被破坏,所以另一个工人永远不会看到它增加到5然后永远不会停止。 有什么想法可以避免这种情况吗?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您正在观察一些事情,我认为我们可以解压缩它们以更好地理解事物。

通过为培训流程添加障碍来同步副本。其中一个障碍阻止工人完成其步骤,直到主要工作人员更新了上一次迭代的权重。如果首席工作人员退出,则可能是其他工人从未被解除阻塞,因此你看到非首席工作人员陷入了第4纪元(我认为它实际上是试图运行train_op)。

另外,你在用什么课程?如果你使用带有正确钩子的MonitoredTrainingSession,它的设计不允许你在训练循环中每次迭代多次调用session.run,所以这可能会创建你在打印的内容中看到的不确定性正常的工人。为了看到正确的行为,我会做类似

的事情
<div class="tooltip">
<span>tooltip text</span>
<input type="button" class="button active"  value = "HOVER ME" >
</div>

这仍然很奇怪吗?