我正在尝试使用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
然后永远不会停止。
有什么想法可以避免这种情况吗?
感谢您的帮助
答案 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>
这仍然很奇怪吗?