2017-10-08 8 views
8

tf.train.MonitoredTrainingSessionを使用してチェックポイントファイルを書き込むと、何らかの方法で複数のメタデータが書き込まれます。私は間違って何をしていますか?MonitoredTrainingSessionは、実行ごとに複数のメタデータイベントを書き込みます

$ tensorboard --logdir ../train/test1/ --port=6006 

WARNING::tensorflow:tensorboard警告によって証明されるように、

import tensorflow as tf 
global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name="global_step") 
train = tf.assign(global_step, global_step + 1) 
saver = tf.train.Saver() 
hooks = [(tf.train.CheckpointSaverHook(checkpoint_dir=output_path + "test1/ckpt/", 
              save_steps = 10, 
              saver = saver))] 

with tf.train.MonitoredTrainingSession(master = '', 
             is_chief = True, 
             checkpoint_dir = None, 
             hooks = hooks, 
             save_checkpoint_secs = None, 
             save_summaries_steps = None, 
             save_summaries_secs = None) as mon_sess: 
    for i in range(30): 
     if mon_sess.should_stop(): 
      break 
     try: 
      gs, _ = mon_sess.run([global_step, train]) 
      print(gs) 
     except (tf.errors.OutOfRangeError,tf.errors.CancelledError) as e: 
      break 
     finally: 
      pass 

重複metagraphsを与えるこれを実行する:より多くを発見

私は、次のコードにそれを剥奪しました1つの実行につき1つのグラフイベント、またはそこに はgraph_defと1つ以上のグラフ イベントを含むメタデータでした。グラフを最新のイベントで上書きします。地元で TensorBoard 54の開始:6006(私はアップグレードすることはできません)1.2.0 tensorflow

これはあるが(Ctrlキーを押しながらCは終了します)。 6006(Ctrlキーを押しながら:地元でTensorBoard 54を起動する

$ tensorboard --logdir ../traitest2/ --port=6006 

:なしtensorboardエラーで

global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name="global_step") 
train = tf.assign(global_step, global_step + 1) 
saver = tf.train.Saver() 
init_op = tf.global_variables_initializer() 
with tf.Session() as sess: 
    sess.run(init_op) 
    for i in range(30): 
     gs, _ = sess.run([global_step, train]) 
     print(gs) 
     if i%10==0: 
      saver.save(sess, output_path+'/test2/my-model', global_step=gs) 
      print("Saved ckpt") 

結果:監視対象セッションせずに同じことを実行している

は、右のチェックポイントの出力を提供します+ Cを終了する)

私はこれを私が疑うように修正したい何か基本的なものがありません。このエラーは分散モードで他の問題と関連しているかもしれません。データを更新したいときはいつでもテンソルボードを再起動する必要があります。さらに、TensorBoardは、これらの警告の多くを出すと、時間の経過とともに実際には遅くなるようです。

関連する質問があります。tensorflow Found more than one graph event per run この場合、エラーは複数の実行(パラメータが異なる)が同じ出力ディレクトリに書き込まれたためです。ここでの例は、きれいな出力ディレクトリへの1回の実行についてです。

MonitoredTrainingSessionバージョンを分散モードで実行すると、同じエラーが発生します。

更新10月 - 12

@Nikhilコタリは次のように、代わりに大きなtf.train.MonitoredTrainSessionラッパーのtf.train.MonitoredSessionを使用することが提案:

import tensorflow as tf 
global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name="global_step") 
train = tf.assign(global_step, global_step + 1) 
saver = tf.train.Saver() 
hooks[(tf.train.CheckpointSaverHook(checkpoint_dir=output_path + "test3/ckpt/", 
              save_steps=10, 
              saver=saver))] 

chiefsession = tf.train.ChiefSessionCreator(scaffold=None, 
              master='', 
              config=None, 
              checkpoint_dir=None, 
              checkpoint_filename_with_path=None) 
with tf.train.MonitoredSession(session_creator=chiefsession, 
       hooks=hooks, 
       stop_grace_period_secs=120) as mon_sess: 
    for i in range(30): 
     if mon_sess.should_stop(): 
      break 
     try: 
      gs, _ = mon_sess.run([global_step, train]) 
      print(gs) 
     except (tf.errors.OutOfRangeError,tf.errors.CancelledError) as e: 
      break 
     finally: 
      pass 

は、残念ながら、これはまだ同じtensorboardエラーを与える:

$ tensorboard --logdir ../train/test3/ --port=6006 

警告:テンソルフロー:実行ごとに複数のグラフイベントが見つかりました。または、 はgraph_defと1つ以上のグラフ イベントを含むメタデータでした。グラフを最新のイベントで上書きします。地元で TensorBoard 54の開始:6006

ところで、各コードブロックは=コピー、スタンドアロンJupyterのノートブックに貼り付けると、あなたは、問題を再現しますです(Ctrlキーを押しながらCは終了します)。

+0

これはわかっていますが、ちょうどいい場合... 'MonitoredTrainingSession'を作成するときに' checkpoint_dir = your_path'を指定するとうまくいきます。 – npf

+0

提案をお寄せいただきありがとうございます。私は今、MonitoredSessionとフックの両方にcheckpoint_dirを追加しようとしました。しかし違いはありません。それは "うまく動作する"、ちょっと罰金、..まだ複数のグラフイベントの問題があります。 – Bastiaan

答えて

3

これは、クラスタ内のすべてのノードが同じコードを実行していて、チーフとして宣言し、グラフとチェックポイントを保存しているためです。

is_chief = Trueがスタックオーバーフローのここの記事で説明しているだけであれば、私はそうではありません。まさにあなたが使っているものです。ここでちょっと推測してください。

私は個人的にMonitoredTrainingSessionの代わりにMonitoredSessionを使用し、コードがマスター/チーフで実行されているかどうかに基づいてフックのリストを作成しました。例:https://github.com/TensorLab/tensorfx/blob/master/src/training/_trainer.py#L94

+0

上記のコードは、単一スレッドの問題を再現します。はい、最終的には分散して作業したいのですが、この質問は単純なケースで正しいと思っています。私はMonitoredSessionを見ていきますが、違いは何か、概念的に分かりますか? – Bastiaan

+0

MonitoredTrainingSessionはis_chiefとnot ...に基づいていろいろなフックを追加しますが、私の場合、私は自分のフックの実装をフルコントロールしたいので、派生クラスは使用しませんでした。 –

+0

提案していただきありがとうございます。私は 'MonitoredSession'を試みましたが、それでも同じエラーが出ます。あなたの提案で質問を更新しました。 – Bastiaan

関連する問題