Как создать клиент обслуживания тензорного потока для "широкой и глубокой" модели?

Я создал модель, основанную на "широком и глубоком" примере (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. Я подозреваю, что могу сделать это, создав классы Java из прото файлов с помощью gRPC.

Документация очень отрывочная, поэтому я спрашиваю здесь.

Большое спасибо!

Ответ 1

Я написал простой учебник Экспорт и обслуживание расширенной и глубокой модели TensorFlow.

TL; DR

Для экспорта оценки существует четыре шага:

  • Определить функции для экспорта как список всех функций, используемых при инициализации инициализации.

  • Создайте конфигурацию функций, используя create_feature_spec_for_parsing.

  • Постройте a serving_input_fn, подходящий для использования при обслуживании с помощью input_fn_utils.build_parsing_serving_input_fn.

  • Экспортируйте модель с помощью export_savedmodel().

Чтобы запустить клиент script правильно, вам нужно выполнить следующие три действия:

  • Создайте и поместите ваш script в папку /serve/folder, например./Порция/tensorflow_serving/пример/

  • Создайте или измените соответствующий файл BUILD, добавив py_binary.

  • Создайте и запустите сервер модели, например. tensorflow_model_server.

  • Создайте и запустите клиент, который отправит 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, определенный здесь.

Вот как я понял, как это сделать:

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% идиоматично, но я уверен, что он работает. Пока.