在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
命令的正确格式是什么吗?
2条答案
按热度按时间chhkpiq41#
第一个问题是你使用'http'作为你的CURL请求。几乎所有的AWS服务都严格使用'https'作为他们的协议,SageMaker包括. https://docs.aws.amazon.com/general/latest/gr/rande.html。我假设这是一个错字。
您可以通过将'--debug'参数传递给您的调用来检查AWS CLI的详细输出。我用我最喜欢的duck.jpg图像重新运行了一个类似的实验:
字符串
看看输出,我看到:
型
看起来AWS CLI正在使用字符串文字'@/duck. jpg',而不是文件内容。
再次尝试使用curl和“--verbose”标志:
型
我看到以下内容:
型
好多了。“@”操作符是一个CURL特定的功能。AWS CLI确实有一种方法来传递文件:
型
对于非二进制文件,如JSON,也有一个“file”。不幸的是,你不能有前缀。也就是说,你不能说:
型
你可以使用下面这样的命令将字符串“image=”前置到你的文件中(如果你的图像真的很大,你可能需要更聪明;这真的很低效)。
型
您的最终命令将是:
型
另一个注意事项:由于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)可能会提高您的工作效率
vh0rcniy2#
对于任何登陆这里并可以使用Python的人来说,这是我发现的。
署名:https://betatim.github.io/posts/python-create-multipart-formdata/
使用python将表单数据与文件一起发送到sagemaker端点
使用urllib3.encode_multipart_formdata
范例:
字符串