Amazon Web Services ブログ

Amazon ECS Anywhere における GPU ベースのコンテナアプリケーション実行

この記事は、Running GPU-based container applications with Amazon ECS Anywhere (2021/10/08 投稿) を翻訳したものです。

過去 10 年間で、数万ものお客様がオンプレミスのワークロードをクラウドに移行しています。一方で、単純にクラウドへ移行できないワークロードも数多く見てきました。それどころか、それらのワークロードは、データの保持要件やネットワークレイテンシー、規則やコンプライアンスなどの考慮事項により、オンプレミスで実行される必要があります。

2021 年 5 月、Amazon Elastic Container Service (Amazon ECS) は、お客様がコンテナ化されたアプリケーションをオンプレミスで実行および管理するための簡素化された方法として、前述のユースケースを解決するための新機能である Amazon ECS Anywhere (ECS Anywhere) を一般公開しました。ECS Anywhere は、既存の起動タイプである EC2 および FARGATE に加えて、“EXTERNAL” という新しいコンテナ起動タイプを ECS に追加しました。この新機能により、お客様は自身でコンテナオーケストレーターを実行および管理することなく、AWS リージョン上の Amazon ECS API を使用してお客様の所有するコンピューティングハードウェアでコンテナを実行できます。

ECS Anywhere で GPU ベースのワークロードが可能に

Amazon ECS および ECS Anywhere は、お客様が自身の所有するハードウェアを容易に活用し、ハイブリッド環境にまたがってコンテナを使用して課題を解決することを可能にしますが、データセンターで GPU ベースのコンテナワークロードを実行するためには、ECS Anywhere 以外の別の方法が必要でした。本日、Amazon ECS Anywhere が GPU ベースのワークロードのサポートを開始しました。これにより、お客様は AWS リージョンの Amazon ECS と一貫性のあるエクスペリエンスで、GPU ベースのコンテナワークロードを実行できます。

現在、GPU は機械学習だけでなく、3D 視覚化や画像処理、ビッグデータワークロードなどさまざまな分野で広く利用されています。Amazon ECS Anywhere の GPU サポートにより、データをクラウドに転送したり、GPU ワークロードのために自身でコンテナオーケストレーターを運用することなく、自身のデータセンターでコンテナを使用した GPU ワークロードを簡単に実行、管理できるようになります。また、オンプレミスの GPU に多額の投資を行なっているお客様は、ECS Anywhere を活用することで、既存の GPU 資産を活用し Docker Swarm や Kubernetes などの現行ツールでの運用上のオーバーヘッドを取り除くことができます。

ウォークスルー: ECS Anywhere の GPU サポート

新しい ECS Anywhere の機能について、順を追って簡単に説明します。はじめに、1) 外部インスタンスの登録コマンドを取得し、続いて 2) GPU デバイスを備えたマシンを既存の Amazon ECS クラスターに登録します。次に、3) シンプルな Amazon ECS タスク定義を登録し、最後に 4) Amazon ECS API を利用して外部マシンで Amazon ECS タスクを実行します。

以下のステップでは “ecsAnywhere-gpu” という名前の空の Amazon ECS クラスターを使用していますが、もちろん既にワークロードが実行されている既存の ECS クラスターを利用して手順を実行することもできます。

1. 外部インスタンスのための登録コマンドを取得

以下のスクリーンショットで示されるように、現時点ではこの Amazon ECS クラスターには ECS コンテナインスタンスが登録されていません。Amazon ECS クラスターに外部インスタンスを登録するために、はじめに External インスタンスの登録 を選択します。

下記の図のようなダイアログが表示されます。下線が引かれた インスタンスロール “ecsExternalInstanceRole” は、ECS Anywhere のドキュメントの手順に基づいて事前に作成しておいた外部インスタンス用の IAM ロールです。次の手順に進む前に、この IAM ロールが作成済みであることを確認してください。

ここでは、アクティベーションキーの有効期間インスタンス数 についてデフォルト値を利用しますが、必要に応じてこれらの値を変更できます。詳細は、ECS Anywhere のドキュメントを確認してください。

次のステップ を選択すると、次の画面で外部インスタンスの登録コマンドを取得できます。このコマンドを外部インスタンスで実行し、Amazon ECS クラスターに登録します。

ダイアログウィンドウに表示された登録コマンドを コピー し、テキストエディタに貼り付けて次のように --enable-gpu フラグを登録コマンドの最後に追加します。次の手順に進む前に、ECS マネジメントコンソールで 完了 を選択してダイアログウィンドウを閉じることができます。

# 注意: 可読性のために、コマンドに改行を追加しています
curl --proto "https" \
  -o "/tmp/ecs-anywhere-install.sh" "https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh" \
  && bash /tmp/ecs-anywhere-install.sh \
    --region "us-east-1" \
    --cluster "ecsAnywhere-gpu" \
    --activation-id "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx" \
    --activation-code "XXXXxxxxXXXXxxxxXXXX" \
    --enable-gpu # このフラグを追加

2. 外部マシンで登録コマンドを実行

外部マシンのシェルに入ったら、前のステップで編集した登録コマンドを root として実行します。マシンが自動的にセットアップおよび登録され、ECS マネジメントコンソールで外部インスタンスとして表示されます。

数分後、以下のようにコマンド出力で “You can check your ECS cluster here <ECS Console URL>” と表示されます。コマンドが失敗する場合は、ECS Anywhere のドキュメントでネットワーク要件サポートされているオペレーティングシステムを確認してください。また、Amazon ECS および ECS Anywhere は、現時点では Amazon ECS タスクをスケジュールするための Nvidia カーネルドライバーと Docker GPU ランタイムをサポートしています。これらの必要なコンポーネントを外部マシンにインストールして構成するためには、Nvidia のガイド (これは、例えば Tesla 用です) を確認してください。

URL を開いて、Amazon ECS クラスターで何が起きているのかを確認しましょう。

なんということでしょう!これで Amazon ECS は、Amazon ECS クラスターが Amazon ECS タスクを実行するためのキャパシティとして、外部 GPU マシンを識別します 🙌

3. サンプルの Amazon ECS タスク定義を登録

Amazon ECS タスクを実行する前の最後のステップは、次のようなサンプルの Amazon ECS タスク定義を登録することです。ご覧のように、これからデプロイする Amazon ECS タスクは nvidia/cuda コンテナイメージを利用し、よく知られた nvidia-smi コマンド (これは、シンプルにマシンの GPU 情報を表示してすぐに終了します) を実行して、タスクが外部マシンの GPU デバイスを利用していることを確認します。

{
  "containerDefinitions": [
    {
      "memory": 200,
      "essential": true,
      "name": "cuda",
      "image": "nvidia/cuda:11.0-base",
      "resourceRequirements": [{
        "type":"GPU",
        "value": "1"
      }],
      "command": [
        "sh", "-c", "nvidia-smi"
      ],
      "cpu": 100
    }
  ],
  "family": "example-ecs-anywhere-gpu"
}

ECS マネジメントコンソールでタスク定義のウィンドウを開き、新しいタスク定義の作成 を選択して上記の JSON を登録します。

EXTERNAL を選択し、次のステップ を選択します。

次のウィンドウで画面を一番下までスクロールし、JSON による設定 を選択すると、JSON でこのタスク定義を直接構成するためのダイアログウィンドウが表示されます。

このセクションで前述した Amazon ECS タスク定義の JOSN を貼り付け、右下の 保存 を選択します。

次に、作成 を選択して Amazon ECS タスク定義を登録します。ウィンドウの上部に “タスク定義が正常に作成されました” というメッセージが表示されます。

4. 外部インスタンスで GPU ベースの Amazon ECS タスクを実行

これで、外部インスタンスで最初の GPU ベースの Amazon ECS タスクを実行する準備が整いました。ECS マネジメントコンソールのサイドバーから クラスター を選択し、クラスターのリストからウォークスルーに利用している Amazon ECS クラスターを選択します。

クラスター画面で、タスク タブを選択して 新しいタスクの実行 を選択します。

次のウィンドウで、起動タイプに EXTERNAL を選択し、前のステップで登録したタスク定義 “example-ecs-anywhere-gpu” が選択されていることを確認します。ウィンドウの右下にある タスクの実行 を選択します。

Amazon ECS クラスターのウィンドウにリダイレクトされます。下記のスクリーンショットが示すように、外部インスタンスにスケジュールされた Amazon ECS タスクが 1 つあることを確認できます。

上のスクリーンショットで強調されている タスク ID (この例の場合、d2e6e7…) を選択し、Amazon ECS タスクの詳細を確認します。タスク詳細のウィンドウを開いた時点では PENDING と表示される場合がありますが、すぐに RUNNING そして STOPPED と更新されます。以下に示すように、コンテナが nvidia-smi コマンドを正常に実行し、終了コード “0” で終了したことも確認できます。

nvidia-smi コマンドの実際の出力を確認する場合、外部インスタンスで docker ps -a を実行してコンテナ ID を確認し、docker logs <container ID> を実行して下記のようにコンテナログとして出力を確認します。また、本番ワークロードでは、外部インスタンスに SSH で接続する代わりに、Amazon ECS タスク実行 IAM ロールawslogs ログドライバーなどを Amazon ECS タスク用に構成し、AWS リージョンでコンテナログを収集して表示することも可能です。

まとめ

ECS Anywhere でオンプレミスのサーバーをクラスターのキャパシティとして登録することで、AWS リージョンの Amazon ECS クラスターを自身のデータセンターに拡張することができます。これにより、既存の Amazon ECS API と AWS 上のフルマネージドなコントロールプレーンを利用して、外部キャパシティでコンテナを実行できます。データセンターでコンテナを実行するためだけに、自身でコンテナオーケストレーターを実行したり管理する必要はありません。今回、ECS Anywhere の GPU サポートにより、GPU ワークロードにもこれが当てはまるようになりました。

次のステップとして、ECS Anywhere ワークショップを試してみることをお勧めします。手元のラップトップなどで Vagrant を使用して仮想マシンを作成するところから始まり、ECS Anywhere が水面下でどのように機能しているかの理解や、コンテナをデプロイするための CI/CD パイプラインの構築、さまざまな AWS サービスとのワークロードにおける可観測性の獲得など、ECS Anywhere ワークロードのライフサイクル全体を学ぶことができます。このワークショップに加えて、以下のリンクも ECS Anywhere の詳細を学ぶ際にとても役に立ちます。

最後に、いつものように AWS コンテナサービスのロードマップについて、皆さまからのご意見を Containers Roadmap GitHub repository でお待ちしています。新しい GitHub issue を自由に作成し、既存の GitHub issue にコメントを追加して、皆さまのアイデアやユースケースをお知らせください!

– シニアプロダクトデベロッパーアドボケイト Tori Hara

翻訳は、ソリューションアーキテクトの落水 (おちみず) が担当しました。原文はこちらです。