如何在tensorflow tf 1.11.0中转储没有优化器变量的已保存模型?

uinbv5nw  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(124)

我在python中训练了tf模型,在python中训练了dump保存的模型,在cpp中训练了加载和推理。我发现磁盘中保存的模型的大小是它应该大小的三倍,加载和推理时的内存使用也是如此。这是因为保存的模型包含了优化器相关的变量。那么在tf中转储保存的模型时,如何排除那些优化器相关的变量呢?
示例笔记本代码:

import tensorflow as tf
print 'tf.__version__', tf.__version__
! rm -rf tmp
! mkdir -p tmp/test_ckpt/
holder = tf.placeholder(tf.int32, [None, 3], name='fea1')
emb_table = tf.get_variable(
    shape=[int(1e7), 20],
    initializer=tf.initializers.random_uniform(minval=-0.04, maxval=0.04),
    dtype=tf.float32,
    name='emb_table',
    trainable=True)
emb = tf.nn.embedding_lookup(emb_table, holder)
loss = pred = tf.reduce_sum(emb, name='pred')
optimzer = tf.train.AdamOptimizer(0.01).minimize(loss)

sess = tf.Session(config=tf.ConfigProto(
    gpu_options=tf.GPUOptions(allow_growth=True, visible_device_list='0'),
    allow_soft_placement=True))
sess.run(tf.local_variables_initializer())
sess.run(tf.global_variables_initializer())
sess.run(optimzer, feed_dict={holder: [[1,2,3], [4,5,6]]})

saver = tf.train.Saver(tf.trainable_variables())
saver.save(sess, 'tmp/test_ckpt/ckpt')
tf.saved_model.simple_save(sess, 'tmp/test_saved', 
    inputs={'fea1': holder,}, outputs={'pred': pred})
expect_size_in_mb = 1e7 * 20 * 4 / 1024 / 1024
print('expect_size_in_mb', expect_size_in_mb)
print('dump model size:')
! du -sh tmp/*

获取输出:tf.版本1.11.0
(“MB中的预期大小”,762.939453125)
转储模型大小:
763 M临时/测试检查点
2.3G临时/测试_已保存
我想要一个763 MB的保存模式,但它是2.3 GB现在.

628mspwn

628mspwn1#

在tensorflow 1.11.0中,没有保存_traces=False或include_optimizer=False参数,因此我必须自己排除优化器变量。
方法很简单:
首先,构建你的图,添加优化器,通过样本训练,最后你转储一个检查点,是否保存优化器变量在这里并不重要,然后停止这个过程。
第二,启动一个新的过程,重建tensorflow 图(你的网络),但是不要在你的图中添加优化器。然后恢复以前的检查点并导出为保存的模型。由于你现在不添加优化器变量,恢复函数将忽略检查点中的这些优化器变量。
新流程示例代码:

! rm -rf tmp/test_saved
import tensorflow as tf
sess = tf.Session(config=tf.ConfigProto(
    gpu_options=tf.GPUOptions(allow_growth=True, visible_device_list='0'),
    allow_soft_placement=True))

holder = tf.placeholder(tf.int32, [None, 3], name='fea1')
emb_table = tf.get_variable(
    shape=[int(1e7), 20],
    initializer=tf.initializers.random_uniform(minval=-0.04, maxval=0.04),
    dtype=tf.float32,
    name='emb_table_shape',
    trainable=True)
emb = tf.nn.embedding_lookup(emb_table, holder)
loss = pred = tf.reduce_sum(emb, name='pred')
# optimzer = tf.train.AdamOptimizer(0.01).minimize(loss)

saver = tf.train.Saver()
saver.restore(sess, 'tmp/test_ckpt_all/ckpt')
tf.saved_model.simple_save(sess, 'tmp/test_saved',
    inputs={'fea1': holder,}, outputs={'pred': pred})
! du -sh tmp/*

相关问题