【问题标题】:How do you invoke a sagemaker xgboost endpoint from a chalice app?如何从 chalice 应用程序调用 sagemaker xgboost 端点?
【发布时间】:2019-01-18 11:51:09
【问题描述】:

我构建了一个托管在 s3 存储桶中并调用 xgboost 端点的 chalice Web 应用程序。通过网络应用程序调用模型时,我不断收到错误消息。当我查看 Lambda 日志文件时,我发现我的输入没有正确解码。 input_text = app.current_request.raw_body.decode()从二进制解码输入的正确代码是什么,以便我可以将常规字符串传递给我的端点?

这是错误:

botocore.errorfactory.ModelError:调用 InvokeEndpoint 操作时发生错误 (ModelError):收到来自模型的客户端错误 (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'

When I run it in a jupyter notebook it works.

【问题讨论】:

    标签: python web-applications chalice amazon-sagemaker


    【解决方案1】:

    这行得通:

        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'
                    )
    

    【讨论】:

      【解决方案2】:

      这篇博文向您展示了如何从 Chalice 应用程序调用 SageMaker 端点。它使用内置的图像分类算法,但您应该可以轻松地将其适应 XGBoost。

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

      【讨论】:

      • 可以通过在 StackOverflow 上发布相关内容来改进仅链接的答案。这样可以确保在链接断开或博客文章消失的情况下答案仍然有效。此外,它允许社区为它做出贡献
      猜你喜欢
      • 1970-01-01
      • 2019-07-04
      • 2012-06-06
      • 2018-11-07
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      相关资源
      最近更新 更多