我正在尝试从示例笔记本中提供的tensorflow_iris_dnn_classifier_using_estimators
调用端点。在该示例中,它使用在部署过程中生成的相同python对象来调用端点。在大型系统中,我需要知道如何在没有此对象且可能使用不同语言的情况下调用此端点。这就是我尝试过的:
import struct
import boto3
client = boto3.client('sagemaker-runtime')
query = [6.4, 3.2, 4.5, 1.5]
buf = struct.pack('%sf' % len(query), *query)
response = client.invoke_endpoint(
EndpointName='sagemaker-tensorflow-py2-cpu-2018-01-16-18-22-54-458',
Body=buf
)
我做错了什么?我从cloudwatch收到以下错误:
[2018-01-16 19:51:21,091] ERROR in serving: 'utf8' codec can't decode byte 0xcd in position 0: invalid continuation byte
2018-01-16 19:51:21,091 ERROR - model server - 'utf8' codec can't decode byte 0xcd in position 0: invalid continuation byte
10.32.0.2 - - [16/Jan/2018:19:51:21 +0000] "POST /invocations HTTP/1.1" 500 0 "-" "AHC/2.0"
答案 0 :(得分:0)
您应该能够使用AWS SDK for SageMaker支持的任何语言中的InvokeEndpoint调用推理。
Python SDK就是上面示例中的内容,但类似的语法可以在java,JavaScript,.NET等中完成。
python API引用(http://boto3.readthedocs.io/en/latest/reference/services/sagemaker-runtime.html)中的调用是
response = client.invoke_endpoint(
EndpointName='string',
Body=b'bytes'|file,
ContentType='string',
Accept='string'
)
Body应该被编码为模型知道如何阅读。我不确定你为什么决定编码你的方式,但你可以尝试更简单的选项并使用b'前缀。错误消息只是说该模型无法解码您的Body输入。
答案 1 :(得分:0)
这是一个有效的示例:
import boto3
client = boto3.client('runtime.sagemaker')
with open('iris.csv', 'rb') as f:
payload = f.read()
result = client.invoke_endpoint(
EndpointName='test-endpoint-iris',
Body=payload,
ContentType='text/csv',
Accept='Accept'
)
print(result['Body'].read().decode())
还请确保您的iris.csv
不包含标签/标题,或将其从代码中删除。
用于预测的示例数据文件:
5.1,3.5,1.4,0.2
4.9,3,1.4,0.2
4.7,3.2,1.3,0.2
4.6,3.1,1.5,0.2
5,3.6,1.4,0.2