SavedModelBuilder的documentation表示添加到SavedModel的第一个元图(通过add_meta_graph_and_variables()
)将添加变量,并且任何其他元图(通过add_meta_graph()
)将是只添加了他们的图表定义,即没有变量。
然而,我尝试了它,但似乎并非如此。我有一个模型,其协议缓冲区文件(saved_model.pb
)占用大约500 MB,带有一个元图。如果我向SavedModel添加第二个元图(在我的情况下只是第一个图的子图),saved_model.pb
突然占用大约1 GB,即之前的两倍。
如果变量占模型文件大小的大部分,并且据称只保存一次,那么这怎么可能?
答案 0 :(得分:1)
SavedModel格式确实只保存元图之间共享的变量一次。
您的模型是否可能包含大常量(或者说变量初始化为大常量)? SavedModel格式将能够为变量重用存储,但不能为常量重用。例如,请考虑以下事项:
import tensorflow as tf
import numpy as np
builder = tf.saved_model.builder.SavedModelBuilder("/tmp/mymodel")
def build_graph():
# A 10MB numpy value of ones
init_value = np.ones(10 * (2 ** 20) / 4).astype(np.float32)
v = tf.Variable(init_value, name='MyVariable')
return tf.global_variables_initializer()
with tf.Graph().as_default():
with tf.Session() as sess:
sess.run(build_graph())
builder.add_meta_graph_and_variables(sess, ['tag1'])
with tf.Graph().as_default():
build_graph()
builder.add_meta_graph(['tag2'])
builder.save()
此处保存的模型大约为30MB(du -csh /tmp/mymodel
):
tag1
tag2
相反,如果您将初始值更改为不是大常量,例如,使用类似:
init_value = tf.ones([10 * (2 ** 20) / 4])
然后你会发现保存的模型只消耗~10MB - 因为初始化常量不需要存储在图中。
希望有所帮助。