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