AWS Batch で実現する大規模バッチ処理 - ジョブキュー設計とコスト最適化
AWS Batch のジョブキュー設計、Fargate と EC2 コンピューティング環境の選定、スポットインスタンス活用によるコスト最適化を解説します。
AWS Batch の仕組みとユースケース
AWS Batch はコンテナベースのバッチ処理を自動的にスケジュール・実行するサービスです。ジョブ定義 (Docker イメージ、vCPU、メモリ、環境変数)、ジョブキュー (優先度付きのキュー)、コンピューティング環境 (Fargate または EC2) の 3 つのコンポーネントで構成されます。ジョブをキューに投入すると、Batch がコンピューティングリソースを自動的にプロビジョニングし、ジョブを実行し、完了後にリソースを解放します。ゲノム解析、金融リスク計算、動画エンコーディング、機械学習のハイパーパラメータチューニングなど、大量の計算リソースを一時的に必要とするワークロードに最適です。
この分野について体系的に学びたい方は、関連書籍 (Amazon) も参考になります。
Fargate と EC2 コンピューティング環境の選定
Fargate コンピューティング環境はインスタンスの管理が完全に不要で、ジョブごとに vCPU (最大 16) とメモリ (最大 120 GiB) を指定するだけです。ジョブの起動時間は数十秒で、短時間のジョブや中規模のバッチ処理に適しています。EC2 コンピューティング環境はインスタンスタイプの指定、GPU インスタンスの利用、マルチノード並列ジョブの実行が可能です。大規模な HPC ワークロードや GPU を使用する機械学習推論には EC2 を選択します。EC2 環境ではスポットインスタンスを活用でき、中断耐性のあるジョブであればオンデマンドの最大 90% 引きで実行できます。Batch はスポットの中断時にジョブを自動的にリトライする機能を備えています。
ジョブキュー設計と依存関係
ジョブキューには優先度を設定でき、高優先度のキューのジョブが先にスケジュールされます。本番ジョブ用の高優先度キューと開発・テスト用の低優先度キューを分離し、本番ジョブが常に優先的にリソースを確保できる設計が一般的です。ジョブの依存関係は dependsOn パラメータで定義します。前段のデータ前処理ジョブが完了してから本処理ジョブを実行し、最後に後処理ジョブを実行するといった DAG 構造を構築できます。配列ジョブは同一のジョブ定義を指定した数 (最大 10,000) だけ並列実行する機能で、各タスクには 0 から始まるインデックスが割り当てられます。インデックスを使って入力データを分割し、大規模データセットの並列処理を実現します。
さらに詳しく知りたい方は、関連書籍 (Amazon) で理解を深められます。
まとめ
AWS Batch はバッチ処理のインフラ管理を自動化し、ジョブの投入に集中できるサービスです。Fargate で手軽に始め、GPU やスポットインスタンスが必要になったら EC2 環境に拡張する段階的なアプローチが有効です。ジョブの依存関係と配列ジョブを組み合わせることで、複雑な計算パイプラインを効率的に実行できます。
AWS の優位点
- ジョブの依存関係を定義して DAG (有向非巡回グラフ) 構造のワークフローを構築でき、前段ジョブの完了を待って後段ジョブを自動実行する
- Fargate コンピューティング環境ではインスタンス管理が不要で、ジョブごとに必要な vCPU とメモリを指定するだけで実行環境が自動プロビジョニングされる
- EC2 スポットインスタンスとの統合で、オンデマンドと比較して最大 90% のコスト削減を実現できる
- 配列ジョブで同一ジョブ定義を数千の並列タスクに展開し、パラメトリックスイープやモンテカルロシミュレーションを効率的に実行できる
- マルチノード並列ジョブで複数インスタンスにまたがる MPI ワークロードを実行でき、HPC 用途にも対応する