Amazon Sagemaker — невозможно оценить предоставленную полезную нагрузку

#python #aws-lambda #amazon-sagemaker

#python #aws-lambda #amazon-sagemaker

Вопрос:

Я создал конечную точку Sagemaker, которую пытаюсь вызвать с помощью шлюза Lambda API. Я получаю следующую ошибку:

 "An error occurred (ModelError) when calling the InvokeEndpoint operation: Received client error (400) from model with message "unable to evaluate payload provided"
 

Я знаю, почему на что он жалуется, но я не совсем понимаю, почему это происходит. Я подтвердил, что форма входных данных моей лямбда-функции совпадает с тем, как я обучал модель. Ниже приведена моя входная полезная нагрузка в lambda:

 X = pd.concat([X, rx_norm_dummies, urban_dummies], axis = 1)
payload = X.to_numpy()

response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,
                               ContentType='application/json',
                               Body=payload)
 

В записной книжке jupyter, где я создал свою конечную точку / обучил свою модель, я также могу получить доступ к модели с помощью numpy ndarray, поэтому я не понимаю, почему я получаю эту ошибку.

 y = X[0:10]
result = linear_predictor.predict(y)
print(result)
 

Вот модификация, которую я вношу в сериализацию конечной точки:

 from sagemaker.predictor import csv_serializer, json_deserializer

    linear_predictor.content_type = 'text/csv'
    linear_predictor.serializer = csv_serializer
    linear_predictor.deserializer = json_deserializer
 

Я новичок, когда дело доходит до Sagemaker / Lambda, поэтому буду признателен за любую помощь, и я могу отправить больше кода для добавления контекста, если это необходимо. Пробовал различные форматы и не могу заставить это работать.

Ответ №1:

Не уверен, какой алгоритм вы пытаетесь использовать в Sage, но у них есть цитата ниже в их документации. Если в вашем CSV есть заголовок или если вы не указали label_size, вы можете получить неверный запрос (код состояния http 400), поскольку модель не соответствует тому, что ожидает получить AWS.

Amazon SageMaker требует, чтобы в файле CSV не было записи заголовка и чтобы целевая переменная находилась в первом столбце. Для запуска неконтролируемых алгоритмов обучения, у которых нет цели, укажите количество столбцов меток в типе содержимого. Например, в этом случае ‘content_type=text / csv;label_size = 0’.

Из: https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-training.html#cdf-csv-format

Комментарии:

1. Я использую LinearLearner. Таким образом, текст / csv, который я отправляю в качестве входных данных в конечную точку в Lambda, в основном представляет собой строку, разделенную запятыми. Я бы ожидал, что это сработает, и не уверен, почему я получаю ошибку 400. Обратите внимание, что здесь нет меток, поскольку я делаю вывод, а не обучение.

Ответ №2:

В вашем коде вы указываете SDK, что вы передаете JSON, но payload в вашем коде на самом деле это массив NumPy.

Я бы предложил заменить payload = X.to_numpy() на payload = X.to_json(orient='records') или что-то подобное, чтобы сначала преобразовать его в JSON.

Комментарии:

1. Есть ли способ существенно проверить, что ищет конечная точка? В моем ноутбуке он был обучен на Ndarray.

2. Как в cloudwatch или что-то в этом роде @Noel Llevares