Amazon SageMaker:使用文件作为multipart / form-data调用终端节点

时间:2018-08-05 21:25:42

标签: amazon-web-services curl aws-cli amazon-sagemaker

在Amazon SageMaker上为我的模型设置终结点之后,我试图通过POST请求来调用它,该请求包含具有密钥image和内容类型为multipart/form-data的文件。

我的AWS CLI命令如下:

aws sagemaker-runtime invoke-endpoint --endpoint-name <endpoint-name> --body image=@/local/file/path/dummy.jpg --content-type multipart/form-data output.json --region us-east-1

应等效于:

curl -X POST -F "image=@/local/file/path/dummy.jpg" http://<endpoint>

运行aws命令后,文件不会通过请求传输,我的模型正在接收其中没有任何文件的请求。

有人可以告诉我aws命令的正确格式是什么?

1 个答案:

答案 0 :(得分:1)

第一个问题是您对CURL请求使用的是“ http”。几乎所有的AWS服务都严格使用“ https”作为其协议,包括SageMaker。 https://docs.aws.amazon.com/general/latest/gr/rande.html。我将以为这是一个错字。

您可以通过将'--debug'参数传递给调用来检查AWS CLI的详细输出。我用我最喜欢的duck.jpg图片重新进行了类似的实验:

aws --debug sagemaker-runtime invoke-endpoint --endpoint-name MyEndpoint --body image=@/duck.jpg --content-type multipart/form-data  >(cat)

看输出,我看到:

2018-08-10 08:42:20,870 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=InvokeEndpoint) (verify_ssl=True) with params: {'body': 'image=@/duck.jpg', 'url': u'https://sagemaker.us-west-2.amazonaws.com/endpoints/MyEndpoint/invocations', 'headers': {u'Content-Type': 'multipart/form-data', 'User-Agent': 'aws-cli/1.15.14 Python/2.7.10 Darwin/16.7.0 botocore/1.10.14'}, 'context': {'auth_type': None, 'client_region': 'us-west-2', 'has_streaming_input': True, 'client_config': <botocore.config.Config object at 0x109a58ed0>}, 'query_string': {}, 'url_path': u'/endpoints/MyEndpoint/invocations', 'method': u'POST'}

AWS CLI似乎正在使用字符串文字'@ / duck.jpg',而不是文件内容。

使用curl和“ --verbose”标志再次尝试:

curl --verbose -X POST -F "image=@/duck.jpg" https://sagemaker.us-west-2.amazonaws.com/endpoints/MyEndpoint/invocations

我看到以下内容:

Content-Length: 63097

好多了。 “ @”运算符是CURL的特定功能。 AWS CLI确实可以通过以下方式传递文件:

--body fileb:///duck.jpg

还有一个用于非二进制文件(例如JSON)的“文件”。不幸的是你不能有前缀。也就是说,您不能说:

 --body image=fileb:///duck.jpg

您可以使用以下命令在文件前添加字符串'image ='。 (如果图像很大,您可能需要变得更聪明;这实际上效率不高。)

 echo -e "image=$(cat /duck.jpg)" > duck_with_prefix

您的最终命令将是:

 aws sagemaker-runtime invoke-endpoint --endpoint-name MyEndpoint --body fileb:///duck_with_prefix --content-type multipart/form-data  >(cat)

另一注:由于AWS Auth签名要求-https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html

,将原始curl与AWS服务一起使用非常困难

可以做到,但是使用AWS CLI或Postman-https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html

之类的预先存在的工具,您可能会提高工作效率。