2017-02-27 61 views
0

我正在尝试使用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,然后永不停止。 任何想法,以避免这一点?

感谢您的帮助

回答

0

有您所观察的几件事情,我认为我们可以解开他们了解事情做得更好。

同步副本的工作原理是在培训过程中添加障碍。其中一个障碍阻止工作人员完成其步骤,直到主要工作人员更新上一次迭代的权重。如果主要工作人员退出,那么可能是因为其他工人永远不会畅通无阻,因此您看到非主要工作人员被困在第4个时代(我认为它实际上停留在试图运行train_op的过程中)。

此外,你使用什么会议?如果您正在使用具有正确钩子的MonitoredTrainingSession,则它的目的不是允许您在训练循环中每次迭代多次调用session.run,因此这可能会创建您在打印的内容中看到的不确定性正常的工人。要看到正确的行为,我会做类似

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 

这是否仍然很奇怪?