简体   繁体   English

在 AWS SageMaker 中为 Scikit Learn 模型调用终端节点

[英]Invoking Endpoint in AWS SageMaker for Scikit Learn Model

After deploying a scikit model on AWS Sagemaker, I invoke my model using below:在 AWS Sagemaker 上部署 scikit 模型后,我使用以下方法调用我的模型:

import pandas as pd
payload = pd.read_csv('test3.csv')
payload_file = io.StringIO()
payload.to_csv(payload_file, header = None, index = None)

import boto3
client = boto3.client('sagemaker-runtime')
response = client.invoke_endpoint(
    EndpointName= endpoint_name,
    Body= payload_file.getvalue(),
    ContentType = 'text/csv')
import json
result = json.loads(response['Body'].read().decode())
print(result)

The above code works perfectly but when I try:上面的代码工作得很好,但是当我尝试时:

payload = np.array([[100,5,1,2,3,4]])

I get the error:我收到错误:

ModelError: An error occurred (ModelError) when calling the InvokeEndpoint operation: Received server error (500) from container-1 with message 
"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <title>500 Internal Server Error</title> <h1>
Internal Server Error</h1> <p>The server encountered an internal error and was unable to complete your request.  
Either the server is overloaded or there is an error in the application.</p> 

It was mentioned in Scikit-learn SageMaker Estimators and Models , that theScikit-learn SageMaker Estimators and Models中提到,

SageMaker Scikit-learn model server provides a default implementation of input_fn. SageMaker Scikit-learn 模型服务器提供 input_fn 的默认实现。 This function deserializes JSON, CSV, or NPY encoded data into a NumPy array.此函数将 JSON、CSV 或 NPY 编码的数据反序列化为 NumPy 数组。

I would like to know how I can modify the default to accept a 2D numpy array so it can be used for real-time prediction.我想知道如何修改默认值以接受 2D numpy 数组,以便它可以用于实时预测。

Any suggestion?有什么建议吗? I have tried using Inference Pipeline with Scikit-learn and Linear Learner as a reference but could not replace the Linear Learner with a Scikit model.我曾尝试将推理管道与 Scikit-learn 和 Linear Learner 结合使用作为参考,但无法用 Scikit 模型替换 Linear Learner。 I received the same error.我收到了同样的错误。

If anyone found a way to change the default input_fn, predict_fn, and output_fn to accept numpy array or string then please do share.如果有人找到了更改默认 input_fn、predict_fn 和 output_fn 以接受 numpy 数组或字符串的方法,请分享。

But I did find a way of doing this with the default.但是我确实找到了一种使用默认值执行此操作的方法。

import numpy as np
import pandas as pd

df = pd.DataFrame(np.array([[100.0,0.08276299999999992,77.24,0.0008276299999999992,43.56,
                             6.6000000000000005,69.60699488825647,66.0,583.0,66.0,6.503081996847735,44.765133295284,
                             0.4844340723821271,21.35599999999999],
                            [100.0,0.02812099999999873,66.24,0.0002855600000003733,43.56,6.6000000000000005,
                             1.6884635296354735,66.0,78.0,66.0,6.754543287329573,47.06480204081666,
                             0.42642318733140017,0.4703999999999951],
                            [100.0,4.374382,961.36,0.043743819999999996,25153.96,158.6,649.8146514292529,120.0,1586.0
                             ,1512.0,-0.25255116297020636,1.2255274408634853,-2.5421402801039323,614.5056]]),
                  columns=['a', 'b', 'c','d','e','f','g','h','i','j','k','l','m','n'])
import io
from io import StringIO
test_file = io.StringIO()
df.to_csv(test_file,header = None, index = None)

Then:然后:

import boto3
client = boto3.client('sagemaker-runtime')
response = client.invoke_endpoint(
    EndpointName= endpoint_name,
    Body= test_file.getvalue(),
    ContentType = 'text/csv')
import json
result = json.loads(response['Body'].read().decode())
print(result)

But please if there is a better solution then it would be really helpful.但是,如果有更好的解决方案,那将非常有帮助。

You should be able to set a serializer/deserializer for the predictor returned by your model.deploy().您应该能够为 model.deploy() 返回的预测器设置序列化器/反序列化器。 There is an example of doing so in the FM example notebook here:在此处的 FM 示例笔记本中有一个这样做的示例:

https://github.com/awslabs/amazon-sagemaker-examples/blob/master/introduction_to_amazon_algorithms/factorization_machines_mnist/factorization_machines_mnist.ipynb https://github.com/awslabs/amazon-sagemaker-examples/blob/master/introduction_to_amazon_algorithms/factorization_machines_mnist/factorization_machines_mnist.ipynb

Please try this and let me know if that works for you!请试试这个,让我知道它是否适合你!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在 AWS Sagemaker 中为 scikit 学习模型创建端点 - creating endpoint for scikit learn model in AWS Sagemaker 带有 Scikit Learn 的 AWS Sagemaker 多模型终端节点:使用训练脚本时出现 UnexpectedStatusException - AWS Sagemaker Multi-Model Endpoint with Scikit Learn: UnexpectedStatusException whilst using a training script 为 PyTorch Model 调用 SageMaker 端点 - Invoking SageMaker Endpoint for PyTorch Model 在 AWS Sagemaker 中训练 scikit 学习模型时无法创建 model.tar.gz 文件 - Couldn't create model.tar.gz file while training scikit learn model in AWS Sagemaker 在AWS Lambda中重用scikit learn model .pkl - Reuse a scikit learn model .pkl in AWS Lambda 调用AWS Sagemaker端点 - Invoke aws sagemaker endpoint 如何从 sagemaker &#39;model.tar.gz&#39; 文件中使用 scikit 学习模型? - How to use scikit learn model from inside sagemaker 'model.tar.gz' file? AWS SageMaker:使用托管在 S3 中的经过训练的 model 创建终端节点 - AWS SageMaker: Create an endpoint using a trained model hosted in S3 模型进度 Scikit Learn - Model Progress Scikit Learn 是否可以在不使用 SageMaker SDK 的情况下为我在 AWS SageMaker 中创建的模型设置终端节点 - Is it possible set up an endpoint for a model I created in AWS SageMaker without using the SageMaker SDK
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM