2017-02-27 53 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 

這是否仍然很奇怪?