创建AWS SageMaker Pipeline报DataSplitPercent未知属性引用错误
问题描述
创建AWS SageMaker Pipeline时,2个月前同逻辑管道可正常运行,当前执行pipeline.upsert(role_arn=role)操作时报以下错误:
ClientError: An error occurred (ValidationException) when calling the CreatePipeline operation: Unknown property reference [Parameters.DataSplitPercent].
涉及的核心代码片段如下:
Input_data =ParameterString(name="InputDataUrl",default_value=f"s3://akgargbucket/iris.data") data_split_percent = ParameterFloat(name="DataSplitPercent", default_value=0.7) # sklearn_processor初始化逻辑省略 step_process = ProcessingStep( name="ReadAndEncodeData", processor=sklearn_processor, outputs=[ ProcessingOutput(output_name="train", source="/opt/ml/processing/train"), ProcessingOutput(output_name="test", source="/opt/ml/processing/test"), ], code=os.path.join(BASE_DIR, "preprocess.py"), job_arguments=["--input-data", input_data, "--data_split_percent",data_split_percent])
报错原因
这个错误的本质是SageMaker Pipeline服务端做配置校验时,无法识别步骤中引用的Parameters.DataSplitPercent参数,核心诱因是SDK版本迭代带来的写法变更:
- 2个月前使用的低版本SageMaker Python SDK(一般是v2.130.0之前的版本),会在初始化Pipeline时自动遍历所有步骤里引用的Parameter对象,隐式收集到管道参数列表中,不需要手动声明,因此当时代码可以正常运行。
- 近期SDK升级后移除了这个隐式收集逻辑,要求用户必须显式把所有用到的管道参数传入Pipeline对象的
parameters入参,未显式注册的参数会被服务端判定为无效引用,抛出校验错误。 - 除此之外,变量名拼写不一致、代码中混入无效格式字符也可能触发同类错误。
排查解决步骤
- 第一步:显式注册所有管道参数
检查Pipeline实例化代码,把你定义的所有Parameter对象都显式传入parameters列表,参考写法如下:from sagemaker.workflow.pipeline import Pipeline # 统一变量名,修正原代码中Input_data/input_data大小写不一致的问题 input_data = ParameterString(name="InputDataUrl",default_value=f"s3://akgargbucket/iris.data") data_split_percent = ParameterFloat(name="DataSplitPercent", default_value=0.7) # 省略sklearn_processor、step_process的初始化逻辑 # 初始化管道时显式传入所有参数和步骤 pipeline = Pipeline( name="your-pipeline-name", parameters=[ input_data, data_split_percent, # 之前漏传该参数就会触发本次报错 # 其余自定义参数全部添加到此处 ], steps=[step_process], sagemaker_session=sagemaker_session ) # 重新执行upsert即可 pipeline.upsert(role_arn=role) - 第二步:排查引用一致性问题
检查所有参数引用位置,确认没有两类错误:- 参数定义时的
name属性大小写、拼写和引用路径完全一致,比如定义name为DataSplitPercent,就不能在其他位置引用Parameters.data_split_percent - 变量名拼写统一,比如原代码中参数定义写的是大写开头的
Input_data,job_arguments里传的是小写开头的input_data,属于未定义变量引用,会连带导致参数解析失败。
- 参数定义时的
- 第三步:清理无效字符
检查代码中是否混入了<br/>这类HTML换行标签,这类不属于Python语法的字符会导致参数定义解析异常,直接删除即可。 - 第四步:确认SDK版本
执行pip show sagemaker查看本地SDK版本,v2.130.0及以上版本必须遵循显式传参的要求,不要依赖旧版本的隐式参数收集逻辑。
内容的提问来源于stack exchange,提问作者akshat garg
相关产品推荐
相关产品推荐

