Amazon SageMaker PipelineModel批量转换报错:application/json非可接受ContentType
问题分析与解决方案
原因确认
没错,这个错误就是因为第一个SKLearn预处理容器输出的中间数据是application/json格式,而第二个XGBoost模型容器只支持错误提示里列出的格式(比如text/csv、libsvm等),导致XGB容器无法识别输入格式而报错。
解决办法
1. 修改SKLearn预处理脚本,强制输出CSV格式
在你的SKLearn预处理脚本里,调整transform_fn或者predict_fn函数,把处理后的数据输出为CSV格式,而非默认的JSON:
import pandas as pd def transform_fn(model, request_body, request_content_type, response_content_type): # 保留原有预处理逻辑,比如解析输入、用模型处理数据 input_data = pd.read_csv(request_body) processed_data = model.transform(input_data) # 把处理好的数据转成CSV字符串,去掉索引和表头 csv_result = pd.DataFrame(processed_data).to_csv(index=False, header=False) # 返回CSV内容和对应的content type return csv_result, "text/csv"
2. 通过环境变量配置容器的输入输出格式
创建模型时给两个容器分别设置环境变量,让SKLearn输出CSV,XGB接收CSV:
# 创建SKLearn模型时指定输出格式为CSV scikit_learn_inferencee_model = sklearn_preprocessor.create_model( env={"SAGEMAKER_INFERENCE_OUTPUT_FORMAT": "text/csv"} ) # 创建XGB模型时指定输入格式为CSV xgb = Model( image_uri=image_uri, model_data=mod.model_data, role=role, env={"SAGEMAKER_INFERENCE_INPUT_FORMAT": "text/csv"} ) # 重新构建PipelineModel sm_model = PipelineModel( name=model_name, role=role, models=[scikit_learn_inferencee_model, xgb] )
3. 调整批量转换的全局环境变量
在创建transformer时,添加全局环境变量统一指定输出格式,确保容器间传递的格式匹配:
final = sm_model.transformer( instance_count=1, instance_type="ml.m5.2xlarge", assemble_with="Line", accept="text/csv", strategy='SingleRecord', env={"SAGEMAKER_INFERENCE_OUTPUT_FORMAT": "text/csv"} )
内容的提问来源于stack exchange,提问作者mai nguyen
相关产品推荐
相关产品推荐

