我正在编写 SageMaker 管道,我想将预处理脚本名称作为输入传递到管道。
data_preprocessing_script = ParameterString(
name="DataPreProcessingScript", default_value='',
)
我有以下用于预处理的代码-
sklearn_processor = SKLearnProcessor(
framework_version=sklearn_framework_version,
instance_type=processing_instance_type,
instance_count=processing_instance_count,
base_job_name=f"PreProcess-{base_job_prefix}",
volume_size_in_gb=10,
sagemaker_session=pipeline_session,
role=role,
tags=tags
)
step_args = sklearn_processor.run(
code=os.path.join(BASE_DIR, data_preprocessing_script),
inputs=[
ProcessingInput(input_name="raw_input_data",
随着
os.path.join(BASE_DIR, data_preprocessing_script)
管道失败
TypeError: join() argument must be str, bytes, or os.PathLike object, not 'ParameterString'
如果我传递路径/文件名 - preprocessing.py - 而不是 data_preprocessing_script (ParameterString) 那么它就可以正常工作。
code=os.path.join(BASE_DIR, 'preprocessing/xxx_preprocessing.py')
如何参数化 sagemaker 管道以将预处理脚本文件名作为输入,而不是硬编码文件名。
这里的问题是您尝试将 Python 字符串与类型为
ParameterString
的对象连接起来。 os.path.join
期望所有参数都是有效的路径类型(如字符串或字节),这就是为什么当您传递 ParameterString
时会收到错误。
在 SageMaker Pipelines 中,
ParameterString
是一个占位符,表示管道的运行时参数。该参数的实际值仅在管道执行时可用,而不是在定义时可用。
要使用预处理脚本文件名参数化 SageMaker Pipeline,您需要使用内置的 SageMaker Pipelines 模板功能,该功能利用 Jinja2 模板引擎。
具体操作方法如下:
在
{{ }}
的 code
参数中使用 sklearn_processor.run()
表示法来包含 data_preprocessing_script
的动态值。
更新
code
参数如下:
code="{{ BASE_DIR }}/{{ data_preprocessing_script }}"
step_args
变量时,请使用模板化字符串:step_args = sklearn_processor.run(
code="{{ BASE_DIR }}/{{ data_preprocessing_script }}",
inputs=[
ProcessingInput(input_name="raw_input_data",
...
]
)
data_preprocessing_script
提供实际值:pipeline.execute(parameters={
"DataPreProcessingScript": "preprocessing/xxx_preprocessing.py"
})
通过使用这种方法,您可以使代码更加动态,允许您在运行时指定预处理脚本,而不必每次都修改管道定义。