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

私のチーフワーカーの場合のどちらが、他の1枚の版画:

## 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

ため

おかげで、あなたが観察しているいくつかの事があり、私たちは物事をよりよく理解するためにそれらを解凍することができると思います。

同期レプリカは、トレーニングプロセスに障壁を追加することによって機能します。障害の1つは、チーフワーカーが以前の反復からウェイトを更新するまで、ワーカーがそのステップを終了するのを防ぎます。チーフワーカーが出たら、他のワーカーはブロックされていないかもしれないので、エポック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 

これはまだ変ですか?

関連する問題