如何为 'wide and deep' 模型创建一个 tensorflow 服务客户端?

How to create a tensorflow serving client for the 'wide and deep' model?

我已经根据 'wide and deep' 示例 (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 从原型文件创建 Java 类 来做到这一点。

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

非常感谢!

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

而不是该块

这意味着您必须定义 serving_input_fn(),这当然应该具有与 wide and deep 教程中定义的 input_fn() 不同的签名。也就是说,向前推进,我想建议 input_fn() 类型的东西应该 return 一个 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% 地道,但我很确定它有效。现在。

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

TL;DR

导出估算器有四个步骤:

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

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

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

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

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

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

  2. 通过添加py_binary.

  3. 创建或修改相应的BUILD文件
  4. 构建并 运行 模型服务器,例如tensorflow_model_server.

  5. 创建、构建和 运行 一个客户端,该客户端向我们的 tensorflow_model_server 发送 tf.Example 进行推理。

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