如何从圣杯应用程序调用sagemaker xgboost端点



我构建了一个chalice web应用程序,该应用程序托管在s3 bucket中,并调用xgboost端点。当我通过web应用程序调用模型时,我不断地遇到错误。当我查看Lambda日志文件时,我发现我的输入没有正确解码。input_text = app.current_request.raw_body.decode()什么是正确的代码来解码二进制输入,这样我就可以将常规字符串传递到我的端点?

错误如下:

botocore.erroractory.ModelError:调用InvokeEndpoint操作时发生错误(ModelError):从模型收到客户端错误(415),消息为"无法将字符串转换为float: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,076923077,2,3,1,0.611940299,0.7818181820000001,040376569,0.571611506,0.12,12,1.0,2,1.0,1,2,6,1,1,1,10,1,1,0.000666667,1,1,2,2,1,0.490196078,1.033928571,6.0145,2,2,1,3,2,2,2,3,3,3,1,3,1,3,2,3,-1.0,1,3,1,1,1,3,2,1,3,1,0,0,0,0.0,0,0,00,0,0,0,00,,0,0,0:0,0,0,00,1,0,0,00 0,0,0,0,0,00,0,0,00,00,0,0,0.0,0,0,0.0,3,0.3497921158934803,0'

并得到这样的输出:

'5'

当我在jupyter笔记本上运行它时,它就工作了。

这很有效:

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

这篇博客文章向您展示了如何从Chalice应用程序调用SageMaker端点。它使用内置的图像分类算法,但您应该不会在将其适应XGBoost方面遇到任何困难。

https://medium.com/@julsimon/using-呼叫-服务-管理员-预测-2015c02b033

最新更新