SageMakerでトレーニング中に No such file or directory: 'train'
というエラーが発生しました。
Traceback (most recent call last): File "/usr/local/bin/dockerd-entrypoint.py", line 28, in <module> subprocess.check_call(shlex.split(" ".join(sys.argv[1:]))) File "/opt/conda/lib/python3.10/subprocess.py", line 364, in check_call retcode = call(*popenargs, **kwargs) File "/opt/conda/lib/python3.10/subprocess.py", line 345, in call with Popen(*popenargs, **kwargs) as p: File "/opt/conda/lib/python3.10/subprocess.py", line 971, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "/opt/conda/lib/python3.10/subprocess.py", line 1863, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) 2024-11-01T14:50:11.898Z FileNotFoundError: [Errno 2] No such file or directory: 'train'
見たところ私自身のプログラムが原因ではないようでした。
エラーが発生したときの実行ログはこちらです。
Starting Preparing the instances for training Downloading Downloading the training image Training Training image download completed. Training in progress. Uploading Uploading generated training model Failed Training job failed
問題の原因と解決方法
SageMakerでトレーニング時に指定するDockerイメージに誤りがありました。
training
用のコンテナーを指定すべきところ、inference
用にしてしまっていました。
このトレーニングではDockerイメージを直接指定しています。
763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-inference-neuronx:2.1.2-neuronx-py310-sdk2.20.1-ubuntu20.04
↓
763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training-neuronx:2.1.2-neuronx-py310-sdk2.20.1-ubuntu20.04
単なるうっかり間違いでしたが、エラーの特定には時間がかかりました。
問題発見の糸口
エラーの表示から自身のプログラムが起動されていないことは分かったので、インポート時のエラーかDockerの起動周りで問題があることは想像できました。そこでDockerのイメージから内容を探りました。
SageMakerで使われるDockerイメージは deep-learning-containersというリポジトリーで管理されています。検索するとエラーの根本になっていた dockerd-entrypoint.pyが見つかったので、さらにそれの呼び出し元を探したところ以下にありました。
Dockerfileのエントリーポイントとして設定されています。
ENTRYPOINT ["python", "/usr/local/bin/dockerd-entrypoint.py"]
結果、CMDに渡される引数を確認する必要があると分かり、 sagemaker-training-toolkit というSageMaker側で動いているプログラムを検索しました。
docker run
で検索すると以下のテストがあり、sagemaker-training-toolkit
からDockerがこう呼ばれ、エラーが発生したと予想できました。
command = ( "docker run --name sagemaker-training-toolkit-test " "sagemaker-training-toolkit-test:dummy train" )
そこでDocker Imageで同じ動作(docker run ... image-name train
)を再現しました。
docker pull 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-inference-neuronx:2.1.2-neuronx-py310-sdk2.20.1-ubuntu20.04 docker run --rm 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-inference-neuronx:2.1.2-neuronx-py310-sdk2.20.1-ubuntu20.04 train
すると同じエラーが発生しました。
Traceback (most recent call last): File "/usr/local/bin/dockerd-entrypoint.py", line 28, in <module> subprocess.check_call(shlex.split(" ".join(sys.argv[1:]))) File "/opt/conda/lib/python3.10/subprocess.py", line 364, in check_call retcode = call(*popenargs, **kwargs) File "/opt/conda/lib/python3.10/subprocess.py", line 345, in call with Popen(*popenargs, **kwargs) as p: File "/opt/conda/lib/python3.10/subprocess.py", line 971, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "/opt/conda/lib/python3.10/subprocess.py", line 1863, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'train'
これでDockerイメージの相性に間違いがあると分かったので、イメージを再確認したところ training
用ではなかったと分かりました。
おわりに
今回は単にうっかりミスでしたが、深いところまで調べる必要がありました。さすがのChatGPTもこの問題については解決できないようでしたし、少し勝った気持ちになり嬉しかったです。
SageMakerをフル活用しているとAWS提供のDeepLearningコンテナーやツールキットも知っていく必要があります。
かなり色々なところをケアしてくれる良いサービスですし拡張性もありますが、拡張やカスタムコンテナーなどの領域に進んでいく際は各リポジトリーについても知っておくことをおすすめします。
- deep-learning-containers:https://github.com/aws/deep-learning-containers/
- sagemaker-training-toolkit:https://github.com/aws/sagemaker-training-toolkit/
- sagemaker-inference-toolkit:https://github.com/aws/sagemaker-inference-toolkit
SageMakerとNeuron(inf1/inf2/trn1)については語り尽くせないのですが、ぜひ少しでも参考になれば幸いです。 昨今色々と騒がれていますが、これが本当のAIだよと伝えたいです。