Ошибка обработки тензорного потока: Неверный аргумент: объект JSON: не имеет именованного ввода - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь обучить модель с помощью Amazon Sagemaker и хочу использовать ее с использованием Tensorflow.Для этого я загружаю модель в обслуживающий док Tensorflow и оттуда пытаюсь обслужить ее.

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

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

Я думаю, что проблема в том, что я не определяю должным образом ни serve_input_fn, ни неверный вызов, ни то и другое.Кто-нибудь может помочь?

Завершение вызова сервера обслуживания Tensorflow:

curl -d '{"instances": [{"col3": 1.0}]}' -X POST http://localhost:8501/v1/models/test_model:predict

Ошибка, полученная от обслуживания Tensorflow:

{ "error": "Failed to process element: 0 key: col3 of \'instances\' list. Error: Invalid argument: JSON object: does not have named input: col3" }%    

Файл Python для обучения Sagemaker:

import os
import tensorflow as tf
from tensorflow.python.ops import nn


TRAIN_FILENAME = 'test.csv'
TEST_FILENAME = 'train.csv'

NODES_IN_LAYER = 6
LAYERS_NUM = 10
NUM_LINES_TO_SKIP = 1

CSV_COLUMNS = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8', 'label']
RECORDS_DEFAULTS = [[0], [0], [0.0], [0.0], [0], [0.0], [0.0], [0], [0.0]]

BATCH_SIZE = 32

FEATURE_SPEC = {
    'col3': tf.FixedLenFeature(dtype=tf.float32, shape=[]),
}


def estimator_fn(run_config, params):
    feature_columns = [
        tf.feature_column.numeric_column('col3')]
    return tf.estimator.DNNRegressor(feature_columns=feature_columns,
                                     hidden_units=[NODES_IN_LAYER] * LAYERS_NUM,
                                     activation_fn=nn.tanh,
                                     config=run_config)


def serving_input_fn(params):
    return tf.estimator.export.build_raw_serving_input_receiver_fn(FEATURE_SPEC)


def train_input_fn(training_dir, params):
    """Returns input function that would feed the model during training"""
    return _generate_input_fn(training_dir, TRAIN_FILENAME)


def eval_input_fn(training_dir, params):
    """Returns input function that would feed the model during evaluation"""
    return _generate_input_fn(training_dir, TEST_FILENAME)


def parse_csv(line):
    columns = tf.decode_csv(line, record_defaults=RECORDS_DEFAULTS)
    line_features = dict(zip(CSV_COLUMNS, columns))
    line_label = line_features.pop('label')
    return {'col3': line_features.pop('col3')}, line_label


def _generate_input_fn(training_dir, training_filename):
    filename = os.path.join(training_dir, training_filename)
    dataset = tf.data.TextLineDataset(filename)
    dataset = dataset.skip(NUM_LINES_TO_SKIP).map(parse_csv).batch(BATCH_SIZE)
    return dataset

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Позвоните regress вместо predict

curl -d '{"examples": [{"col3": 1.0}]}' -X POST http://localhost:8501/v1/models/test_model:regress

Документы: https://github.com/tensorflow/serving/blob/master/tensorflow_serving/g3doc/api_rest.md#make-rest-api-calls-to-modelserver

0 голосов
/ 15 апреля 2019

Попробуйте сначала проверить экспортированную модель, используя saved_model_cli, чтобы убедиться, что ваши входы и выходы соответствуют ожидаемым:

saved_model_cli show --dir . --tag_set serve --signature_def serving_default

Вы используете консервированный оценщик, поэтому вы должны увидеть что-то вроде этого:

The given SavedModel SignatureDef contains the following input(s):
  inputs['examples'] tensor_info:
      dtype: DT_STRING
      shape: (-1)
      name: input_example_tensor:0
The given SavedModel SignatureDef contains the following output(s):
  outputs['output'] tensor_info:
      dtype: DT_FLOAT
      shape: (-1, 1)
      name: groupwise_dnn_v2/accumulate_scores/truediv:0

где вход представляет собой пример ProtoBuf, а выход - пакет скаляров регрессии.

Теперь вы можете попробовать запросить модель, используя CLI:

saved_model_cli run \
    --dir . \
    --tag_set serve \
    --signature_def predict \
    --input_examples 'examples=[{"col3":[1.0]},{"col3":[2.0]},{"col3":[3.0]}]'

Если вы можете запросить вашу модель из CLI, это может помочь устранить некоторые переменные в вашей проблеме.

0 голосов
/ 18 сентября 2018

serve_input_fn определяет имя тензора, ожидаемого на входе, а также форму. Так что в вашем случае запрос должен быть в форме слова {'col3': []}.

В настоящее время также существует проблема с поведением десериализации для dicts при использовании json, описанная в этом выпуске: https://github.com/aws/sagemaker-tensorflow-container/issues/71

Этот запрос на удаление должен исправить эту проблему, как только она выйдет: https://github.com/aws/sagemaker-tensorflow-container/pull/76

...