Запросы к API прогноза обслуживания TensorFlow возвращают ошибку «Отсутствуют входные данные» - PullRequest
0 голосов
/ 12 ноября 2018

Я обучил простую регрессионную модель для соответствия линейной функции следующим уравнением: y = 3x + 1. В целях тестирования я сохранил модель в качестве контрольных точек, чтобы я мог возобновить обучение, и мне не пришлось бы каждый раз начинать с нуля.

Теперь я хочу сделать эту модель доступной через порцию TF. По этой причине мне пришлось преобразовать его в формат тензорного потока SavedModel с помощью этого сценария:

import tensorflow as tf
import restoretest as rt  ## just the module that contains the linear model

tf.reset_default_graph()        

latest_checkpoint = tf.train.latest_checkpoint('path/to/checkpoints')
model = rt.LinearModel()
saver = tf.train.Saver()

export_path = 'path/to/export/folder'

with tf.Session() as sess:

    if latest_checkpoint:
        saver.restore(sess, latest_checkpoint)
    else:
        raise ValueError('No checkpoint file found') 

    print('Exporting trained model to', export_path)

    builder = tf.saved_model.builder.SavedModelBuilder(export_path)

    ## define inputs and outputs

    tensor_info_x = tf.saved_model.utils.build_tensor_info(model.x)
    tensor_info_y = tf.saved_model.utils.build_tensor_info(model.y_pred)

    prediction_signature = (
            tf.saved_model.signature_def_utils.build_signature_def(
                    inputs={'xvals': tensor_info_x},
                    outputs={'yvals': tensor_info_y},
                    method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))


    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: prediction_signature},
                                         main_op=tf.tables_initializer(),
                                         strip_default_attrs=True)

    builder.save()

    print('Done exporting')

Это создает папку (как и ожидалось) с содержимым:

export_folder
    |-saved_model.pb
    |-variables
        |-variables.index
        |-variables.data-00000-of-00001

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

sudo docker run -p 8501:8501 --mount type=bind,source=path/to/export/folder,target=models/linear -e MODEL_NAME=linear -t tensorflow/serving

Это, кажется, выполняется без проблем, так как я получаю много информации. В последней строке вывода написано

[evhttp_server.cc: 237] RAW: вход в цикл обработки событий ...

Полагаю, сервер ждет запросов. Теперь, когда я пытаюсь отправить запрос к нему через curl, я получаю сообщение об ошибке:

curl -d '{"xvals": [1.0 2.0 5.0]}' -X POST http://localhost:8501/v1/models/linear:predict

{"error": "отсутствует ключ" inputs "или" instances \ "}

Что я делаю не так? Модель работает, когда я отправляю фиктивные значения через saved_model_cli.

1 Ответ

0 голосов
/ 12 ноября 2018

Похоже, что тело запроса POST должно быть изменено.Согласно документации формат должен быть

{ "inputs": {"xvals": [1.0 2.0 5.0]} }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...