Tensorflow SyncReplicateSOptimizer不同步工作进程?
我正在尝试使用SyncReplicasOptimizer通过同步SGD训练模型。我遵循了mnist_replicas.py中的示例。我使用1个ps和2个工人 我添加了一个变量Tensorflow SyncReplicateSOptimizer不同步工作进程?,tensorflow,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(历元,1) 然后,在主管创建课程后,我在培训循环中执行以下操作: 为True时: 火车进站=#我的火车进站
epoch
和一个将其增加1的操作(这只是为了了解发生了什么):
epoch=tf.Variable(0,name=“epoch”,trainable=False)
inc_epoch_op=tf.assign_add(历元,1)
然后,在主管创建课程后,我在培训循环中执行以下操作:
为True时:
火车进站=#我的火车进站
_,step=sess.run([train\u op,global\u step],feed\u dict=train\u feed)
损耗=连续运行(总损耗,进给量=列车进给量)
如果是首席执行官:
高级运行(包括新纪元运行)
打印“##epoch”,epoch.eval(sess)
如果历元评估(sess)>4:
打破
我对SyncReplicasOptimizer的理解是,在每次执行我的训练循环时,它将等待我的两个工作人员结束反向传播,平均梯度并应用它们
因此,我希望两位员工都打印:
##纪元1
##第二纪元
##第三纪元
##纪元4
##第五纪元
这是我的首席员工的情况,但另一个打印:
时代2
##第二纪元
##第二纪元
##第二纪元
##第二纪元
##第二纪元
##第二纪元
##第二纪元
##第二纪元
##第二纪元
##第二纪元
##第二纪元
##第二纪元
##第二纪元
##第二纪元
##第二纪元
##第二纪元
##第二纪元
##第二纪元
##第三纪元
##第三纪元
##纪元4
##第五纪元
执行之间的模式会发生变化
我是不是误解了什么
此外,首席工作人员结束工作,而另一名工作人员在打印后没有继续工作:
时代4
不断循环。这似乎是一种竞争条件,其中首席工作人员结束,变量epoch
以某种方式损坏,因此其他工作人员从未看到它增加到5
,然后从未停止。
有没有办法避免这种情况
谢谢你的帮助你正在观察一些东西,我想我们可以把它们拆开以便更好地理解 同步副本的工作原理是为培训过程添加障碍。其中一个障碍阻止工作人员完成其步骤,直到首席工作人员更新了上一次迭代中的权重。如果首席工人退出,那么,可能是其他工人从未被解除封锁,因此你会看到非首席工人在第四纪元被卡住(我认为,它实际上是在试图运行火车时被卡住了) 另外,您正在使用什么会话?如果您正在使用具有正确挂钩的MonitoredTrainingSession,则它的设计不允许您调用session.run(会话)。在训练循环中,每次迭代都要运行一次以上,因此这可能会造成您在普通workers中打印的内容中看到的不确定性。为了看到正确的行为,我会这样做
if is_chief:
inc_epoch_op = tf.assign_add(epoch, 1)
else:
inc_epoch_op = epoch
_, __, ep = sess.run([train_op, global_step, inc_epoch_op])
print "epoch:", ep
这还奇怪吗