AWS Batchの導入
AWS Batchはクラウド上でバッチコンピューティングのワークロードを実行する開発者をサポートする完全マネージドサービスです。このサービスの目的は、私たちがビジネスの制約に関するコードの作成に集中できるように、バッチジョブのためのインフラストラクチャを効果的に提供することです。
AWSで実行されるバッチジョブは基本的にDockerコンテナで、異なる環境で実行できます。AWS Batchは、EC2インスタンスにデプロイされたジョブキュー、Fargateを含むECSクラスター、Amazon EKS(Elastic Kubernetes Service)での実行をサポートします。私たちがインフラストラクチャの基盤として何を選ぶにせよ、必要なサービスのプロビジョニングとジョブのオーケストレーションはAWSによって管理されます。
AWS Batchのコンポーネント
AWS Batchのセールスポイントの一つはクラウド上でのバッチコンピューティングを簡素化することですが、多くのコンポーネントがあり、それぞれに独自の設定が必要です。AWS Batchサービスでジョブを実行するために必要なコンポーネントは以下の通りです:
ジョブ
ジョブは、AWS Batchキューに送信される作業の単位をラップするDockerコンテナです。ジョブは名前を持つことができ、ジョブ定義からパラメーターを受け取ることが可能です。
ジョブ定義
ジョブ定義はジョブがどのように実行されるべきかを指定します。ジョブ定義には以下が含まれることがあります:
- 他のAWSサービスへのアクセスを提供するIAMロール
- ジョブのメモリやCPU要件に関する情報
- 環境変数、コンテナプロパティ、追加ストレージのマウントポイントなど、ジョブに必要なその他のプロパティ
ジョブキュー
ジョブはジョブキューに送信されます。ジョブキューの役割はジョブをスケジュールし、計算環境で実行することです。ジョブは優先順位を持つことができ、複数の異なる計算環境で実行するためのスケジュールに基づいています。ジョブキュー自体がどのジョブを内外で先に実行するかを決めます。
計算環境
計算環境は基本的にECSクラスターです。それらにはコンテナ化されたバッチジョブに使用されるAmazon ECSコンテナインスタンスが含まれています。管理された計算環境と管理されていない計算環境の2種類があります:
- 管理された計算環境:AWS Batchがジョブに必要なキャパシティやEC2インスタンスタイプを決定します(EC2にジョブを実行することを決定した場合)。または、Fargate環境を使用することができ、AWSによって完全に管理されている私たちから隠されたインスタンス上でコンテナ化されたバッチジョブを実行します。
- 管理されていない計算環境:私たちが自身の計算リソースを管理します。それは計算環境がAWS ECSが必要とするAMI仕様を満たすAMIを使用していることが必要です。
マルチノードジョブとGPUジョブ
AWS Batchは、複数のEC2インスタンスにまたがるマルチノード並行ジョブをサポートしています。これは並列データ処理、高性能コンピューティングアプリケーション、機械学習モデルのトレーニングに使用できます。マルチノードジョブは管理された計算環境でのみ実行できます。
マルチノードジョブに加えて、EC2インスタンスにグラフィックカード(GPU)を搭載することが可能です。これは深層学習などの並列処理に依存する操作に便利です。
AWS BatchはEFAを使用するアプリケーションもサポートします。Elastic Fabric Adapter(EFA)はMessage Passing Interface(MPI)を使用する高性能コンピューティング(HPC)アプリケーションを高速化するためのネットワークデバイスです。さらに、並列コンピューティングのパフォーマンスをさらに向上させたい場合、EFA上に構築されたNVIDIA Collective Communication Library(NCCL)を通じて、直接のGPU間通信も可能です。
AWS Batch - いつ使うべきか?
AWS Batchは、実行に時間/メモリ/計算パワーを多く必要とするあらゆるタスクに推奨されます。これはあいまいな表現かもしれませんので、AWS Batchの使用例をいくつか見てみましょう:
- 高性能コンピューティング:大量のデータに対する使用分析タスクの実行、自動コンテンツレンダリング、トランスコーディングなど、多くの計算パワーを必要とするタスク。
- 機械学習:前述したように、AWS BatchはマルチノードジョブおよびGPUを搭載したジョブをサポートしており、これはMLモデルのトレーニングに不可欠です。
- ETL:AWS BatchをETL(抽出、変換、ロード)タスクに使用できます。
- 時間がかかる可能性のある他のあらゆるタスク(数時間から数日)
これらの使用例は魅力的かもしれませんが、AWS Batchが自分たちに適した選択肢かどうかを判断する前に慎重を期した方が良いでしょう。AWSは特化した使用事例に配置された他の製品群も提供しています。以下にその中のいくつかを見ていきましょう:
AWS Batch vs AWS Glue/Amazon EMR
上述したようにAWS BatchはETLジョブに使用できますが、別のサービスとしてAWS Glueを見るべき場合もあります。AWS GlueはETLジョブのために特別に開発された完全マネージドのソリューションです。これはサーバーレスオプションで、データ準備、データ統合、およびいくつかの他のサービスへの取り込みのための選択肢を提供しています。これはApache Sparkに依存しています。
同様に、Amazon EMRもペタバイト規模のデータ処理のためのETLソリューションで、Apache Spark、Apache Hive、Prestoなどのオープンソースフレームワークに依存しています。
私のおすすめは、Glue/EMRが依存している技術に自身が快適であればそれを使用することです。カスタムで自分たちによって構築したい場合はAWS Batchに固執することができます。
AWS Batch vs SageMaker
AWS Batchは機械学習にも使用できることも見てきました。これは本当ですが、それは機械学習を行う荒削りな方法です。AWSはSageMakerをデータサイエンス向けの機械学習に提供しています。SageMakerはGPUコンピューティングパワーによって強化される独自のジョブを実行できます。
SageMakerは機械学習関連のあらゆるものに関するワンストップショップですが、AWS Batchは長時間実行されるタスクを実行するためのサービスです。既に実装された機械学習モデルがあって、トレーニングを行うための計算パワーが必要なだけなら、AWS Batchを使用できますが、それ以外の場合はおそらく機械学習関連のあらゆることに関してSageMakerの方がずっと理にかなっています。
AWS Batch vs AWS Lambda
特定の一般的なタスクのために、シンプルなLambda関数が完全なバッチジョブよりも適切かもしれません。タスクがそれほど計算集約的ではない場合はAWS Lambdaを検討してください。AWS Lambdaは最大6vCPUコアと10GBのRAMを持つことができます。また、タスクが15分で完了可能かどうかがわかっている場合もです。
Lambdaの制限に準拠できるなら、私はLambdaを使用することを強くおすすめします。Lambdaは設定が非常に簡単で、動かす部品がはるかに少ないです。私たちはインフラストラクチャよりも実装の詳細に集中できます。
AWS Batchジョブの構築
以下のセクションでは、全体をまとめてAWS Batchジョブを一から構築します。このエクササイズのために、私たちが映画レンタルウェブサイトを持っていて、私たちの顧客に批評家からのレーティングで映画情報を提供したいとしましょう。バッチジョブの目的は、一定の間隔で映画評価のセットをDynamoDBテーブルにインポートすることです。
映画データセットに関しては、Kaggleから提供されるものを使用します。Kaggleの制約により、まずダウンロードしてからS3バケットにアップロードする必要があります。似たようなサービスを本番環境で実行している場合は、データセットを提供するプロバイダーに支払うことになります。Kaggleが自動ダウンロードの簡単な方法を提供していないため、私はまずデータセットをS3バケットに保存しました。
また、データサイズがそれほど大きくない可能性を考慮してバッチジョブを使用することが疑問視されるかもしれません。Lambda関数が同じ目標を達成するのに十分かもしれません。これは本当ですが、このエクササイズのためにはバッチに固執しましょう。
私たちが達成したいことの単純化されたアーキテクチャ図はここに表示されます:
バッチジョブの作成には、そのコンポーネントのいくつかのプロビジョニングが必要です。このエクササイズを再現可能にするために、インフラストラクチャのためにTerraformを使用します。AWSコンソールからも、またはCDKなどの他のIaCツールの使用でも同じステップを実行できますが、Terraformは私自身の好みです。
計算環境
私たちが作成する最初のバッチジョブのコンポーネントは計算環境です。私たちのバッチジョブはAWS Fargate上で実行される管理されたジョブです。計算環境のIaCコードは次のように記述できます:
リソースの定義
このリソース定義では、先に存在する必要があるいくつかの他のリソースが必要です。まず、計算環境にはサービスロールが必要です。Terraformのドキュментーションによると、サービスロールは「お客様に代わって他のAWSサービスへのコールをすることをAWS Batchに許可します」。ドキュメントを書いた人々に全ての敬意を表していますが、個人的にはこの説明では多くの情報を得られません。公平を期して、Terraformのドキュメントはこのサービスロールの例を提供しており、私たちはそれをプロジェクトで使用します:
リソースの定義
ここでは、AWSが提供するポリシーAWSBatchServiceRole
を持つロールを作成しています。さらに、AWS Batchがこのロールを想定することを許可する信頼ポリシーを作成しています。
おそらく、私たちの計算環境にとって重要なものはセキュリティグループとサブネットのリストです。AWSのネットワーキングインフラストラクチャの一部であるために、それらを結びつけます。セキュリティグループは
こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/aws-builders/an-introduction-to-aws-batch-2pei