如何在 C# 中调用 Sagemaker 训练模型端点 API

How to call Sagemaker training model endpoint API in C#

我已经通过 sagemaker 实现了机器学习算法。

我已经为 .net 安装了 SDK,并通过执行以下代码进行了尝试。

Uri sagemakerEndPointURI = new Uri("https://runtime.sagemaker.us-east-2.amazonaws.com/endpoints/MyEndpointName/invocations");
Amazon.SageMakerRuntime.Model.InvokeEndpointRequest request = new Amazon.SageMakerRuntime.Model.InvokeEndpointRequest();
request.EndpointName = "MyEndpointName";
AmazonSageMakerRuntimeClient aawsClient = new AmazonSageMakerRuntimeClient(myAwsAccessKey,myAwsSecreteKey);            
Amazon.SageMakerRuntime.Model.InvokeEndpointResponse resposnse= aawsClient.InvokeEndpoint(request);

通过执行此操作,我收到验证错误“1 validation error detected: Value at 'body' failed to satisfy constraint: Member must not be null

任何人都可以指导我如何以及需要传递哪些输入数据来调用给定的 API?

编辑

此外,我还尝试提供包含由“.gz”或“.pkl”文件编写的 MemoryStream 的主体参数,它给我的错误是:"Error unmarshalling response back from AWS, HTTP content length exceeded 5246976 bytes."

编辑 2018 年 1 月 23 日

此外,我想出了

的错误消息

ERROR - model server - 'TypeError' object has no attribute 'message'

谢谢

据我所知,按照 Guy 的建议,您的请求缺少正文 属性 和 ContentType,后者必须引用您传递给 Amazon SageMaker 的输入数据的类型(请参阅下面的代码;我的输入 CSV 文件包含一个示例)。

byte[] content = File.ReadAllBytes("input.csv");
Amazon.SageMakerRuntime.Model.InvokeEndpointRequest request = new Amazon.SageMakerRuntime.Model.InvokeEndpointRequest();
request.EndpointName = "linear-learner-xxxxxxxx-xxxx";
request.ContentType = "text/csv";
request.Body = new MemoryStream(content);

AmazonSageMakerRuntimeClient awsClient = new AmazonSageMakerRuntimeClient(accessKey, secretKey);
Amazon.SageMakerRuntime.Model.InvokeEndpointResponse response = awsClient.InvokeEndpoint(request);

string predictions = Encoding.UTF8.GetString(response.Body.ToArray());

关于 5246976 字节的限制,即 API 在单个请求的上下文中达到最大允许的响应正文长度。 避免这种情况的一种方法是执行多次调用,而不是传递大批量的项目进行预测。

如果您使用的是Amazon SageMaker内置算法,您可以在以下地址查看输入和输出允许的数据格式:

https://docs.aws.amazon.com/sagemaker/latest/dg/common-info-all-im-models.html

后来通过Encoding.ASCII.GetBytes解决了它,如下面的代码。

 byte[] bytes = System.IO.File.ReadAllBytes(@"EXCEL_FILE_PATH");
    string listA = "";
    while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
            listA = listA + line + "\n";
        }
    byte[] bytes = Encoding.ASCII.GetBytes(listA);
    request.Body = new MemoryStream(bytes);
    InvokeEndpointResponse response = sagemakerRunTimeClient.InvokeEndpoint(request);
    string predictions = Encoding.UTF8.GetString(response.Body.ToArray());