当使用 SageMaker 部署的 DeepAR 模型进行预测时,若传入已序列化的 JSON 字符串(如 json.dumps(...))却仍配置了 JSONSerializer(),会导致重复序列化,触发“Unable to evaluate payload provided”错误——本质是请求体格式被破坏,服务端无法解析。
当使用 sagemaker 部署的 deepar 模型进行预测时,若传入已序列化的 json 字符串(如 `json.dumps(...)`)却仍配置了 `jsonserializer()`,会导致重复序列化,触发“unable to evaluate payload provided”错误——本质是请求体格式被破坏,服务端无法解析。
在 AWS SageMaker 中调用 DeepAR 模型进行推理时,序列化器(Serializer)与输入数据格式必须严格匹配。您当前的代码存在一个典型且易被忽视的配置冲突:
predictor = estimator.deploy(
initial_instance_count=1,
instance_type='ml.m5.large',
serializer=JSONSerializer(), # ❌ 冲突根源
deserializer=JSONDeserializer()
)
json_request = json.dumps({ ... }) # ✅ 已是字符串格式
prediction = predictor.predict(json_request) # ❌ predict() 会再次序列化该字符串 → 变成 '"{...}"'JSONSerializer() 的设计初衷是:接收 Python 原生字典/列表等对象,并在其内部调用 json.dumps() 转为字符串发送给端点。但您已手动执行 json.dumps(),将请求体转为字符串后传入 predict() —— 此时 JSONSerializer 会对字符串再次调用 json.dumps(),导致最终 payload 变为带双引号包裹的字符串(例如 "\"{...}\""),严重违反 DeepAR 端点期望的 JSON 对象格式,从而返回 ModelError: Received client error (400) from primary with message "Unable to evaluate payload provided"。
✅ 正确做法有两种(任选其一):
方案一:移除 Serializer,直接传入字典(推荐)
让 SageMaker 自动处理序列化,避免手动干预:
# 部署时不指定 serializer/deserializer(默认即 JSON)
predictor = estimator.deploy(
initial_instance_count=1,
instance_type='ml.m5.large',
# serializer 和 deserializer 可省略,默认行为即正确
)
# 构造原生 Python 字典(非字符串!)
payload = {
"instances": [
{
"start": "2024-03-01",
"target": [60,10,86,62,21,25,7,79,33,82,34,43,14,99,5,37,85,84,88,25,2,14,15,98,14,75,70,99,12]
},
{
"start": "2024-04-01",
"target": [55,89,40,81,87,7,49,77,37,42,48,27,89,45,85]
}
],
"configuration": {
"num_samples": 15,
"output_types": ["quantiles", "samples"],
"quantiles": ["0.2", "0.5", "0.8"]
}
}
# 直接传入字典,predict() 内部自动序列化
prediction = predictor.predict(payload)方案二:保留 Serializer,但传入原始字典
若显式指定 JSONSerializer,则必须确保输入是未序列化的 Python 对象:
from sagemaker.serializers import JSONSerializer
from sagemaker.deserializers import JSONDeserializer
predictor = estimator.deploy(
initial_instance_count=1,
instance_type='ml.m5.large',
serializer=JSONSerializer(), # ✅ 仅当输入为 dict/list 时有效
deserializer=JSONDeserializer()
)
# payload 是 dict,不是 str
payload = { ... } # 同上构造方式
prediction = predictor.predict(payload) # ✅ predict() 调用 serializer.dumps()⚠️ 注意事项:
- 绝对不要对已 json.dumps() 的字符串再配 JSONSerializer;
- start 字段需符合 ISO 8601 格式(如 "2024-03-01" 或 "2024-03-01T00:00:00"),且必须能被模型训练时使用的频率(如 D 表示日频)对齐;
- target 长度应 ≥ prediction_length(模型训练时设定的预测步长),否则可能引发隐式错误;
- 若模型训练时使用了 cat 或 dynamic_feat,推理时必须提供对应字段,否则会报 InvalidInputException;
- 生产环境中建议添加异常捕获,区分 ModelError(数据格式问题)与 ClientError(权限/资源问题)。
总结:DeepAR 的 400 错误多源于 payload 结构失配,核心原则是——序列化责任唯一:要么交由 SageMaker(传 dict + 默认或显式 JSONSerializer),要么完全手动控制(传 str + 不配 Serializer)。混用二者是绝大多数此类错误的根源。

















