在进行分布式tf培训时,将迭代器状态保存在所有工作人员上

时间:2018-11-04 16:11:14

标签: tensorflow tensorflow-datasets tensorflow-estimator

我在一台机器上运行tensorflow DataSet + Estimator train_and_evaluate,但有多个工作程序(加上一个负责人)。我想在每个工作人员(包括负责人)上保存数据集迭代器的确切状态。从我的经验来看,这是一个至关重要的功能,因为如果教练在到达一个纪元之前两次看到相同的数据(例如由于抢占或重新启动),那么它比顺次看到整个纪元要合适得多。

我尝试了here概述的方法,但是在检查保存的检查点时,我只看到一个iterator_state变量。实际上,我已经尝试过以下方法(由一名工人和一名负责人进行):

with tf.name_scope('iterator_%d' % args.worker_index):
  iterator = data_set.make_initializable_iterator()
saveable_obj = tf.contrib.data.make_saveable_from_iterator(iterator)
tf.add_to_collection(tf.GraphKeys.SAVEABLE_OBJECTS, saveable_obj)
tf.add_to_collection(tf.GraphKeys.TABLE_INITIALIZERS, iterator.initializer)

但是结果是相似的,即仅保存了一个迭代器状态(实际上是一个负责人的状态);请注意,迭代器绝对不是跨工作程序全局的,因为在我的情况下,不同的工作程序会读取不同的输入文件:

python -m inspect_checkpoint --file_name model.ckpt-953
bias_0 (DT_FLOAT) [1024]
bias_0/Adagrad (DT_FLOAT) [1024]
bias_1 (DT_FLOAT) [512]
bias_1/Adagrad (DT_FLOAT) [512]
bias_2 (DT_FLOAT) [256]
bias_2/Adagrad (DT_FLOAT) [256]
bias_3 (DT_FLOAT) [128]
bias_3/Adagrad (DT_FLOAT) [128]
bias_4 (DT_FLOAT) [1]
bias_4/Adagrad (DT_FLOAT) [1]
global_step (DT_INT64) []
input_layer/j_embedding/embedding_weights (DT_FLOAT) [2118,32]
input_layer/j_embedding/embedding_weights/Adagrad (DT_FLOAT) [2118,32]
iterator_1/Iterator:0-state (DT_VARIANT) []
kernel_0 (DT_FLOAT) [486,1024]
kernel_0/Adagrad (DT_FLOAT) [486,1024]
kernel_1 (DT_FLOAT) [1024,512]
kernel_1/Adagrad (DT_FLOAT) [1024,512]
kernel_2 (DT_FLOAT) [512,256]
kernel_2/Adagrad (DT_FLOAT) [512,256]
kernel_3 (DT_FLOAT) [256,128]
kernel_3/Adagrad (DT_FLOAT) [256,128]
kernel_4 (DT_FLOAT) [128,1]
kernel_4/Adagrad (DT_FLOAT) [128,1]

我也尝试在data_set.make_initializable_iterator中使用shared_name参数,但这没有效果。在我看来,估算器保护程序仅适用于主要声明的变量。但是我敢肯定,它比这更灵活,只是不知道如何使它也能考虑其他工人。谢谢!

0 个答案:

没有答案