【问题标题】:How to create a tensorflow serving client for the 'wide and deep' model?如何为“宽而深”模型创建张量流服务客户端?
【发布时间】:2017-06-01 12:11:27
【问题描述】:

我创建了一个基于“宽而深”示例 (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/learn/wide_n_deep_tutorial.py) 的模型。

我已将模型导出如下:

  m = build_estimator(model_dir)
  m.fit(input_fn=lambda: input_fn(df_train, True), steps=FLAGS.train_steps)
  results = m.evaluate(input_fn=lambda: input_fn(df_test, True), steps=1)

  print('Model statistics:')

  for key in sorted(results):
    print("%s: %s" % (key, results[key]))

  print('Done training!!!')

  # Export model
  export_path = sys.argv[-1]
  print('Exporting trained model to %s' % export_path)

  m.export(
   export_path,
   input_fn=serving_input_fn,
   use_deprecated_input_fn=False,
   input_feature_key=INPUT_FEATURE_KEY

我的问题是,如何创建一个客户端来根据这个导出的模型进行预测?另外,我是否正确导出了模型?

最终我也需要能够在 Java 中做到这一点。我怀疑我可以通过使用 gRPC 从 proto 文件创建 Java 类来做到这一点。

文档非常粗略,因此我在这里询问。

非常感谢!

【问题讨论】:

  • 你看过this tutorial吗?哪里出错了?
  • 是的,我已经看过了,谢谢。如果您使用的是纯 tensorflow,那就太好了,但我使用的是 tf.contrib.learn api。我不知道如何使用这个 api 导出和创建客户端。

标签: java tensorflow deep-learning tensorflow-serving


【解决方案1】:

我写了一个简单的教程Exporting and Serving a TensorFlow Wide & Deep Model

TL;DR

导出估算器有四个步骤:

  1. 将要导出的特征定义为估算器初始化期间使用的所有特征的列表。

  2. 使用create_feature_spec_for_parsing 创建功能配置。

  3. 使用input_fn_utils.build_parsing_serving_input_fn构建一个适合用于服务的serving_input_fn

  4. 使用export_savedmodel()导出模型。

要正确运行客户端脚本,您需要执行以下三个步骤:

  1. 创建脚本并将其放置在 /serving/ 文件夹中的某个位置,例如/serving/tensorflow_serving/example/

  2. 通过添加py_binary来创建或修改相应的BUILD文件。

  3. 构建并运行模型服务器,例如tensorflow_model_server

  4. 创建、构建和运行一个客户端,将 tf.Example 发送到我们的tensorflow_model_server 以进行推理。

有关更多详细信息,请查看教程本身。

【讨论】:

    【解决方案2】:

    刚刚花了整整一周的时间来解决这个问题。首先,m.export 将在几周内被弃用,因此请使用:m.export_savedmodel(export_path, input_fn=serving_input_fn),而不是那个块。

    这意味着您必须定义serving_input_fn(),它当然应该具有与广泛而深入的教程中定义的input_fn() 不同的签名。也就是说,向前看,我想建议input_fn()-type 的东西应该返回一个InputFnOps 对象,定义为here

    以下是我想出如何让它发挥作用的方法:

    from tensorflow.contrib.learn.python.learn.utils import input_fn_utils
    from tensorflow.python.ops import array_ops
    from tensorflow.python.framework import dtypes
    
    def serving_input_fn():
      features, labels = input_fn()
      features["examples"] = tf.placeholder(tf.string)
    
      serialized_tf_example = array_ops.placeholder(dtype=dtypes.string,
                                                    shape=[None],
                                                    name='input_example_tensor')
      inputs = {'examples': serialized_tf_example}
      labels = None  # these are not known in serving!
      return input_fn_utils.InputFnOps(features, labels, inputs)
    

    这可能不是 100% 惯用的,但我很确定它有效。暂时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 2020-02-29
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      相关资源
      最近更新 更多