2017-10-08 22 views
8

Kiedy piszemy pliki punktów kontrolnych za pomocą tf.train.MonitoredTrainingSession, to w jakiś sposób zapisuje wiele metepikseli. Co ja robię źle?MonitoredTrainingSession zapisuje więcej niż jedno zdarzenie metagraph na jeden bieg

rozebrałem ją do następującego kodu:

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 

Running to da duplikaty metagraphs, o czym świadczy ostrzeżenia tensorboard:

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

Ostrzeżenie: tensorflow: Znaleziono ponad jedno graficzne zdarzenie na bieg, lub tam było meteptukiem zawierającym graph_def, a także jednym lub większą liczbą zdarzeń z wykresu . Zastępowanie wykresu najnowszym wydarzeniem. Począwszy TensorBoard 54 w lokalu: 6006 (Ctrl + C, aby zamknąć)

To jest w tensorflow 1.2.0 (nie mogę uaktualnić).

bieganie to samo bez monitorowanej sesji daje prawo wyjścia kontrolnego:

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

Skutkuje bez błędów tensorboard:

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

Zaczynając TensorBoard 54 w lokalu: 6006 (Ctrl + C, aby zakończyć)

Chciałbym to naprawić, jak podejrzewam Brakuje mi czegoś fundamentalnego, a ten błąd może mieć związek z innymi problemami, które mam w trybie rozproszonym. Muszę ponownie uruchomić tensorboard, gdy tylko chcę zaktualizować dane. Co więcej, wydaje się, że TensorBoard staje się naprawdę wolny z czasem, gdy wypuszcza wiele z tych ostrzeżeń.

Istnieje pokrewne pytanie: tensorflow Found more than one graph event per run W tym przypadku błędy były spowodowane wielokrotnymi uruchomieniami (z różnymi parametrami) zapisanymi w tym samym katalogu wyjściowym. Przypadek tutaj dotyczy pojedynczego uruchomienia do czystego katalogu wyjściowego.

Uruchomienie wersji MonitoredTrainingSession w trybie rozproszonym daje takie same błędy.

Aktualizacja października-12

@Nikhil Kothari zalecane, aby użyć tf.train.MonitoredSession zamiast większej tf.train.MonitoredTrainSession owijki, co następuje:

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 

Niestety to wciąż daje te same błędy tensorboard:

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

OSTRZEŻENIE: tensorflow: Znalezione więcej niż jedno zdarzenie grafu na przebieg, lub tam było meteptukiem zawierającym wykres_def, a także jednym lub wieloma zdarzeniami z wykresu . Zastępowanie wykresu najnowszym wydarzeniem.Począwszy TensorBoard 54 w lokalu: 6006 (Ctrl + C, aby zamknąć)

btw, każdy blok kodu jest stand-alone, kopiowanie = wkleić go w notatniku Jupyter i będzie replikować problemu.

+0

Jestem pewien, że zdajesz sobie sprawę z tego, ale na wszelki wypadek ... Jeśli podasz 'checkpoint_dir = your_path' podczas tworzenia' MonitoredTrainingSession' będzie po prostu działać. – npf

+0

Dzięki za sugestię, próbowałem już teraz, aby dodać punkt kontrolny w obu MonitoredSession i hak. Jednak nie ma różnicy. To "działa dobrze", w porządku, ... nadal ma problem z wieloma zdarzeniami graficznymi. – Bastiaan

Odpowiedz

3

Zastanawiam się, czy tak jest, ponieważ każdy węzeł w klastrze działa pod tym samym kodem, deklarując się jako wodza i zapisując wykresy i punkty kontrolne.

Nie wiem, czy is_chief = True jest po prostu ilustracją w tym poście na Stack Overflow, czy to jest dokładnie to, czego używasz ... więc zgadnij trochę tutaj.

Osobiście użyłem MonitoredSession zamiast MonitoredTrainingSession i utworzyłem listę haków na podstawie tego, czy kod działa na master/naczelniku, czy nie. Przykład: https://github.com/TensorLab/tensorfx/blob/master/src/training/_trainer.py#L94

+0

Powyższy kod replikuje problem w pojedynczym wątku, tak ostatecznie chcę pracować w dystrybucji, ale to pytanie dotyczy właśnie uzyskania tego w prostym przypadku. Rzucę okiem na MonitoredSession, czy wiesz, co to jest różnica, koncepcyjnie? – Bastiaan

+0

MonitoredTrainingSession dodaje różne przechwyty oparte na is_chief vs. nie ... ale w moim przypadku chciałem mieć pełną kontrolę + używać własnych implementacji haków, więc nie użyłem klasy pochodnej. –

+0

Dzięki za sugestię, wypróbowałem 'MonitoredSession', ale wciąż daje takie same błędy. Zaktualizowałem to pytanie, podając Twoje sugestie. – Bastiaan