#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