制作预测智者火炬

时间:2019-06-05 20:19:23

标签: python pytorch amazon-sagemaker

我已经与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为模型提供服务,并使用lambda和API网关进行HTTP POST。这样,我就可以通过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?

1 个答案:

答案 0 :(得分:1)

是的,您在正确的轨道上。您可以将csv序列化的输入发送到端点,而无需使用SageMaker SDK中的predictor,也可以使用lambda中安装的其他SDK,例如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格式的输入传递给端点,您可能需要在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上几次使用了该方法,并查看了{{ 3}}以上原理应该起作用。

不要在Cloudwatch中使用终结点日志来诊断任何推断错误(可从控制台的终结点UI获得),这些日志通常更加冗长,而高级日志返回了通过推理SDK