curl Amazon SageMaker:将文件作为multipart/form-data创建端点

tcomlyy6  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(154)

在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命令的正确格式是什么吗?

chhkpiq4

chhkpiq41#

第一个问题是你使用'http'作为你的CURL请求。几乎所有的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,也有一个“file”。不幸的是,你不能有前缀。也就是说,你不能说:

--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签名要求,将原始curl与AWS服务一起使用非常困难-https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html
这是可以做到的,但使用AWS CLI或预先存在的工具(如Postman -https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html)可能会提高您的工作效率

vh0rcniy

vh0rcniy2#

对于任何登陆这里并可以使用Python的人来说,这是我发现的。
署名:https://betatim.github.io/posts/python-create-multipart-formdata/

使用python将表单数据与文件一起发送到sagemaker端点

使用urllib3.encode_multipart_formdata
范例:

import boto3
import sagemaker
from sagemaker.predictor import Predictor
from urllib3 import encode_multipart_formdata

ENDPOINT_NAME = "example-endpoint"
IMAGE_PATH = "examples/image.jpg"
KEY = "image"
FILENAME = "image.jpg"

session = boto3.Session()
sagemaker_session = sagemaker.Session(boto_session=session)
predictor = Predictor(ENDPOINT_NAME, sagemaker_session)
data = {
  KEY: (FILENAME, open(IMAGE_PATH, "rb").read(), "image/jpg")
}

body, header = encode_multipart_formdata(data)
inference_response = predictor.predict(body, initial_args={"ContentType": header})

print(inference_response)

字符串

相关问题