Make組ブログ

Python、Webアプリや製品・サービス開発についてhirokikyが書きます。

SageMakerでのトレーニング実行前に FileNotFoundError: [Errno 2] No such file or directory: 'train'

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"]

https://github.com/aws/deep-learning-containers/blob/f97413f4b6833cea3e68ad3c7b9b67adcf72bc4a/huggingface/pytorch/inference/docker/1.13/py3/sdk2.14.1/Dockerfile.neuronx#L187

結果、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"
        )

https://github.com/aws/sagemaker-training-toolkit/blob/54721512597e77530a68e14c35a857be2f5c5687/test/integration/local/test_dummy.py#L27

そこで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コンテナーやツールキットも知っていく必要があります。
かなり色々なところをケアしてくれる良いサービスですし拡張性もありますが、拡張やカスタムコンテナーなどの領域に進んでいく際は各リポジトリーについても知っておくことをおすすめします。

SageMakerとNeuron(inf1/inf2/trn1)については語り尽くせないのですが、ぜひ少しでも参考になれば幸いです。 昨今色々と騒がれていますが、これが本当のAIだよと伝えたいです。

執筆:@hirokiky
Shodoで執筆されました