调用 aws sagemaker 端点

Invoke aws sagemaker endpoint

我在 S3 中有一些数据,我想创建一个 lambda 函数来预测我部署的 aws sagemaker 端点的输出,然后我再次将输出放入 S3。在这种情况下是否有必要像 link 中描述的那样创建一个 api 网关?在 lambda 函数中我必须输入什么。我希望把(在哪里找到数据,如何调用端点,把数据放在哪里)

import boto3
import io
import json
import csv
import os


client = boto3.client('s3') #low-level functional API

resource = boto3.resource('s3') #high-level object-oriented API
my_bucket = resource.Bucket('demo-scikit-byo-iris') #subsitute this for your s3 bucket name. 

obj = client.get_object(Bucket='demo-scikit-byo-iris', Key='foo.csv')
lines= obj['Body'].read().decode('utf-8').splitlines()
reader = csv.reader(lines)

import io
file = io.StringIO(lines)

# grab environment variables
runtime= boto3.client('runtime.sagemaker')

response = runtime.invoke_endpoint(
    EndpointName= 'nilm2',
    Body = file.getvalue(),
    ContentType='*/*',
    Accept = 'Accept')

output = response['Body'].read().decode('utf-8')

我的数据是一个没有 headers 的 2 列浮点数的 csv 文件,问题是第 return 行是一个字符串列表(每一行都是这个列表的一个元素:[' 11.55,65.23', '55.68,69.56'...]) 调用工作正常但响应也是一个字符串:output = '65.23\n,65.23\n,22.56\n,...'

那么如何将此输出作为 csv 文件保存到 S3

谢谢

如果您的 Lambda 函数已安排,那么您将不需要 API 网关。但是,如果预测操作将由用户触发,例如由应用程序触发,您将需要。

当您调用调用端点时,实际上您是在调用 SageMaker 端点,它与 API 网关端点不同。

SageMaker 的常见架构是:

  1. API 网关接收请求然后调用授权器,然后 调用你的 Lambda;
  2. Lambda 会对您的输入数据进行一些解析,然后调用您的 SageMaker 预测端点,然后处理结果并 returns 到您的应用程序。

根据你描述的情况,我不能说你的任务是学术性的还是生产性的。

那么,如何将 Lambda 中的数据保存为 CSV 文件?

我相信您可以只解析输出,然后将文件上传到 S3。在这里您将手动或使用 lib 进行解析,使用 boto3 可以上传文件。您的模型的输出取决于您在 SageMaker 图像上的实施。所以,如果您需要其他格式的响应数据,也许您需要使用 custom image。我通常使用自定义图像,我可以定义如何处理 requests/responses.

上的数据

就生产任务而言,我当然建议您查看 SageMaker 的批量转换作业。您可以提供输入文件(S3 路径)和目标文件(另一个 S3 路径)。 SageMaker 将 运行 批量预测并将保存一个包含结果的文件。此外,您不需要将模型部署到端点,当此作业 运行 将创建端点实例、下载数据进行预测、进行预测、上传输出并关闭实例。你只需要一个训练有素的模型。

这里有一些关于批量转换作业的信息:

https://docs.aws.amazon.com/sagemaker/latest/dg/how-it-works-batch.html

https://docs.aws.amazon.com/sagemaker/latest/dg/ex1-batch-transform.html

希望对您有所帮助,如果需要更多信息,请告诉我。

此致。