Cloud-ML无法使用table_initializer部署模型

时间:2018-10-15 16:31:29

标签: python tensorflow tensorflow-serving google-cloud-ml

我希望将训练有素的模型部署到ml-engine。我可以在本地运行我的代码,例如:

with tf.Session() as sess:
  sess.run([tf.global_variables_initializer(), tf.tables_initializer()])
  example_result = sess.run(
                    my_model, 
                    feed_dict=###snip###
                  )

我一直在尝试导出:

export_builder.add_meta_graph_and_variables(
        sess, 
        [tf.saved_model.tag_constants.SERVING], 
        signature_def_map={
            tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: sig
        })

然后我可以将其部署到ml-engine。但是,当我调用模型时,由于未初始化表,因此会出现错误。

如何在自动/默认情况下初始化表的地方部署模型?


我尝试过的事情:

  1. tf.tables_initializer()中的任何操作之前将my_model添加为依赖项

这在第一次时有效,但是在每次后续调用中均失败,并显示一条错误消息,告诉我该表已经初始化

  1. tf.tables_initializer()作为legacy_init_op参数传递给add_meta_graph_and_variables方法。

这完全无法部署到ml-engine并显示错误消息

  

创建版本失败。检测到错误的模型,并显示以下错误:“无法加载   模型:需要一个类似字节的对象,而不是'str'(错误代码:0)“

  1. tf.tables_initializer()tf.saved_model.main_op.main_op()作为main_op参数传递给add_meta_graph_and_variables方法。

在每种情况下,它仍然无法通过与(2.)中相同的错误消息来部署模型:

  

创建版本失败。检测到错误的模型,并显示以下错误:“无法加载   模型:需要一个类似字节的对象,而不是'str'(错误代码:0)“

1 个答案:

答案 0 :(得分:1)

我们必须将表初始化程序op作为assets_collection传递,而且至关重要的是,我们必须在对add_meta_graph_and_variables的调用中包含init_op = tf.tables_initializer() with tf.Session() as sess: sess.run([tf.global_variables_initializer(), init_op]) example_result = sess.run( my_model, feed_dict=###snip### )


    export_builder.add_meta_graph_and_variables(
        sess, 
        [tf.saved_model.tag_constants.SERVING],
        main_op = init_op,
        assets_collection=tf.get_collection(tf.GraphKeys.ASSET_FILEPATHS),
        signature_def_map={
            tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: sig
        }
    )

然后

{{1}}

作为(可能更简单)的替代方法,我们可以使用simple_save方法来保存模型