SageMaker Pipeline:类型错误:join() 参数必须是 str、bytes 或 os.PathLike 对象,而不是“ParameterString”

问题描述 投票:0回答:1

我正在编写 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 amazon-web-services amazon-sagemaker
1个回答
0
投票

这里的问题是您尝试将 Python 字符串与类型为

ParameterString
的对象连接起来。
os.path.join
期望所有参数都是有效的路径类型(如字符串或字节),这就是为什么当您传递
ParameterString
时会收到错误。

在 SageMaker Pipelines 中,

ParameterString
是一个占位符,表示管道的运行时参数。该参数的实际值仅在管道执行时可用,而不是在定义时可用。

要使用预处理脚本文件名参数化 SageMaker Pipeline,您需要使用内置的 SageMaker Pipelines 模板功能,该功能利用 Jinja2 模板引擎。

具体操作方法如下:

  1. {{ }}
    code
    参数中使用
    sklearn_processor.run()
    表示法来包含
    data_preprocessing_script
    的动态值。

  2. 更新

    code
    参数如下:

code="{{ BASE_DIR }}/{{ data_preprocessing_script }}"
  1. 将输入设置为
    step_args
    变量时,请使用模板化字符串:
step_args = sklearn_processor.run(
    code="{{ BASE_DIR }}/{{ data_preprocessing_script }}",
    inputs=[
        ProcessingInput(input_name="raw_input_data",
                        ...
    ]
)
  1. 稍后,当您执行管道或创建管道执行时,您可以为
    data_preprocessing_script
    提供实际值:
pipeline.execute(parameters={
    "DataPreProcessingScript": "preprocessing/xxx_preprocessing.py"
})

通过使用这种方法,您可以使代码更加动态,允许您在运行时指定预处理脚本,而不必每次都修改管道定义。

© www.soinside.com 2019 - 2024. All rights reserved.