如何在Sagemaker管道处理步骤中添加附加文件。

3

我想要有额外的文件可以在preprocess.py文件中导入,但是我无法直接导入这些文件。

我的目录看起来像这样: screenshot

想要从helper_functions目录导入到preprocess中。

我尝试在setup.py文件中添加这个,但是没有成功。

package_data={"pipelines.ha_forecast.helper_functions": ["*.py"]},

有一件事情似乎有效,就是将这个文件夹添加到输入中,像这样:

inputs = [
ProcessingInput(source=f'{project_name}/{module_name}/helper_functions',
destination="/opt/ml/processing/input/code/helper_functions"),
]

但是这样会将所需的文件放在其他目录中,我无法再次导入。

有什么标准的做法吗?

1个回答

2
您需要指定source_dir。然后在您的脚本中,您可以像平常一样导入模块。

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

请参阅处理的一般文档(您必须使用FrameworkProcessor而不是特定的处理器,如SKLearnProcessor)。
附注:答案类似于问题“如何在sagemaker管道中安装其他软件包”。
在指定的文件夹中,必须有脚本(在您的情况下为preprocess.py)、可能需要的任何其他文件/模块,以及requirements.txt文件(如果有)。
然后文件夹的结构将是:
BASE_DIR/
|─ helper_functions/
|  |─ your_utils.py
|─ requirements.txt
|─ preprocess.py

在您的preprocess.py文件中,您可以通过简单地调用脚本来运行它们:

from helper_functions.your_utils import your_class, your_func

因此,你的代码变成了:
from sagemaker.processing import FrameworkProcessor
from sagemaker.sklearn import SKLearn
from sagemaker.workflow.steps import ProcessingStep
from sagemaker.processing import ProcessingInput, ProcessingOutput

BASE_DIR = your_script_dir_path

sklearn_processor = FrameworkProcessor(
    estimator_cls=SKLearn,
    framework_version=framework_version,
    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(
    inputs=[your_inputs],
    outputs=[your_outputs],
    code="preprocess.py",
    source_dir=BASE_DIR,
    arguments=[your_arguments],
)

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

将各个步骤的文件夹分开并避免重叠是一个良好的实践。


这不是同样的答案。它涉及到两个不同的问题,但解决方式相似。你可以看到一个是通用情况下的答案,而另一个是特定情况下的答案。 - Giuseppe La Gualano
它起作用了,但是它改变了S3的输入目录,现在将获取FrameworkProcessor的详细信息。 - sid8491
这个自动触发流水线的代码有时候会很随机,有时候会触发,有时候又不会。我也看不到定义 CICD 流水线触发规则的地方。真是让人沮丧。 - sid8491
你能更明确地说明问题吗?如果需要避免因果关系,你可以尝试将step_args的主体直接放在run中。 - Giuseppe La Gualano
看看这个问题,已经有足够的投票,但没有答案:"SageMaker pipeline execution after commit is not triggered"。我认为你的问题不是运行依赖性的问题。问题中的人遵循了特定的教程,并且和你一样遇到了同样的问题。希望这对你有所帮助! - Giuseppe La Gualano
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接