我正在尝试使用SyncReplicasOptimizer通过同步SGD来训练模型。我遵循mnist_replicas.py中的示例。我使用1 ps和2个工人。SyncReplicasOptimizer不同步工作人员?
我加一个变量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
我SyncReplicasOptimizer的理解,解释here是,在我的训练循环的每次执行时,它会等待我的2名工人结束他们的反向传播,平均梯度和申请日EM。
所以我期待这两个工人打印:
## 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
,然后永不停止。 任何想法,以避免这一点?
感谢您的帮助