日々精進

新しく学んだことを書き留めていきます

SageMaker Processingでconda環境をactivateしてpythonを実行できない

例えば、以下のサンプルコードのようにScriptProcessorを使って.pyファイルを実行する場合。

github.com

.pyファイルをconda仮想環境myenvで実行するにはどうすればいいか。

ScriptProcessorのcommandでconda activateしてもだめで、理由はdokcerに渡されたコマンドは/bin/shで実行されるため。

色々悩んだが以下解決策に落ち着いた。

  • Dockerfileに以下を書いてcondaコマンドを/bin/sh環境でも実行できるようにする

ENV PATH /opt/conda/bin:$PATH ENV CONDA_DEFAULT_ENV optiver

  • ScriptProcessorをProcessorにし、conda runコマンドでconda環境を指定して実行する
        processor = Processor(
            image_uri="...",
            entrypoint=["conda", "run", "-n", "optiver", "python",
                        "/opt/ml/processing/input/code/preprocess.py"],
            instance_type=self.processing_instance_type,
            instance_count=self.processing_instance_count,
            base_job_name=f"{self.base_job_prefix}/script-optiver-preprocess",
            sagemaker_session=self.sagemaker_session,
            role=self.role,
        )
  • preprocess.pyはProcessingStepでinputとして渡す
        ProcessingStep(
            name="...",
            processor=processor,
            inputs=[ProcessingInput(
                input_name="data",
                source='...',
                destination='...'),
                ProcessingInput(
                    input_name="code",
                    source='...',
                    destination='/opt/ml/processing/input/code/preprocess.py')
            ],
            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"),
            ]
        )

こうすることでconda環境をactivateして.pyを実行出来るし、ScriptProcessorでは一つの.pyファイルしかコンテナに入れられないが 複数の.pyファイルをコンテナに渡して実行することができるので良い。

参考:

github.com

pythonspeed.com