例えば、以下のサンプルコードのようにScriptProcessorを使って.pyファイルを実行する場合。
.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ファイルをコンテナに渡して実行することができるので良い。
参考: