如何将依赖文件传递给 sagemaker SKLearnProcessor 并在 Pipeline 中使用它?

sha*_*eed 15 python amazon-web-services scikit-learn amazon-sagemaker

我需要从不同的 python 脚本导入函数,该函数将在preprocessing.py文件内部使用。我无法找到将依赖文件传递给SKLearnProcessor对象的方法,因此我得到了ModuleNotFoundError.

代码:

from sagemaker.sklearn.processing import SKLearnProcessor
from sagemaker.processing import ProcessingInput, ProcessingOutput

sklearn_processor = SKLearnProcessor(framework_version='0.20.0',
                                     role=role,
                                     instance_type='ml.m5.xlarge',
                                     instance_count=1)


sklearn_processor.run(code='preprocessing.py',
                      inputs=[ProcessingInput(
                        source=input_data,
                        destination='/opt/ml/processing/input')],
                      outputs=[ProcessingOutput(output_name='train_data',
                                                source='/opt/ml/processing/train'),
                               ProcessingOutput(output_name='test_data',
                                                source='/opt/ml/processing/test')],
                      arguments=['--train-test-split-ratio', '0.2']
                     )
Run Code Online (Sandbox Code Playgroud)

我想通过, dependent_files = ['file1.py', 'file2.py', 'requirements.txt']. 因此,preprocessing.py可以访问所有依赖模块。

并且还需要从requirements.txt文件安装库。

您能分享任何解决方法或正确的方法吗?

2021 年 11 月 25 日更新:

Q1. (已回答,但希望使用 来解决FrameworkProcessor

这里,函数是使用FrameworkProcessorget_run_args处理dependencies和参数。有什么方法可以从或或任何其他方式设置这些参数吗?source_dircodeScriptProcessorSKLearnProcessorProcessor

Q2。

您还可以展示一些使用我们的Processorassagemaker.workflow.steps.ProcessingStep然后使用 in 的参考吗sagemaker.workflow.pipeline.Pipeline

对于拥有Pipeline,我们需要作为强制的还是我们可以直接sagemaker-project创建而不需要任何?PipelineSagemaker-Project

Tul*_*nde 24

您可以通过多种选择来实现这一目标。

\n

一种非常简单的方法是将所有附加文件添加到一个文件夹中,例如:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_package\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 file1.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 file2.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 requirements.txt\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 preprocessing.py\n
Run Code Online (Sandbox Code Playgroud)\n

然后将整个文件夹作为同一文件夹下的另一个输入发送/opt/ml/processing/input/code/,例如:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_package\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 file1.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 file2.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 requirements.txt\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 preprocessing.py\n
Run Code Online (Sandbox Code Playgroud)\n

发生的情况是sagemaker-python-sdk将您的参数放在同一目录下code="preprocessing.py"/opt/ml/processing/input/code/my_package/

\n

编辑:

\n

对于requirements.txt,您可以添加到您的preprocessing.py

\n
from sagemaker.sklearn.processing import SKLearnProcessor\nfrom sagemaker.processing import ProcessingInput, ProcessingOutput\n\nsklearn_processor = SKLearnProcessor(\n    framework_version="0.20.0",\n    role=role,\n    instance_type="ml.m5.xlarge",\n    instance_count=1,\n)\n\nsklearn_processor.run(\n    code="preprocessing.py",  # <- this gets uploaded as /opt/ml/processing/input/code/preprocessing.py\n    inputs=[\n        ProcessingInput(source=input_data, destination=\'/opt/ml/processing/input\'),\n        # Send my_package as /opt/ml/processing/input/code/my_package/\n        ProcessingInput(source=\'my_package/\', destination="/opt/ml/processing/input/code/my_package/")\n    ],\n    outputs=[\n        ProcessingOutput(output_name="train_data", source="/opt/ml/processing/train"),\n        ProcessingOutput(output_name="test_data", source="/opt/ml/processing/test"),\n    ],\n    arguments=["--train-test-split-ratio", "0.2"],\n)\n
Run Code Online (Sandbox Code Playgroud)\n