まとめ
- 使うべきサービスは AWS Batch
- GPUあり/なしで挙動が変わるライブラリに注意
- DockerHubにGPUあり版のイメージがある場合はそれをbaseにすると楽
- 例: PyTorch
背景
- 以下の要件を満たすシステムをAWS上に組みたい
- 毎日/毎週1回のみ動かし、他の時間は課金しないで欲しい
- スポットインスタンスが使えると嬉しい
- GPUは必須
- 例: https://zenn.dev/miyatsuki/articles/0d66daf6615962
- それができそうなサービスがいろいろあるがどれを使えばいいのかよくわからない
- Fargate
- ECS
- SageMaker
- AWS Batch (採用)
なぜAWS Batch?
- Fargate
- GPUが使えないのでNG
- CPUだけなら、Fargateでもいいと思います
- ECS
- GPUインスタンスを立ち上げ続ける必要があるのでNG
- SageMaker
- (サービスがありすぎてよくわからない。。。)
- AWS Batch
- 特定時間のみ起動して終わったらインスタンスを閉じてくれる
- スポットインスタンスも使える
- GPUインスタンスも使える
AWS Batchの使い方
- ECR (Elastic Container Registory) に動かしたいコンテナのイメージをpushする
- AWS Batchのコンピューティング環境を作る
- マネージド型を選択
- インスタンスの設定 -> スポット
- オンデマンド料金 -> 予算をみて適当に設定。50%だとそんなに待たされることはなかったです。
- 許可されたインスタンスタイプ -> GPUが使えるインスタンスを選択。g4dn.xlargeが最安なので、これから様子をみてみるのも良いかもしれません
- EC2設定のイメージタイプ -> Amazon Linux 2 (GPU)
- AWS Batchのジョブキューを作る
- コンピューティング環境は2.で作った物を選ぶ
- AWS Batchのジョブ定義を作る
- プラットフォーム -> EC2
- イメージ -> 1でpushしたもの
- コマンド -> バッチで実行したい物をCMDの引数として使えるように書く。元のイメージのCMDは上書きされるので、イメージ側に記載している場合でも改めて設定が必要
- メモリ -> 2GBで足りない場合は増やす
- GPUの数 -> 1
- AWS Batchのジョブを投げる
- ジョブ画面から新しいジョブを作成をクリック
- ジョブ定義とジョブキューは4と3で作った物を選択
- 最後の送信を押すと、ジョブがsubmitされる
- AWS Batchのジョブ実行を見守る
- ダッシュボード画面からジョブの実行状況が見られるので見守る
コンテナイメージについて
コンテナ側がGPU Readyになっていても、イメージファイル内のソフトウェアがGPU対応してないと、結局CPUで動作してしまう。個人的に注意すべきと思う点は下記。
- pip installした際に、PCの状況をみてGPUなし版を入れてくるライブラリがある
- PyTorchなど
- このようなライブラリのGPU版が必要な場合は、DockerHubからGPU版が入ったイメージをpullしてくると楽