我在S3中有一些数据,我想创建一个lambda函数来预测我部署的aws sagemaker端点的输出,然后我再次将输出放在S3中。在这种情况下,是否有必要创建一个如本链接中所述的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')
我的数据是一个csv文件,包含2列浮动,没有标题,问题是行返回一个字符串列表(每行都是该列表的一个元素:[11.55,65.23','55.68,69.56'…])调用运行良好,但响应也是一个字符串:output='65.23\n,65.23\n、22.56\n,…'
那么如何将此输出保存为S3的csv文件
感谢
如果您的Lambda函数被调度,那么您将不需要API网关。但是,如果预测操作将由用户触发,例如由应用程序触发,您将需要。
当您调用调用端点时,实际上您调用的是SageMaker端点,这与API网关端点不同。
SageMaker的一个常见架构是:
- 带有的API网关接收到请求,然后调用授权者,然后调用您的Lambda
- Lambda在您的输入数据中进行一些解析,然后调用SageMaker预测端点,然后处理结果并返回到您的应用程序
根据你描述的情况,我不能说你的任务是学术性的还是生产性的。
那么,如何从Lambda将数据保存为CSV文件呢?
我相信您可以解析输出,然后将文件上传到S3。在这里,您将手动或使用lib进行解析,使用boto3可以上传文件。您的模型的输出取决于您在SageMaker映像上的实现。因此,如果您需要其他格式的响应数据,可能需要使用自定义图像。我通常使用自定义图像,我可以定义如何处理请求/响应数据。
就生产任务而言,我当然建议您检查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
我希望它能有所帮助,如果需要更多信息,请告诉我。
谨致问候。