TensorFlow:SavedModelBuilder的add_meta_graph():为什么每个额外的元图占用与完整模型相同的磁盘空间?

时间:2017-10-14 13:47:01

标签: tensorflow

SavedModelBuilder的documentation表示添加到SavedModel的第一个元图(通过add_meta_graph_and_variables())将添加变量,并且任何其他元图(通过add_meta_graph())将是只添加了他们的图表定义,即没有变量。

然而,我尝试了它,但似乎并非如此。我有一个模型,其协议缓冲区文件(saved_model.pb)占用大约500 MB,带有一个元图。如果我向SavedModel添加第二个元图(在我的情况下只是第一个图的子图),saved_model.pb突然占用大约1 GB,即之前的两倍。

如果变量占模型文件大小的大部分,并且据称只保存一次,那么这怎么可能?

1 个答案:

答案 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):

  • 变量内容为10MB
  • 10MB表示存储在tag1
  • 图表中的常量(初始值)
  • 10MB表示存储在tag2
  • 图表中的常数(百分比值)

相反,如果您将初始值更改为不是大常量,例如,使用类似:

init_value = tf.ones([10 * (2 ** 20) / 4])

然后你会发现保存的模型只消耗~10MB - 因为初始化常量不需要存储在图中。

希望有所帮助。