2017-10-08 121 views
8

使用tf.train.MonitoredTrainingSession編寫檢查點文件時,它以某種方式寫入多個元圖。我究竟做錯了什麼?MonitoredTrainingSession每次運行寫入多個metagraph事件

我剝奪它歸結爲以下代碼:

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,就證明了這tensorboard警告:

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

警告:tensorflow:有一個以上每次運行一個圖形事件,或者存在 是一個包含graph_def的metagraph,以及一個或多個事件圖。用最新的事件覆蓋圖形。在當地開始 TensorBoard 54:6006(按CTRL + C退出)

這是tensorflow 1.2.0(我不能升級)。

沒有監控會話中運行同樣的事情給出正確的檢查點輸出:

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") 

結果中沒有tensorboard錯誤:

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

在當地開始TensorBoard 54:6006(按CTRL + C退出)

我想解決這個問題,因爲我懷疑我錯過了一些基本的東西,這個錯誤可能與我在分佈式模式下遇到的其他問題有一些聯繫。無論何時我想更新數據,我都必須重新啓動tensorboard。此外,隨着時間的推移,TensorBoard似乎變得非常緩慢,當它發出許多這些警告時。

有一個相關的問題:tensorflow Found more than one graph event per run 在這種情況下,錯誤是由於多次運行(使用不同的參數)寫入同一個輸出目錄。這裏的情況是關於一個簡單的運行到一個乾淨的輸出目錄。

在分佈式模式下運行MonitoredTrainingSession版本會產生相同的錯誤。

更新OCT-12

@Nikhil科塔裏建議使用tf.train.MonitoredSession,而不是更大的tf.train.MonitoredTrainSession包裝,具體如下:

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 

警告:tensorflow:每次運行發現多個圖形事件,或者存在 是包含graph_def的元圖形,以及一個或多個圖形事件。用最新的事件覆蓋圖形。在當地開始 TensorBoard 54:6006(按CTRL + C退出)

順便說一句,每個代碼塊獨立,複製=粘貼在筆記本Jupyter,你會重現問題。

+0

我確定您知道這一點,但以防萬一...... 如果您在創建「MonitoredTrainingSession」時指定'checkpoint_dir = your_path',它將正常工作。 – npf

+0

感謝您的建議,我剛纔試了一下,在MonitoredSession和hook中添加了checkpoint_dir。雖然沒有區別。它「工作得很好」,還挺好,但仍然有多個圖形事件的問題。 – Bastiaan

回答

3

我想知道這是否是因爲你的集羣中的每個節點運行相同的代碼,聲明自己是一個首席,並保存圖形和檢查點。

我不會,如果is_chief = True只是在這裏的堆棧溢出這個帖子說明,或者正是你正在使用...所以在這裏猜測一下。

我個人使用了MonitoredSession而不是MonitoredTrainingSession,並根據代碼是否在主/主上運行創建了一個鉤子列表。例如:https://github.com/TensorLab/tensorfx/blob/master/src/training/_trainer.py#L94

+0

上面的代碼複製單線程中的問題,是的,最終我想分佈式工作,但這個問題是關於在簡單的情況下得到它的權利。我會看看MonitoredSession,你知道區別是什麼嗎? – Bastiaan

+0

MonitoredTrainingSession添加基於is_chief與不...的各種鉤子,但在我的情況下,我只是想完全控制+使用我自己的鉤子實現,所以我沒有使用派生類。 –

+0

感謝您的建議,我嘗試了'MonitoredSession',但它仍然給出了相同的錯誤。我用你的建議更新了這個問題。 – Bastiaan