MonitoredTrainingSession每次运行写入多个元图事件

Bas*_*aan 8 python tensorflow google-cloud-ml

使用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
Run Code Online (Sandbox Code Playgroud)

运行此操作将提供重复的元图,如张量板警告所示:

$ tensorboard --logdir ../train/test1/ --port=6006
Run Code Online (Sandbox Code Playgroud)

警告:tensorflow:每次运行发现多个图形事件,或者有一个包含graph_def的元图形,以及一个或多个图形事件.用最新的事件覆盖图表.在本地启动TensorBoard 54: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")
Run Code Online (Sandbox Code Playgroud)

结果没有张量错误:

$ tensorboard --logdir ../traitest2/ --port=6006
Run Code Online (Sandbox Code Playgroud)

在本地启动TensorBoard 54:6006(按CTRL + C退出)

我想解决这个问题,因为我怀疑我缺少一些基本的东西,这个错误可能与我在分布式模式下的其他问题有一些联系.我想在更新数据时随时重启tensorboard.此外,TensorBoard在发布许多警告时似乎变得非常缓慢.

有一个相关的问题:tensorflow每次运行发现多个图形事件 在这种情况下,错误是由于多次运行(使用不同的参数)写入同一输出目录.这里的情况是关于清理输出目录的单次运行.

在分布式模式下运行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
Run Code Online (Sandbox Code Playgroud)

不幸的是,这仍然会产生相同的张量错误:

$ tensorboard --logdir ../train/test3/ --port=6006
Run Code Online (Sandbox Code Playgroud)

警告:tensorflow:每次运行发现多个图形事件,或者有一个包含graph_def的元图形,以及一个或多个图形事件.用最新的事件覆盖图表.在本地启动TensorBoard 54:6006(按CTRL + C退出)

顺便说一句,每个代码块都是独立的,copy =将它粘贴到Jupyter笔记本中,你将复制问题.

Nik*_*ari 3

我想知道这是否是因为集群中的每个节点都运行相同的代码,声明自己为酋长,并保存图表和检查点。

我不知道 is_chief = True 是否只是 Stack Overflow 上的帖子中的说明性内容,或者这正是您正在使用的内容......所以在这里猜测一下。

我个人使用 MonitoredSession 而不是 MonitoredTrainingSession,并根据代码是否在 master/chief 上运行创建了一个钩子列表。示例: https: //github.com/TensorLab/tensorfx/blob/master/src/training/_trainer.py#L94