Я пытаюсь обучить модель с помощью 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