Вызов конечной точки в AWS SageMaker для модели обучения Scikit - PullRequest
0 голосов
/ 25 января 2019

После развертывания модели scikit в AWS Sagemaker я вызываю свою модель, используя ниже:

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)

Приведенный выше код работает отлично, но когда я пытаюсь:

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

Я получаю ошибку:

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> 

В Оценках и моделях SageMaker было упомянуто, что

Сервер модели SageMaker Scikit-learn обеспечивает реализацию по умолчанию из input_fn. Эта функция десериализует данные в кодировке JSON, CSV или NPY в массив NumPy.

Я хотел бы знать, как я могу изменить значение по умолчанию для принятия двумерного массива, чтобы его можно было использовать для прогнозирования в реальном времени.

Есть предложения? Я пытался использовать Inference Pipeline с Scikit-learn и Linear Learner в качестве эталона, но не смог заменить Linear Learner моделью Scikit. Я получил ту же ошибку.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы должны иметь возможность установить сериализатор / десериализатор для предиктора, возвращаемого вашим model.deploy ().Вот пример этого в записной книжке с примером FM:

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

Пожалуйста, попробуйте это и дайте мне знать, если это работает для вас!

0 голосов
/ 27 января 2019

Если кто-нибудь нашел способ изменить значения по умолчанию input_fn, Предикат_fn и output_fn, чтобы принимать массив или строку numpy, пожалуйста, поделитесь.

Но я нашел способ сделать это по умолчанию.

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)

Тогда:

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)

Но, пожалуйста, если есть лучшее решение, оно будет очень полезно.

...