如何在 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());
我已经通过 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());