如何在sagemaker steps/pipeline中调用并传递自定义参数到python脚本?

mgdq6dx1  于 2023-06-20  发布在  Python
关注(0)|答案(1)|浏览(145)

我有一些处理作业,我在sagemaker管道中作为一个步骤运行,我将我的python脚本文件名/路径传递给脚本处理器,并指定command =['python3']。我的main.py文件可以接受一个参数,在本地我可以这样调用它=> python3 main.py -f somevalue。
如何才能实现同样的事情,同时通过sagemaker管道中的步骤运行此文件,我尝试了this => command =['python3',“src/main.py““-f”,“somevalue”].但这不管用
有没有其他方法调用我的脚本并传递参数?
main.py

import argparse
parser = argparse.ArugumentParser()
parser.add_argument("-f", "--flag", type=boolean) 

is_enabled = args.flag

def main():

if(is_enabled):
  //do something
from sagemaker.processing import ProcessingInput, ProcessingOutput
from sagemaker.sklearn.processing import SKLearnProcessor

my_processor = ScriptProcessor(
    framework_version=framework_version,  # e.g. "1.0-1", 
    role=role, 
    instance_type=your_instance_type,  # e.g. 'ml.m5.large'
    base_job_name = your_base_job_name,
    instance_count=your_instance_count,  # e.g. 1
    command = ['python3']
)

my_step = ProcessingStep(
    code=your_script_path,
    inputs=[
        ProcessingInput(
            input_name='custom',
            source='src/main.py',
            destination="/opt/ml/processing/input/data",
            s3_data_type='S3Prefix',
            s3_input_mode="File"
        )
    ]
    ...
)
ryoqjall

ryoqjall1#

要发送额外的CLI参数,您需要arguments参数而不是command-因为command的所有元素都位于脚本位置之前,而您可能希望它们位于例如。python3 your-script.py --flag
为了最大限度地减少交互式实验作业和将作业连接到管道之间的笔记本中的代码更改,我还建议切换到更新的 * 管道会话语法 *,如this example所示。管道会话允许您使用与通常运行作业(estimator.fit()、www.example.com()等)相同的函数调用来构建步骤定义。processor.run (), etc).
……所以,代替:

my_processor = ScriptProcessor(
    command=['python3'],
    ...
)

my_step = ProcessingStep(
    "MyPreprocessStep",
    code=your_script_path,
    inputs=[...],
    arguments=["--flag"],
    ...
)

你可以有:

from sagemaker.workflow.pipeline_context import PipelineSession

# Swap this out to run interactively instead of building a pipeline:
session = PipelineSession()

my_processor = ScriptProcessor(
    command=['python3'],
    sagemaker_session=session,
    ...
)

my_step = ProcessingStep(
    "MyPreprocessStep",
    step_args=my_processor.run(
        code=your_script_path,
        inputs=[...],
        arguments=["--flag"],
        ...
    ),
)

...这更接近于您通常用于最初在管道外测试独立作业的语法(processor.run())。

相关问题