使用Tensorflow估计器保存检查点时如何删除不可训练的变量?

时间:2019-04-25 03:44:36

标签: tensorflow-estimator

我有一个tf模型,可使用大小大于10GB的 untrainable 嵌入层进行训练。我不想将此变量保存到我的检查点文件中,因为它占用了太多的时间和空间。

是否可以在没有此不可训练变量的情况下保存ckpt并正常使用tf.estimator?

在分布式模式下训练模型时,参数服务器将保存此变量,并且花费太多时间来同步变量。有可能避免这个问题吗?我认为,此变量的值不会永远改变,参数服务器不需要对其执行任何操作。

这是我尝试过的:

  1. 我尝试使用tf.constant而不是tf.variable来保存此嵌入,但是由于原型限制,我无法构建这样的常数。

    emb_np = np.load(file_name)
    embedding_table = tf.constant(
        value=emb_np,
        name=embedding_name,
        shape=[vocab_size, embedding_size])
    

    错误消息是这样的:

    "Cannot create a tensor proto whose content is larger than 2GB."
    

实际上,我现在不能获得大于2GB的常量。

  1. 替换估计器的默认保护程序。

    saver=tf.train.Saver(
          var_to_save,
          sharded=True,
          max_to_keep=20,
          keep_checkpoint_every_n_hours=(
              100000),
          defer_build=False,
          save_relative_paths=True)
    

    我从estimator的默认保存器中删除了此变量,并且在构建模型时将从另一个ckpt初始化此变量,但是从现有ckpt训练模型并评估模型时,无法使用检查点。错误消息是这样的:

    RuntimeError: Init operations did not make model ready for local_init.  Init op: group_deps, init fn: None, error: Variables not initialized: dense/kernel/Adagrad, dense/bias/Adagrad, dense_1/kernel/Adagrad, dense_1/bias/Adagrad, dense_2/kernel/Adagrad, dense_2/bias/Adagrad, w1/Adagrad
    

我认为原因是当使用变量列表定义tf.train.Saver时,必须将“ defer_build”参数设置为false,但是我不知道如何使用估算器在代码中构建它。

  1. 我认为参数服务器不需要管理不可训练的变量,但是根据PS的内存使用情况,不可训练的变量保存在这里。是否有任何选项可以更改此设置?

0 个答案:

没有答案