无法使用AWS-Lambda调用在sagemaker中创建的XG-Boost终端节点

时间:2019-11-15 14:58:08

标签: python amazon-web-services machine-learning aws-lambda amazon-sagemaker

我在AWS-Sagemaker上训练了xgboost模型并创建了一个终端节点。现在,我想使用AWS Lambda和AWS API调用终端节点。我创建了一个lambda函数,并为我的xgboost模型添加了以下代码。当我尝试对其进行测试时,该函数将引发ParamValidation错误。这是我的代码

import json
import os
import csv
import io
import boto3
endpointname =os.environ['endpointname'] #name of the endpoint I created in sagemaker
runtime = boto3.client('runtime.sagemaker')
def lambda_handler(event, context):
    print("Recieved Event: "+json.dumps(event,indent=2))
    data=json.loads(json.dumps(event))
    print(data)
    response = runtime.invoke_endpoint(EndpointName=endpointname,ContentType='text/csv',Body=data)
    print(response)
    result = json.loads(response['Body'].read().decode())
    print(int(float(result))) #sagemaker xgb returns bytes type for the test case

我创建的测试事件是字典类型。该函数抛出Invalid type for parameter Body, value: {'Time':'7'}, type: <class 'dict'>, valid types: <class 'bytes'>, <class 'bytearray'>, file-like object 这意味着我应该将byte或bytearray而不是dict类型传递给我的事件。但是,当我阅读此AWS Lambda doc时,它说我的事件类型只能是dict,int,list,float,str或None类型。我按照this aws doc中提到的步骤创建了lambda函数。有人可以解释为什么我的代码抛出上述错误吗?

1 个答案:

答案 0 :(得分:1)

data=json.loads(json.dumps(event))是多余的操作。 data=event将返回True。我们为测试用例提供的事件是dict类型。它具有一个键值对。 key可以是任何值,并且值应该是由逗号分隔的所有预测变量的单个字符串。为了预测输出,我们需要测试用例的价值。因此,例如声明payload=data['key'],然后在Body=payload内更改response。然后它将起作用。