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

时间:2018-01-21 10:37:31

标签: c# amazon-web-services amazon-s3 sparkr amazon-sagemaker

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

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

$convert_this

通过执行此操作,我收到验证错误为“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);

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

修改

此外,我尝试通过provinding body参数,其中包含由'.gz'或'.pkl'文件编写的MemoryStream,并且它给出了错误:“错误解组来自AWS的响应,HTTP内容长度超过5246976字节“。

编辑1/23/2018

此外,我提出了错误消息

  

错误 - 模型服务器 - 'TypeError'对象没有属性'message'

由于

2 个答案:

答案 0 :(得分:0)

据我所知,您的请求缺少Body属性,如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

答案 1 :(得分:0)

后来通过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());