Как вы вызываете конечную точку sagemaker xgboost из приложения Chalice?

Я создал веб-приложение Chalice, которое размещается в ведре s3 и вызывает конечную точку xgboost. Я все время получаю сообщение об ошибке, когда вызываю модель через веб-приложение. Когда я заглянул в файлы журнала Lambda, я обнаружил, что мой ввод некорректно декодируется. input_text = app.current_request.raw_body.decode() Каким будет правильный код для декодирования ввода из двоичного кода, чтобы я мог передать обычную строку в мою конечную точку?

Вот ошибка:

botocore.errorfactory.ModelError: Произошла ошибка (ModelError) при вызове операции InvokeEndpoint: получена ошибка клиента (415) из модели с сообщением «не удалось преобразовать строку в число с плавающей запятой: user_input = 1%».

Вот мой файл index.html:

<html>
<head></head>
<body>
<form method="post" action="<chalice_deployed_http>">

<input type="text" name="user_input"><br>

<input type="submit" value="Submit">
</form>
</body>
</html>

Вот мой файл app.py:

try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO

from io import BytesIO
import csv
import sys, os, base64, datetime, hashlib, hmac
from chalice import Chalice, NotFoundError, BadRequestError
import boto3


app = Chalice(app_name='<name_of_chalice_app>')
app.debug = True

sagemaker = boto3.client('sagemaker-runtime')

@app.route('/', methods=['POST'], content_types=['application/x-www-form-urlencoded'])
def handle_data():
    input_text = app.current_request.raw_body.decode()

    res = sagemaker.invoke_endpoint(
                    EndpointName='<endpoint_name>',
                    Body=input_text,
                    ContentType='text/csv',
                    Accept='Accept'
                )
    return res['Body'].read().decode()[0]

Я должен иметь возможность передать такую ​​строку:

'1,4,26,0.076923077,2,3,1,0.611940299,0.7818181820000001,0.40376569,0.571611506,0.12,12,1,0.0,2,1.0,1,2,6,3,1,1,1,1,1,3,1,0.000666667,1,1,2,2,-1.0,0.490196078,-1.0,0.633928571,6.0,145,2,2,1,3,2,2,1,3,2,3,3,-1.0,1,3,1,1,2,1,2,3,1,3,3,1,3,2,3,-1.0,3,3,1,2,2,1,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0.3497921158934803,0'

и получите такой вывод:

'5'

Когда я запускаю его в блокноте jupyter, он работает.


person schmidtbit    schedule 11.01.2019    source источник


Ответы (2)


Это сработало:

    input_text = app.current_request.raw_body
    d = parse_qs(input_text)
    lst = d[b'user_input'][0].decode()
    res = sagemaker.invoke_endpoint(
                    EndpointName='<name-of-SageMaker-Endpoint>',
                    Body=lst,
                    ContentType='text/csv',
                    Accept='Accept'
                )
person schmidtbit    schedule 16.01.2019

В этом сообщении блога показано, как вызвать конечную точку SageMaker из приложения Chalice. Он использует встроенный алгоритм классификации изображений, но у вас не должно возникнуть проблем с адаптацией его к XGBoost.

https://medium.com/@julsimon/using-chalice-to-serve-sagemaker-predictions-a2015c02b033

person Julien Simon    schedule 18.01.2019
comment
ответы только по ссылкам можно улучшить, разместив соответствующий контент здесь, в StackOverflow. Это гарантирует, что ответ останется действительным, если ссылка будет недоступна или сообщение в блоге исчезнет. Более того, это позволяет сообществу вносить в него свой вклад. - person Ciprian Tomoiagă; 04.07.2019