我有一个tf模型,可使用大小大于10GB的 untrainable 嵌入层进行训练。我不想将此变量保存到我的检查点文件中,因为它占用了太多的时间和空间。
是否可以在没有此不可训练变量的情况下保存ckpt并正常使用tf.estimator?
在分布式模式下训练模型时,参数服务器将保存此变量,并且花费太多时间来同步变量。有可能避免这个问题吗?我认为,此变量的值不会永远改变,参数服务器不需要对其执行任何操作。
这是我尝试过的:
我尝试使用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的常量。
替换估计器的默认保护程序。
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,但是我不知道如何使用估算器在代码中构建它。