簡単で効率的なAWS Batchをさらに活用する方法 #reinvent #CMP323

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

最近、ようやく触り始めたAWS Batchなのですが、元がエンプラ寄りの自分としては、面白いサービスなので気にっていろいろ触っています。最近、こんな記事も書きました(AWS Batchでシェルスクリプトを実行する典型的パターンのご紹介 | Developers.IO)。

そんなおり、re:Invent2017において、AWS Batchのセッションを受講したので、其の様子をお届けいたします。

CMP323 - AWS Batch: Easy and Efficient Batch Computing on AWS

セッション概要はこちら。

AWS Batch is a fully managed service that enables developers to easily and efficiently run batch computing workloads of any scale on AWS. AWS Batch automatically provisions the right quantity and type of compute resources needed to run your jobs. With AWS Batch, you don't need to install or manage batch computing software, so you can focus on analyzing results and solving problems.
In this session, the principal product manager for AWS Batch, Jamie Kinney, describes the core concepts behind AWS Batch and details of how the service functions.
The presenter then demonstrates the latest features of AWS Batch with relevant use cases and sample code before describing some of the upcoming features for the service. Finally, hear from AWS Batch customers as they describe why and how they are using AWS Batch. This portion of the talk is delivered by representatives from the University of Utah, Autodesk, and AdRoll.

re:Invent2017会期中に発表された、ジョブキューの配列実行などの新機能も網羅された、アツいセッションでした。AWS Batchの現在の姿を把握するには最高のセッションだったので、気になる方は、是非御覧ください。

 __
(祭) ∧ ∧
 Y  ( ゚Д゚)
 Φ[_ソ__y_l〉     Batchダ ワッショイ
    |_|_|
    し'´J

セッション内容の構成

今日のセッション内容を紹介する。

  • 最近のAWS Batchにおける更新内容
  • 今後のロードマップ
  • 世界における事例紹介
    • AdRoll
    • Base2 Genomics
    • Autodesk

AWS Batchとは?

最初に、AWS Batchについて、改めておさえておこう。

  • フルマネージド

    追加のソフトウェアは不要。AWS Batchが実行環境をすべてプロビジョニングし、必要に応じてスケールさせる

  • AWSによる実装

    AWSの関連サービス(S3,DynamoDB,Rekognition)などと、セキュアに連携できる

  • コスト最適化されたリソースのプロビジョニング

    ジョブの負荷に応じて、自動的にコンピュートリソースをプロビジョニングしてくれる

2017年の更新内容

利用できるリージョンが大幅に増えた。

  • カスタムAMIが利用できるようになった。以下のことができる。
    • EFS自動マウント
    • より大きく早いEBSの利用
    • GPU/FPGAドライバの利用
  • 新しいインスタンスタイプの利用もでいる
    • G3
    • F1
    • P3
    • C5

EC2スポットインスタンスを利用することで、秒単位の課金で、スケールアップ/スケールダウンが可能

また、以下の実装もされている

  • ジョブの自動リトライ
  • 予めスケジュールされたスループットの指定
  • CloudFormationのサポート
  • ジョブ状態の遷移の監視にCloudWatch Eventsが利用可能

(重要)ジョブ実行順序の制御方法拡張

ジョブは、その依存関係の設定により、他のジョブの後続ジョブとして起動させることができる。AWS Step Functionや他のワークフローシステムを利用することもできる。

ただ、ワークフローとジョブの依存関係は、このように複雑になりがちだ。

バッチ処理の処理方式としては、このようなレイアウトも考えられる。

API GatewayからStep Functionsを呼び出し、そこからLambdaを起動する。LambdaはAWS Batchを起動し、実際の処理はS3に格納したアプリケーションファイルで実行し、コンテナとして、ECRを利用する。

パラレルジョブの実行機能リリース!!

ここで、新機能「Array jobs」のお知らせだ!!

Array Jobs機能をつかえば、1万にもおよぶアプリケーションをジョブとして実行可能だ。Array Jobsは以下のユースケースで非常に有効だ。

  • パラメトリックスィープ
  • モンテカルロシミュレーション
  • 大量のコレクションを利用したオブジェクト

また、拡張された依存性モデルと、Job APIの実装も含んでいる。

Array Jobsを利用した拡張例。このように、各ジョブをレイヤーに分けて、それぞれのジョブのインスタンス環境を別々に定義しておき、最適化しておくことで、全体的なスループットを最大化できる。これは、非常にAWs Batchとして優位な点である。

2018年の機能拡張予定は以下の通り。

  • AWS Batchコンソールの大幅な機能拡張
  • CloudWatch Events経由でのAWS Batch jobsの自動起動
  • AWS Batch API コールのCloudTrail対応
  • 節約志向のリソース定義
  • ジョブタイプの追加
  • リージョン間でのジョブ定義

事例「AdRoll」

AdRoll社における、AWS Batchの利用例を紹介するぜ。

  • 2チームが本番環境で利用している
  • 120万ジョブが動作している
  • 30万を超えるインスタンスが稼働している
  • 1音ながり600CPUを消費している

じゃ、なぜ、うちがこんなにAWS Batchが好きなのか紹介しようじゃないか。

まずは、Dockerをサポートしていること。これは非常に重要で、柔軟に利用できる。

ワークフローのコンセプトは至ってシンプル。

  • コードはDockerイメージ内に格納する
  • アプリケーションの実行はDockerイメージに対して、コマンドライン引数を渡して実行する

弊社の場合、ジョブが非常に多いため、それに合わせて、非常に多数かつ巨大なインスタンスをモニタリングする必要がある。

また、秒単位課金となるスポットインスタンスの利用などで、非常にコスト効率が良い。

この後のスライドで、我々が実装しているAWS Batchのメカニズムを説明していく。この内容が、あなたのバッチジョブ構築の参考になれば幸いだ。

バッチジョブのモニタリング

1日に何千ものジョブを実行しているとしよう。これらのジョブをモニタリングする事は非常に重要だ。

モニタリングをマネジメントコンソールで実施するのは、悪くない選択肢だ。しかし、ジョブが何万にもなった時、ジョブの状態や特徴を素早く把握するのは難しい。

AdRollでは、独自のAWS Batchのモニタリングツールを利用している。それが、base2genomics/batchit: simple jobs submission via command-line for AWS batchだ。

我々は、できるだけシンプルにジョブを起動できるように、独自のPythonスクリプトを開発した。

バッチジョブのタイムアウトの扱い

AWS Batchは、タイムアウトを検知する仕組みがない。そのため、往々にして、ジョブがスタックする。そのため、ジョブを送信したときに、環境変数BATCH_TIMEOUTに、タイムスタンプを設定。

定期的にアクティブなジョブの環境変数を検知し、タイムアウト基準にヒットしたジョブは、停止している。

カスタムAMIの利用など、その他のTIPS

我々は、AWS Batchジョブ用にカスタムAMIを利用している。我々の幾つかのジョブは、i3インスタンスに最適化されており、NVMe SSDを最大まで活用する。

本番環境とステージング環境のジョブパイプラインは、完全に分離されている。

我々のジョブは、完全にインスタンスタイプに最適化されており、新しいジョブがキューに登録されたタイミングで、特定種類のインスタンスタイプを利用するように構築されている。

AWS Batch導入時の注意点

最初はシンプルに。複雑なジョブを最初から投入するべきではない。

AWS Batchの利用を徐々に拡大させていくと決めた場合、そのジョブのモニタリングとデバッグについて必ず考慮する必要がある。何万ものコンテナーを利用し始めた時、トラブルは必ず発生する。

また、もし、スポットインスタンスが利用できるのであれば、利用コストを削減できる可能性がある!

Simple Workflow Serviceについて

それは、ステートマシンだ。

Amazon SWFは、開発者に、ビルド、実行、バックグラウンドジョブのスケールについての手段を提供する。Amazon SWFを、フルマネージドの状態遷移トラッカーとして利用し、タスク制御コーディネーターとして利用することを検討して欲しい。

重要なリンクの一覧

最後に重要なリンクを紹介しておく。みんな、セッション後にも参照してくれよな!

濱田まとめ「AWS Batchのより深いユースケースを確認できた」

自分は、最近AWS Batchを利用し始めたのですが、使いこなしのために覚えておくべき事項が多く、なかなか最初は苦労した思い出があります。

まだ、AWSの歴史の中では歴史が新しいサービスであるため、ユースケースを参照するのが難しかったのですが、STEP Functionsとの連携や、ジョブの最適化、巨大なジョブを管理する時の勘所など、より実運用で必要になってくるノウハウが多数あったので、有意義なセッションでした。

ぜひ皆さんも、AWS Batch、使ってみてください!

それでは、今日はこのへんで。濱田でした。