AWS sagemaker invokeEndpoint внутренняя ошибка модели

Я пытаюсь отправить запрос на модель в sagemaker с помощью .NET. Я использую следующий код:

var data = File.ReadAllBytes(@"C:\path\file.csv");
var credentials = new Amazon.Runtime.BasicAWSCredentials("","");
var awsClient = new AmazonSageMakerRuntimeClient(credentials, RegionEndpoint.EUCentral1);
var request = new Amazon.SageMakerRuntime.Model.InvokeEndpointRequest
{
    EndpointName = "EndpointName",
    ContentType = "text/csv",
    Body = new MemoryStream(data),
};

var response = awsClient.InvokeEndpoint(request);
var predictions = Encoding.UTF8.GetString(response.Body.ToArray());

ошибка, которую я получаю awsClient.InvokeEndpoint(request)

is:

Amazon.SageMakerRuntime.Model.ModelErrorException: 'Служба вернула ошибку с кодом ошибки ModelError и телом HTTP: {"ErrorCode": "INTERNAL_FAILURE_FROM_MODEL", "LogStreamArn": "arn: aws: logs: eu-central-1: xxxxxxxx: log-group: / aws / sagemaker / Endpoints / myEndpoint "," Сообщение ":" Получена ошибка сервера (500) от модели с сообщением \ "\". Для получения дополнительной информации см. "https: // url_to_logs_on_amazon" в учетной записи xxxxxxxxxxx. " , "OriginalMessage": "", "OriginalStatusCode": 500} '

URL-адрес, который предлагается в сообщении об ошибке для получения дополнительной информации, вообще не помогает.

Я считаю, что это проблема формата данных, но я не смог найти решения.

Кто-нибудь сталкивался с таким поведением раньше?


person Nick    schedule 22.08.2018    source источник


Ответы (2)


Как и предполагалось, проблема заключалась в формате данных. В моем случае все, что мне нужно было сделать, это отправить данные в виде сериализованного строкового массива json и использовать ContentType = application/json, потому что функция python, работающая на конечной точке, которая отвечает за отправку данных в предсказатель, принимала только строки json.

Другой способ решить эту проблему - изменить функцию python, которая отвечает за обработку ввода, чтобы она принимала все типы контента и изменяла данные таким образом, чтобы их понимал предсказатель.

пример рабочего кода для моего случая:

        var data = new string[] { "this movie was extremely good .", "the plot was very boring ." };
        var serializedData = JsonConvert.SerializeObject(data);

        var credentials = new Amazon.Runtime.BasicAWSCredentials("","");
        var awsClient = new AmazonSageMakerRuntimeClient(credentials, RegionEndpoint.EUCentral1);
        var request = new Amazon.SageMakerRuntime.Model.InvokeEndpointRequest
        {
            EndpointName = "endpoint",
            ContentType = "application/json",
            Body = new MemoryStream(Encoding.ASCII.GetBytes(serializedData)),
        };

        var response = awsClient.InvokeEndpoint(request);
        var predictions = Encoding.UTF8.GetString(response.Body.ToArray());
person Nick    schedule 24.08.2018

Ты прав! Тип контента в InvokeEndpointRequest должен соответствовать одному из типов контента, который поддерживает образ вывода. Вот наша страница документации по этой теме: https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-inference.html

Надеюсь это поможет!

-Хан

person Han Wang    schedule 24.08.2018