Make組ブログ

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で執筆されました

PyCon JP 2024はディープなトークが多くて良かった #pyconjp2024

2024年9月27日、28日はPyCon JP 2024のカンファレンスデーでした。

https://2024.pycon.jp/

今回はトークの満足度が個人的にとても高かった。とくにコア開発、処理系、PEP Author(仕様策定に携わる人)のトークも充実しており、トークだけを見てもイベントとして贅沢なものだったと思います。

参加したトークはこのあたりでした:

  • キーノート(1日目)
  • Django Ninjaで高速なAPI開発を実現する: 実践ガイドとベストプラクティス
  • Crimes with the Python syntax
  • Extracting Structured Data from LLMs with LangChain and Pydantic
  • An overview of the optimisation pipeline in CPython 3.13 and onwards
  • Unlocking the Parallel Universe: Subinterpreters and Free-Threading in Python 3.13
  • 【招待講演】PythonUTF-8
  • Unlocking Python's Core Magic
  • CloudFlare Workers in Pythonでサーバーレスアプリケーションを作ろう
  • Sleuthing in Cython: Wrapping and Debugging Legacy C Libraries for Python
  • Playing games in the browser with WASM
  • The Wheelhouse of Horrors
  • Why Knowing Cython Helps in Understanding Python: A Deep Dive into Cython & PVM
  • プロダクションでのPython非同期ユースケース - Trio/Trio-Utilを中心に
  • キーノート(2日目)

すべては紹介しきれないので、印象に残った点だけここで挙げさせてください。

ディープなトークの数々

Python 3.13で入るCPythonの最適化の話、Wheelパッケージの構造と動作の話(どのようにしてsoファイルを同梱するのか)、言語としてUTF-8を標準にしていく過程と開発者内での議論の話が印象的でした。コア開発に関わる人たちによる直接の話であり、Pythonそのものについて「どうより良くしていくか」、「どうなっているのか」という内部的な話を聞けたのが貴重でした。

Python 3.13ではスタックマシンの最適化のため、ある動作が繰り返された場合にTier2というマシンでTier1内の処理を反復しないような制御について説明されており興味深かったです。

PythonエンコーディングUTF-8にしていく過程の話も、いかにコア開発者の中でコンセンサスを取り、後方互換性を担保しながら一つひとつ前に進めていくリアルな話が大変面白かったです。完璧な正解のない世界ですし、僕たちが知らないような動作を保証する必要があったりと難しいものだと感じました。それを進めてくれるmethaneさんに改めて感謝したいものです。ありがとうございます。

初日のキーノート:James Powell

また初日のキーノートスピーチにはとても感銘を受けました。結論としてはツールやライブラリー、言語の思想や構造を理解したうえでそれに沿った使い方をすべき、というものでした。pandas で金融のデータを扱うケースを参考にしつつ、「こういう使い方は間違いだよね」と紹介していくものでした。一番簡単な例を挙げると日時、銘柄、価格のカラムがあるのであれば、日時と銘柄をインデックスにして価格のみをカラムとすべきというものです。

ともかくとして単にツールを使うのではなく、そのツールのもつ思想や目的、内部的な構造を深く理解しようという啓蒙でした。データベースを使うにしても、DuckDBを使うにしても、何にしても「それがどういう内部構造でどういう意図のものか」を理解して適切に使おうというものです。ノウハウ、小手先のテクニックという話ではなく、プリンシパルに帰ろうという技術的な天啓を感じさせるものでした。

トークをたくさん聞けた

今回は私が登壇せず、スタッフでもスポンサーでもなかったので一人の参加者として改めて楽しめました。純粋に参加者として参加したのはPyCon JP 2011以来かもしれません(2012年にはJointイベントでDjango・Pyramidのスタッフでした)。

その中で本当に楽しめるトークが盛りだくさんで良かったです(もちろん上記した以外のトークも素晴らしいものばかり)。もうPythonは15年近くやっていますし、近年はPythonの用途も幅広くなっています。ですがその中でも新しい領域の話や、コア開発・ライブラリー開発に関わるディープなトークもたくさんあり堪能できました。

また、トークの後には質問ができたり、登壇者と直接話す機会があり現地に参加して良かったと思っています。子どもを連れての参加でしたので、イベントの前後の子守もあり正直疲れ果ててしまいましたが、全力で参加できて良かったです。

最後に、今の時代こそ

PyCon JP 2024はトークの内容としてもイベントとしても素晴らしいものでありました。スタッフの皆さまには感謝しております。

今の時代はイベント運営というのが簡単ではなくなったように思います。たくさんの人が関わっており、いろいろな意見、憶測、守るべきことなどが存在する世界です。それも大切なことですし、内省し改善すべきこともあるでしょう。ですがそういったリスクにさらされやすい運営の人たちが「じゃぁもう辞めようか」となってしまうのは悲しいものです。建設的な議論と、前向きな行動が、改めて周囲の僕たちを含めて必要なのかなと思います。

あとポジティブなフィードバックとかね。

今年のPyCon JP 2024はトークの内容もイベントも堪能でき、かつ技術的なディープさもちゃんとありとても良かったです。まぁ、僕のこの「良かったよ」というメッセージは大して多くの人にも見られず、炎上しやすいマイナスの意見が人の心に残りやすいものです。でもだからこそ、今回はきちんと感謝を伝えたいなと思いブログに残すことにしました。

ありがとうございました。

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

「ストーナー」を読み終えて

前回書いたように株主総会や決算が終わり、やっとまともな呼吸ができるようになって、ストーナーという小説を読んでいました。途中までほんの少しずつ読んでいたのを、精神的な落ち着きが得られた今になって、一気に読み終えることができました。

本の感想はあまり言いたくないというか、自分の中でもう少し大事にしたい何かがある状態です。なので人におすすめなどはしたくないものの、どんな感想でも見つけ出して自分のものにしてしまえる時代だからこそ、何かを書いておきたい気持ちになっています。おそらくは、読み終えた人の大半はこんな感情になるんじゃないでしょうか。

太鼓判を押したいものでもないですが、自分の中で大切にしたい何かがある本でした。小説(とくに純文学)を読むのも久しぶりといえばそうで、最近はエンジニアや経営者らしく技術書やビジネス書、会計の本などばかり読んでしまっていました。だからこそ、この本を読めて良かったと思いますし、たまたま妻と娘が家にいない貴重な自分の時間をこの本の最後に割けて良かったです。妻子をもつと一人の時間ってものすごく貴重なので、それを読書に使うのはほんとうに贅沢なことですからね。それでも良かったと思っています。

まぁ、これを感想とさせてください。

むしろ結婚し、子どもを育て、そして仕事を頑張るなかでこそ味わえた読了感なのかもしれません。読み終わったときは悲しみというか、何かを失った気持ちになりましたが、今はそれも含めて受容する精神的なプロセスのようなものを感じています。そういう本なんです。

こんな気持ちになった本はサン=テグジュペリの「人間の土地」以来かもしれません。

思えばここ数年は、あまりにも世俗的というか、目的をもって本を読むことや消化することに汚染されすぎていたなと思います(以前もそんな話をしましたが)。この本の冒頭から分かるように、劇的でなくヒーローも登場しなければ、快活でも知見を授けてくれる本でもありません。でもだからこそ、読む価値があったなと思える時間でした。そういえば、こんなにも純粋に活字そのものに心を惹かれたことって最近あったっけ?と思えるほどです。嘘みたいな話ですが、さっき出ていった妻がすぐ帰宅して「忘れ物でもあったかな」と思っていると、もう1時間近く経っていたということもありました。

今、僕の横には「肩をすくめるアトラス」があるのですが、また何か目的主義的というか何らかの悪癖に身を投じる予感がしています。今だけはもう少し、ありのままの世界に浸らせてもらいましょう。

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

作った会社の第4期の決算が終わりました

株式会社ゼンプロダクツを創業して4年、第4期の決算と株主総会が終わりました。
前期に続いてかなり良い感じの成長を遂げ、投資をしていただいた2年前に掲げた目標も順にクリアできています。

ほんとうにありがたいことです。

自分で作った会社、プロダクト、サービスでやっていけるだけでとてもありがたく光栄なことです。ですが、ここからさらに倍、倍と成長を求められる(または自分に課していく)のがスタートアップです。ほんとうに大変な世界なので、起業(とくに自社サービスのスタートアップ)なんてやらないほうが良いと思います。

投資していただいた株主の方には満足していただいており、ランチもご一緒しました。でも毎年思いますが、またここからが一番大変な時期だなと思います。正直、ゼロから1を作り、お金をいただくという意味で1から10には成長できたかなと思います(まぁ何をもって「1」や「10」なのかは人によりますが)。ですがやはり次は100や1000を目指していく世界なので、「ほんとうのたたかい」が始まるのでしょう。

株主総会をする僕

ここ最近はPR TIMES様にご導入いただいたり、他の大きな会社さんを始めいろいろな方にもお世話になっています。自分の作った世界(サービス)が世の中に受け入れられることをとても嬉しく思っています。ですがそれと同時に、この厳しい激動の時代を乗り切り、より大きな価値や便利さでお返ししないとなと思っているところです。またさらにリスクを取って、良いプロダクトとして還元できるよう頑張ります。

Make組ブログとしてサービス開発を中心にやってきたブログですが、そのままの姿勢で会社を続けられていることが何よりも嬉しいことです。

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

「Xで炎上したのだけ知ってる」という回数を減らしたい

「Xで炎上したのだけ知ってる」というとき、SNSで話題やトレンドだけ追いかけているのにその詳細はまったく知らないし興味もない、ということが多い。それを終わりにしたい。

パリオリンピック 2024が終わった。

僕はクライミングやり投げやレスリングなどを楽しく観ていたのだけど、Xを見るといつも炎上している印象すらあった。個人的にその温度差を感じてしまって、ちょっと怖かった。開会式の演出、選手村の冷房や食事、セーヌ川の汚れ具合、誤審など、問題が指摘されては荒れていた記憶がある。もちろんそれらに問題はあるのだろうけど、侃侃諤諤してる人ほど一番本質的な選手が競技してるさまを観ていないのが異様でもあった。

当該の話題を見ても「メニューにタンパク質が少なく、調理時間もかかる」という話が「あのイギリス人がパリオリンピックの料理を酷評」になっていたり、内容がアレンジされて伝わってる感もあった。そこまでちゃんと読んだとして、スポーツ観戦をして選手を応援することにはならないが、少なくとも記事の内容くらいは正しく理解したほうが良いと思う。もちろん「森選手がボルダー課題でスタートすらできなかった」のは僕も悔しい。でも彼女のリードクライミング決勝の素晴らしさを見ていないことのほうが惜しいと思う。メダルではない輝きがあった。

最近こういうことは多い。

僕もある。でも今回それを感じたという話。

少なくとも知らない話題であったり、本来は興味のない問題であれば論客ぶったり怒ったりする必要はない。現実にも端から急に話題に参加して知ったふうな口と結論を言って去っていく人がたまにいるが、あれにはなりたくない。とくにネットニュースとそれを元にしたツイートは質が低い。ネットニュースはまだ良いと思うけど、それを改行たっぷりにして歪曲して伝えるツイートとか、それへの引用RT、リプライなどはひどい。誰も何も分かってないのに、口から先だけで話して喧嘩してる。

なんだか寂しくもあった。子どものころ週刊誌やワイドショーを見てキレてる老人を見てあぁはなりたくないと思っていたが、そうなりつつある。あるある大事典に踊らされる親世代を笑っていた賢いネットの民が、今や同じ姿になっている。それが悲しい。

まず人として不自然だと思うし、論理的なふりして論理的でもないし、何よりダサいと思う。

それを今回とくに感じた。

なので好きなこと以外に食いついて話題にしないし、興味があればそれをきっかけにちゃんと触れることにする。自分のテリトリーを持って、自分がちゃんと興味あることをちゃんと楽しめるようにしたい。引退もしないしMastdonにも行かないけど、自分の中でトレンドを追わないとか気をつけようと思う。ニュースを知りたいなら日経新聞(あなたが信用できるメディア)を読もう。

「Xで炎上してたよね。普段よく知らないけど」と言わないようにしよう。

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

ガリが市営ジムに1年通って体重を7キロほど増やした

やったぜ!って話です。

もともと体重49kgの体脂肪率5%(誤差の範疇なので5%になる)だったのですが、今は56kgくらいに増やせました。

今が人生で一番健康だと思います。

僕は生まれてから30年間ずっと痩せてました。どうしても食えないし、太らないし…、と言うと「ズルい!」みたいな反応をもらいますが当人は真剣に悩んでいました。だってさ、すぐ風邪を引くし寒いし、貧血起こすし虚弱体質だったわけですよ。結構大変なんですよ。機能性ディスペプシアとか逆流性食道炎とかも患ってましたからね。

何度も体重を増やそうとしたもののうまくいかず、やっとうまくいったという話です。良かった。

週2ジム

まぁ何ていうか結局は運動が大事でした。

胃腸科のお医者さんに言われるたびに思いました、「ストレスを減らして運動しろってしか言えないのか!」って。「こちとらストレスと運動不足で稼いどんじゃい!」って、でも発想が逆なんですね、現代人が無駄にストレスを抱えて運動してないのが異常 ということです。運動しなきゃ!じゃなくて、椅子に16時間座ってるのが人類にとっておかしいということです(ハッザ族もよく歩くらしいですし)。

運動というとカロリーを消費するイメージがありますが、まず体力と食欲が必要なので意外にも運動が必要でした。昔、プールに通っていたこともあったのですが、そのときは太りにくかったので筋トレが良いと思います(逆に痩せたいならプールってめっちゃ良いと思う)。

ジム
1年ほど週2でジムに通い、しっかり筋トレをしました。友だちと「ダイエット」Discordチャンネルで励ましあいながら1年ジムに通っていました。まぁ、週2回のうち1回がプールだったり、宅トレだったりのときもあります。あんまり目標を設定しすぎると辛いので、無理しないってやつです。一応、Apple Watchと「俺の筋トレ記録」というアプリで計測しています。

だいたいベンチプレス、チンニングやラットプルダウン、レッグプレスなどの一般的な種目をやっていました。デッドリフトとスクワットは難しいのでやってません。基本はマシントレーニングにするのが、安全で良いと思います。でもベンチプレスは楽しいのでおすすめ。

ジムは市営のジムなので、1回150円のところか200円のところ。なので月に1200円ほどです(市営って良いですね)。ただそれゆえにモチベの管理が大変でした。市営ジムだと「高い金はらった!」って感覚がないので、個人の努力次第という感じ。

たったの週2回だけどがんばって続けたよ…。今は週1.5回くらいの怠けぶりですが、まだ続けています。

食べる

食べました。

始めたのが23年の4月くらいからで、計測は途中からですが線形回帰しています。

体重の推移

途中で落ちているのはインフルエンザになったときです。

結局は食べないと痩せるのはまじです。正直、ジムに通うよりもこっちのほうが大変。ただ食べられない人間が無理に食べると嫌になるものです。

ガリが太るポイントは以下です

  • 食事を抜かない
  • まじでちょっとずつで良いから増やす(おかわりとか、間食とか)
  • カロリー計算をしすぎない
  • 乳酸菌入りのエビオスを飲む

食事を抜かないなどもそうですが、なるべく小さくカロリーを稼ぐのが重要でした。「二郎食うぞ!」となるとそのさき数日体調を崩すので、いたって普通の食事をちょっと気持ち多めに食べました。筋トレしてるのもあり、食えるときは食えるようになってくるって感じです。

とはいえガリにとって 最初の数カ月は筋トレというかリハビリ です。まず健康的な人間になるために2、3ヶ月はかかった感じなので、焦りは禁物ということ。最初はモチベが高いので無駄に色々やったり頑張りすぎるけど、体が追いつかないからやめとけ。

あと意外にも痩せる人間ってカロリーに敏感だったりするんですよね。なので逆にあんまり気にせず、とりあえず食いたければ食うというのが良いと思います。僕もジムの帰りにビッグマックセットにマックフルーリーを足したりできるようになりましたが、とりあえず太るターンのときは食いたいだけ食うのが良いです。

ダーティバルク最高!

結果どうだったか

まじめな話、運動も食事も楽しくなったし、人生がだいぶ好転しました(ギラギラ輝く目)。というか以前は食事が義務的な感じで、楽しめる余裕が少なかったのですが、今は食事にもわりと興味を持てています。

あと外に出ても疲れにくいし、体の芯まで冷える感じがしないなど、今まで自分が「そういうもん」と思っていた不快感が改善しました。まるで老人の悩みが解決したみたいですが…。

とはいえ遺伝子には勝てない感じがあって「食えないものはいまだに食えない」感じがします。友人たちを見ていると今の僕以上に普通の感覚で食っていて、「あぁ、僕は努力してやっと普通の成人男性になれたんだ」と思いました。遺伝子ってすごいですね。

というわけで僕に「痩せてて良いですね」とちょっと皮肉っぽく言っていた人たち、僕はがんばって体重増やしましたし、「1年間、週2回ジムと本気でダイエット」はできたよ!と伝えたいです。体質の改善がどれだけ大変かは僕もよくわかります。一緒にがんばりましょう。

ぜひ 「脚太くなったね!」 とか「背中ぶ厚くなったね。背中の種目何やってる?」とか言ってくれたほうが嬉しいです。

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