我在AWS Sagemaker上训练了一个xgboost模型并创建了一个端点。现在我想使用AWS Lambda和AWS API来调用这个端点。我创建了一个Lambda函数,并添加了下面的代码来处理我的xgboost模型。当我尝试测试时,函数抛出了一个参数验证错误。这是我的代码:
import json
import os
import csv
import io
import boto3
endpointname = os.environ['endpointname'] # 在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对测试用例返回的是字节类型
我创建的测试事件是字典类型。函数抛出了 Invalid type for parameter Body, value: {'Time':'7'}, type: <class 'dict'>, valid types: <class 'bytes'>, <class 'bytearray'>, file-like object
的错误。这意味着我应该传递字节或字节数组而不是字典类型的事件。但当我阅读 AWS Lambda文档 时,它说我的事件类型只能是字典、整数、列表、浮点数、字符串或None类型。我按照 这个 AWS文档中的步骤创建了我的Lambda函数。有人能解释一下为什么我的代码会抛出上述错误吗?
回答:
data=json.loads(json.dumps(event))
是一个冗余操作。data=event
将返回 True
。我们为测试用例提供的事件类型是字典。它有一个键值对。键可以是任何东西,值应该是所有预测变量的单一字符串,用逗号分隔。为了预测输出,我们需要测试用例的值。所以声明,例如,payload=data['key']
,然后在response
中更改Body=payload
。这样它就会工作。