做出预测 Sagemaker Pytorch

Making a Prediction Sagemaker Pytorch

我已经使用 Sagemaker 在 Pytorch 中训练和部署了一个模型。我能够调用端点并获得预测。我正在使用默认的 input_fn() 函数(即未在我的 serve.py 中定义)。

model = PyTorchModel(model_data=trained_model_location,
                     role=role,
                     framework_version='1.0.0',
                     entry_point='serve.py',
                     source_dir='source')
predictor = model.deploy(initial_instance_count=1, instance_type='ml.m4.xlarge')

可以做出如下预测:

input ="0.12787057,  1.0612601,  -1.1081504"
predictor.predict(np.genfromtxt(StringIO(input), delimiter=",").reshape(1,3) )

我希望能够使用 REST API 和 HTTP POST 使用 lambda 和 API 网关为模型提供服务。通过这种方式,我能够在 Sagemaker 中使用 XGBOOST 模型使用 invoke_endpoint()。我不确定要为 Pytorch 发送什么内容。

client = boto3.client('sagemaker-runtime')
response = client.invoke_endpoint(EndpointName=ENDPOINT  ,
ContentType='text/csv',
Body=???)

我相信我需要了解如何编写客户 input_fn 来接受和处理我能够通过 invoke_client 发送的数据类型。我在正确的轨道上吗?如果是这样,如何编写 input_fn 来接受来自 invoke_endpoint 的 csv?

是的,您走在正确的轨道上。您可以将 csv-serialized 输入发送到端点,而无需使用 SageMaker SDK 中的 predictor,而是使用其他 SDK,例如安装在 lambda 中的 boto3

import boto3
runtime = boto3.client('sagemaker-runtime')

payload = '0.12787057,  1.0612601,  -1.1081504'

response = runtime.invoke_endpoint(
    EndpointName=ENDPOINT_NAME,
    ContentType='text/csv',
    Body=payload.encode('utf-8'))

result = json.loads(response['Body'].read().decode()) 

这将传递给端点一个 csv-formatted 输入,您可能需要在 input_fn 中重新整形以放入模型期望的适当尺寸。

例如:

def input_fn(request_body, request_content_type):
    if request_content_type == 'text/csv':
        return torch.from_numpy(
            np.genfromtxt(StringIO(request_body), delimiter=',').reshape(1,3))

注意:我无法使用您的输入内容和形状测试上面的特定 input_fn,但我在 Sklearn RandomForest 上使用了几次这种方法,并且查看 Pytorch SageMaker serving doc 上面的基本原理应该有效。

不要犹豫,使用 Cloudwatch 中的端点日志来诊断任何推理错误(可从控制台中的端点 UI 获得),这些日志通常 更详细 推理 SDK 返回的 high-level 日志