Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow SyncReplicateSOptimizer不同步工作进程?_Tensorflow - Fatal编程技术网

Tensorflow SyncReplicateSOptimizer不同步工作进程?

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时: 火车进站=#我的火车进站

我正在尝试使用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时:
火车进站=#我的火车进站
_,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
这还奇怪吗