如何使用 sagemaker 对 Pandas 数据框进行预测

ddd*_*ddd 5 lambda inference pandas amazon-sagemaker

我正在使用 Sagemaker 来训练和部署我的机器学习模型。至于预测,它将由 lambda 函数作为预定作业(每小时)执行。过程如下:

  1. 自上次预测以来从 S3 中提取新数据
  2. 预处理、聚合和创建预测数据集
  3. 调用 sagemaker 端点并进行预测
  4. 将结果保存到 s3 或插入到数据库表

根据我的发现,通常输入将来自 lambda 有效载荷

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

response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,
                                   ContentType='text/csv',
                                   Body=payload)
Run Code Online (Sandbox Code Playgroud)

或从 s3 文件中读取: my_bucket = resource.Bucket('pred_data') #将其替换为您的 s3 存储桶名称。

obj = client.get_object(Bucket=my_bucket, Key='foo.csv')
lines= obj['Body'].read().decode('utf-8').splitlines()
reader = csv.reader(lines)
file = io.StringIO(lines)


response = runtime.invoke_endpoint(EndpointName=ENDPOINT,
                                   ContentType='*/*',
                                   Body = file.getvalue(),
                                   Body=payload)
output = response['Body'].read().decode('utf-8')
Run Code Online (Sandbox Code Playgroud)

由于我将从 s3 中提取原始数据并进行预处理,pandas因此将生成一个数据帧。是否可以直接将其作为 的输入invoke_endpoint?我可以上传的数据集中汇总到另一个S3存储,但它必须要经过decodingcsv.readerStringIO和一切就像我发现还是有一个简单的方法来做到这一点的例子吗?这decode一步真的需要得到输出吗?

Jos*_*vis 0

您可以在调用时InvokeEndpoint以任何格式发送任何您想要的有效负载。您可以控制任何一方的合约(假设您的模型支持它)。如果您使用的模型不是您创建的,请查看它是否支持预处理/后处理,这将允许您自己定义合同。

除此之外,我们经常看到客户做的一件事是在模型内进行处理,而不是在调用 SageMaker 的InvokeEndpoint. 一个常见的用例是在调用时接受需要进行预测的对象的 S3 路径InvokeEndpoint。然后模型将负责下载 S3 项目并对其进行转换,然后对该数据运行推理。

根据InvokeEndpoint响应,它可以执行相同的操作,模型可以将其上传到 S3,然后将 S3 密钥作为响应发回。这可能不是您想要做的,但这只是您使用 SageMaker 时所拥有的灵活性的另一个示例。