如何在 sagemaker 管道中安装附加包

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

我想在我的 sagemaker 管道中添加依赖包,它将在预处理步骤中使用。

我尝试将其添加到

required_packages
文件中的
setup.py
中,但它不起作用。 我认为 setup.py 文件根本没有用。

required_packages = ["sagemaker==2.93.0", "matplotlib"]

预处理步骤:

sklearn_processor = SKLearnProcessor(
        framework_version="0.23-1",
        instance_type=processing_instance_type,
        instance_count=processing_instance_count,
        base_job_name=f"{base_job_prefix}/job-name",
        sagemaker_session=pipeline_session,
        role=role,
    )
    step_args = sklearn_processor.run(
        outputs=[
            ProcessingOutput(output_name="train", source="/opt/ml/processing/train"),
            ProcessingOutput(output_name="validation", source="/opt/ml/processing/validation"),
            ProcessingOutput(output_name="test", source="/opt/ml/processing/test"),
        ],
        code=os.path.join(BASE_DIR, "preprocess.py"),
        arguments=["--input-data", input_data],
    )
    step_process = ProcessingStep(
        name="PreprocessSidData",
        step_args=step_args,
    )

管道定义:

pipeline = Pipeline(
        name=pipeline_name,
        parameters=[
            processing_instance_type,
            processing_instance_count,
            training_instance_type,
            model_approval_status,
            input_data,
        ],
        steps=[step_process],
        sagemaker_session=pipeline_session,
    )
amazon-sagemaker amazon-sagemaker-studio
2个回答
3
投票

对于管道中的每个作业,您应该有单独的要求(因此您只安装每个步骤中所需的内容并完全控制它)。

为此,您需要使用

source_dir
参数:

source_dir(str 或 PipelineVariable)– 路径(绝对、相对或 S3 URI)到包含任何其他训练源代码的目录 除了入口点文件之外的依赖项(默认值:无)。如果 source_dir 是一个 S3 URI,它必须指向 tar.gz 文件。结构 在 Amazon SageMaker 上训练时会保留此目录中的内容。

查看 Processing 的一般文档(您必须使用 FrameworkProcessor)。

在指定的文件夹中,必须有脚本(在您的情况下为 preprocess.py)、可能需要的任何其他文件/模块以及

requirements.txt
文件。

文件夹的结构将是:

BASE_DIR/
|- requirements.txt
|- preprocess.py

就是通用的需求文件,没有什么不同。并且会在实例启动时自动使用,无需任何指令。


所以,你的代码变成:

from sagemaker.processing import FrameworkProcessor
from sagemaker.sklearn import SKLearn
from sagemaker.workflow.steps import ProcessingStep
from sagemaker.processing import ProcessingInput, ProcessingOutput


sklearn_processor = FrameworkProcessor(
    estimator_cls=SKLearn,
    framework_version='0.23-1',
    instance_type=processing_instance_type,
    instance_count=processing_instance_count,
    base_job_name=f"{base_job_prefix}/job-name",
    sagemaker_session=pipeline_session,
    role=role
)

step_args = sklearn_processor.run(
    outputs=[
        ProcessingOutput(output_name="train", source="/opt/ml/processing/train"),
        ProcessingOutput(output_name="validation", source="/opt/ml/processing/validation"),
        ProcessingOutput(output_name="test", source="/opt/ml/processing/test"),
    ],
    code="preprocess.py",
    source_dir=BASE_DIR,
    arguments=["--input-data", input_data],
)

step_process = ProcessingStep(
    name="PreprocessSidData",
    step_args=step_args
)

请注意,我更改了

code
参数和
source_dir
。最好将各个步骤的文件夹分开,这样每个步骤都有一个requirements.txt,并且不会产生重叠。


0
投票

一直在尝试实现Giuseppe的答案,但到目前为止,这是我让

requirements.txt
工作的唯一方法:

文件夹结构:

parent_dir/
    requirements.txt
    pipelines/my_pipeline/
        pipeline.py
        step_processing.py
        preprocess.py
        helper_functions.py

step_processing.py
的一部分:

    sklearn_processor = FrameworkProcessor(
        estimator_cls=SKLearn,
        framework_version="0.23-1",
        instance_type=processing_instance_type,
        instance_count=processing_instance_count,
        base_job_name=base_job_name,
        sagemaker_session=pipeline_session,
        role=role,
        )
    step_args = sklearn_processor.run(
        outputs=[
            ProcessingOutput(output_name="train", source="/opt/ml/processing/train"),
            ProcessingOutput(output_name="validation", source="/opt/ml/processing/validation"),
            ProcessingOutput(output_name="test", source="/opt/ml/processing/test"),
        ],
        code='preprocess.py',
        arguments=["--input-data", input_data],
        source_dir=BASE_DIR,
        dependencies=['requirements.txt'],
        )

这个实现让我能够在

import helper_functions
preprocess.py
,这是一个相关的关注点

如果我能让 Giuseppe 的答案起作用,这意味着我可以将

requirements.txt
和预处理代码移动到
my_pipeline/
内的子文件夹中,这将非常棒。然而,目前我只有将
requirements.txt
直接放在父目录下才能成功。

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