Sagemaker实时推理端点Payload超6MB限制的解决方案咨询
Amazon SageMaker实时推理Payload超限解决方案
一、更紧凑的数据格式选择
针对大尺寸图片导致JSON Payload超6MB限制的问题,推荐以下几种高效替代格式:
1. MessagePack
二进制序列化格式,体积比JSON更小,序列化/反序列化速度更快。无需复杂配置,直接替换JSON的序列化逻辑即可:
- 发送端:用
msgpack.packb()序列化数据,设置ContentType为application/x-msgpack - 端点侧:用
msgpack.unpackb()解析二进制Body
2. Protocol Buffers(Protobuf)
强类型二进制格式,压缩率远高于JSON,适合结构化数据场景。需要先定义.proto文件描述数据结构,两端生成对应语言的代码来完成序列化/反序列化,适合长期维护的生产环境。
3. 直接传输二进制图片(规避Base64膨胀)
Base64编码会让图片体积增加约33%,如果只需要传递图片+少量元数据,可采用以下方式:
- 将
inferenceType、productType放在请求头中 - 图片二进制直接作为请求Body发送,或用
multipart/form-data格式同时传递元数据和图片文件 - 端点侧直接读取二进制图片,无需Base64解码,大幅降低Payload体积
二、gzip压缩Payload的可行性
可以通过gzip压缩Payload后发送,SageMaker支持接收压缩请求,只需注意两点:
- 发送时设置
Content-Encoding: gzip请求头,保留原ContentType(如application/json) - 端点侧先解压Body再处理
发送端示例代码
import gzip import json from io import BytesIO import boto3 sagemaker_runtime_client = boto3.client('sagemaker-runtime') endpoint_name = "your-endpoint-name" productType = "your-product-type" encoded_image_bytes_as_string = "base64-encoded-image" data = { 'inferenceType': 'SINGLE_INSTANCE', 'productType': productType, 'images': [encoded_image_bytes_as_string], } payload = json.dumps(data).encode('utf-8') # 压缩Payload compressed_payload = BytesIO() with gzip.GzipFile(fileobj=compressed_payload, mode='w') as f: f.write(payload) compressed_payload.seek(0) response = sagemaker_runtime_client.invoke_endpoint( EndpointName=endpoint_name, ContentType="application/json", ContentEncoding="gzip", Body=compressed_payload.read() )
端点侧解压示例(Python推理容器)
import gzip import json def input_fn(request_body, request_content_type, request_context): # 检查是否为gzip压缩 if request_content_type == 'application/json' and request_context.get('ContentEncoding') == 'gzip': decompressed_body = gzip.decompress(request_body) return json.loads(decompressed_body.decode('utf-8')) # 非压缩情况处理 return json.loads(request_body.decode('utf-8')) # 其他模型加载、推理逻辑...
注意:压缩后的Payload仍需控制在6MB以内,建议结合「直接传输二进制图片」的方案,进一步降低体积。
内容的提问来源于stack exchange,提问作者219CID
相关产品推荐
相关产品推荐

