使用tf.train.MonitoredTrainingSession
编写检查点文件时,它会以某种方式写入多个元图。我做错了什么?
我将其剥离为以下代码:
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
运行此将提供重复的元图,如张量板警告所示:
$ tensorboard --logdir ../train/test1/ --port=6006
警告:tensorflow:每次运行或在那里发现多个图形事件 是一个包含graph_def的元图,以及一个或多个图 事件。用最新的事件覆盖图表。开始 TensorBoard 54 at local:6006(按CTRL + C退出)
这是张量流 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 --logdir ../traitest2/ --port=6006
在本地启动TensorBoard 54:6006(按CTRL + C退出)
我想解决这个问题,因为我怀疑我错过了一些基本的东西,而且这个错误可能与我在分布式模式下遇到的其他问题有关。我想在更新数据时随时重启tensorboard。此外,TensorBoard在发布许多警告时似乎变得非常缓慢。
有一个相关问题:tensorflow Found more than one graph event per run 在这种情况下,错误是由于多次运行(使用不同的参数)写入同一输出目录。这里的情况是关于清理输出目录的单次运行。
在分布式模式下运行MonitoredTrainingSession版本会产生相同的错误。
更新10月12日
@Nikhil Kothari建议使用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 --logdir ../train/test3/ --port=6006
不过,每个代码块都是独立的,copy =将它粘贴到Jupyter笔记本中,你就会复制问题。警告:tensorflow:每次运行或在那里发现多个图形事件 是一个包含graph_def的元图,以及一个或多个图 事件。用最新的事件覆盖图表。开始 TensorBoard 54 at local:6006(按CTRL + C退出)
答案 0 :(得分:3)
我想知道这是否是因为群集中的每个节点都运行相同的代码,将自己声明为主管,并保存图表和检查点。
如果is_chief = True只是在Stack Overflow上的帖子中说明的话,或者正是你正在使用的那些......我不这样做...所以在这里猜一点。
我个人使用MonitoredSession而不是MonitoredTrainingSession,并根据代码是否在master / chief上运行创建了一个钩子列表。示例:https://github.com/TensorLab/tensorfx/blob/master/src/training/_trainer.py#L94
答案 1 :(得分:0)
您应在“ MonitoredTrainingSession”中设置参数 chief_only_hooks ,代码如下:
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,
chief_only_hooks = hooks,
save_checkpoint_secs = None,
save_summaries_steps = None,
save_summaries_secs = None) as mon_sess: