Necesito importar la función de diferentes scripts de python, que se usarán dentro del archivo preprocessing.py . No pude encontrar una manera de pasar los archivos dependientes al objeto SKLearnProcessor , por lo que ModuleNotFoundError .
Código:
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'] ) Me gustaría pasar, dependent_files = ['file1.py', 'file2.py', 'requirements.txt'] . Entonces, ese preprocessing.py tiene acceso a todos los módulos dependientes.
Y también necesita instalar bibliotecas desde el archivo requirements.txt .
¿Puede compartir algún trabajo o una forma correcta de hacer esto?
Actualización-25-11-2021:
Q1. (Respondido pero buscando resolver usando FrameworkProcessor )
Aquí , la función get_run_args maneja dependencies , source_dir y parámetros de code mediante FrameworkProcessor . ¿Hay alguna forma de que podamos configurar estos parámetros desde ScriptProcessor o SKLearnProcessor o cualquier otro Processor para configurarlos?
Q2.
¿Puede también mostrar alguna referencia para usar nuestro Processor como sagemaker.workflow.steps.ProcessingStep y luego usarlo en sagemaker.workflow.pipeline.Pipeline ?
Para tener Pipeline , ¿necesitamos sagemaker-project como obligatorio o podemos crear Pipeline directamente sin ningún Sagemaker-Project ?
Esto no es compatible con SKLearnProcessor. Debería empaquetar sus dependencias en la imagen de la ventana acoplable y crear un Processor personalizado (por ejemplo, un ScriptProcessor con el image_uri de la imagen de la ventana acoplable que creó).
Hay un par de opciones para que lo logres.
Uno que es realmente simple es agregar todos los archivos adicionales a una carpeta, por ejemplo:
. ├── my_package │ ├── file1.py │ ├── file2.py │ └── requirements.txt └── preprocessing.py Luego envíe esta carpeta completa como otra entrada bajo el mismo /opt/ml/processing/input/code/ , ejemplo:
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", # <- this gets uploaded as /opt/ml/processing/input/code/preprocessing.py inputs=[ ProcessingInput(source=input_data, destination='/opt/ml/processing/input'), # Send my_package as /opt/ml/processing/input/code/my_package/ ProcessingInput(source='my_package/', destination="/opt/ml/processing/input/code/my_package/") ], 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"], ) Lo que sucede es que sagemaker-python-sdk colocará su argumento code="preprocessing.py" en /opt/ml/processing/input/code/ y tendrá my_package/ en el mismo directorio.
Editar:
Para los requirements.txt , puede agregar a su preprocessing.py :
import sys import subprocess subprocess.check_call([ sys.executable, "-m", "pip", "install", "-r", "/opt/ml/processing/input/code/my_package/requirements.txt", ])