调用SageMaker端点时报body不能为空的ValidationError如何解决
问题排查与解决方案
错误根因
- 拆分后存在无效空样本:如果你的输入
request_body末尾带有|分隔符,调用split('|')会生成最后一个空字符串元素,打印时空行容易被忽略,空字符串传入invoke_endpoint的Body参数就会触发成员不能为空的校验错误。 - 代码缩进错误:当前代码中结果解析、结果追加到列表的逻辑在for循环外部,仅会执行一次,仅能保留最后一次接口调用的返回结果,不符合采集全量样本预测结果的需求。
修复代码
import boto3 import json ENDPOINT_NAME = "my_endpoint" runtime = boto3.client('runtime.sagemaker') results = [] # 拆分时过滤空字符串,剔除无效空样本 samples = [r.strip() for r in request_body.split('|') if r.strip()] for r in samples: response = runtime.invoke_endpoint( EndpointName=ENDPOINT_NAME, ContentType='text/csv', Body=r ) # 缩进修正:将结果处理逻辑放到循环内部,每个样本对应一次结果处理 result = json.loads(response['Body'].read().decode()) results.append(result)
结果映射方法
修复后results列表的顺序和输入样本的顺序完全一致,你只需要提前将和样本顺序对应的id存储为一个列表,按索引即可完成配对:例如id列表为sample_ids = [id_1, id_2, ..., id_n],则results[i]就是sample_ids[i]对应的预测结果。
内容的提问来源于stack exchange,提问作者Glaucon
相关产品推荐
相关产品推荐

