Как создать клиент обслуживания тензорного потока для "широкой и глубокой" модели?
Я создал модель, основанную на "широком и глубоком" примере (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% идиоматично, но я уверен, что он работает. Пока.