首页 > 解决方案 > 如何使用 Lambda 和 API 网关部署 AWS Sagemaker 创建的乳腺癌预测端点?

问题描述

我正在尝试使用 AWS Lambda 和 API 网关在 Amazon Sagemanker 上部署现有的乳腺癌预测模型。我已按照以下网址的官方文档进行操作。

https://aws.amazon.com/blogs/machine-learning/call-an-amazon-sagemaker-model-endpoint-using-amazon-api-gateway-and-aws-lambda/

我在“predicted_label”处收到类型错误。

 result = json.loads(response['Body'].read().decode())
 print(result)
 pred = int(result['predictions'][0]['predicted_label'])
 predicted_label = 'M' if pred == 1 else 'B'

 return predicted_label

请让我知道是否有人可以解决此问题。谢谢你。

标签: amazon-web-servicesaws-lambdaaws-api-gatewayamazon-sagemaker

解决方案


通过打印结果类型,print(type(result))您可以看到它的字典。现在您可以看到键名是“score”而不是您提供给 pred 的“predicted_label”。因此将其替换为

pred = int(result['predictions'][0]['score'])

我认为这可以解决您的问题。

这是我的 lambda 函数:

import os
import io
import boto3
import json
import csv

# grab environment variables
ENDPOINT_NAME = os.environ['ENDPOINT_NAME']
runtime= boto3.client('runtime.sagemaker')

def lambda_handler(event, context):
   print("Received event: " + json.dumps(event, indent=2))

   data = json.loads(json.dumps(event))
   payload = data['data']
   print(payload)

   response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,
                                      ContentType='text/csv',
                                      Body=payload)
   #print(response)
   print(type(response))
   for key,value in response.items():
       print(key,value)
   result = json.loads(response['Body'].read().decode())
   print(type(result))
   print(result['predictions'])
   pred = int(result['predictions'][0]['score'])
   print(pred)
   predicted_label = 'M' if pred == 1 else 'B'

   return predicted_label

推荐阅读