我想在我的 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,
)
对于管道中的每个作业,您应该有单独的要求(因此您只安装每个步骤中所需的内容并完全控制它)。
为此,您需要使用
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,并且不会产生重叠。
一直在尝试实现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
直接放在父目录下才能成功。