どすえのブログ

ソフトウェア開発ブログ

Amazon ECSタスクでのGPUの使用

ECSでGPUを使う機会があったので、やり方をメモする。 2022.09.22時点ではFargateがGPUに未対応だったため、ECSをEC2(GPU)上に展開する方針をとった。 (このIssueを見ると、まもなくFargateがGPUに対応しそう。)

ポイントは

  • ECSに最適化されたAMIを使うこと
  • クラスタ作成時に「EC2 Linux + ネットワーキング」を選択して、EC2を自動で立ち上げてもらうこと

なお、本作業にあたってこちらのブログを大変参考にさせていただいた。以下の内容の大部分がこの記事と同じものになってしまったが、EC2をECSへ紐づける方法が異なる。

タスクの定義

ECS管理画面のタスク定義に行き、新しい定義の作成をクリックする。

  • 起動タイプの互換性の選択ではEC2を選択
  • 各項目を次のように入力する。
項目
タスク定義名 ecs-gpu-test-task-def
ネットワークモード awsvpc
タスク実行ロール なし
タスクメモリ (MiB) 512
タスク CPU (単位) 512

コンテナの追加

グループ 項目
スタンダード コンテナ名 ecs-gpu-test-container
イメージ nvidia/cuda:9.0-base
プライベートレジストリの認証 チェックなし
メモリ制限 (MiB) ソフト制限 512
ポートマッピング 入力なし
環境 CPU ユニット数 512
GPU 1
基本 チェックあり
エントリポイント 入力なし
コマンド sh,-c,nvidia-smi
作業ディレクトリ 入力なし
環境ファイル 入力なし
ストレージとログ ログ設定 チェックあり

ECSクラスターの作成

ECS管理画面のクラスターに行き、クラスターの作成をクリックする。

  • クラスターテンプレートの選択でEC2 Linux + ネットワーキングを選択する
グループ 項目
クラスターの設定 クラスター名 ecs-gpu-test-cluster
インスタンスの設定 プロビジョニングモデル オンデマンドインスタンス
EC2 インスタンスタイプ g4dn.xlarge
インスタンス数 1
EC2 AMI ID デフォルトでセットされたものを使用
データ EBS ボリュームサイズ (GiB) 22
キーペア 作成を推奨
ネットワーキング VPC 新しいVPCの作成
CIDRブロック 10.0.0.0/16
サブネット1 10.0.0.0/24
サブネット2 10.0.1.0/24
セキュリティグループのインバウンドルール 0.0.0.0/0, 80
コンテナインスタンスの IAM ロール 新しいロールを作成

クラスターを作成すると、ECSを展開するためのEC2が起動する。起動したEC2はEC2管理画面から確認できる。

またある程度時間が経過すると、クラスターにEC2が紐付き、ECSインスタンスとして以下のように表示される。

ECSタスクの実行

各項目を以下のように入力する。

項目
起動タイプ EC2
タスク定義 ecs-gpu-test-task-def
クラスター ecs-gpu-test-cluster
タスクの数 1
クラスターVPC 10.0.0.0/16
サブネット どちらか選択できるほう(GPUの場合、タスクの起動に失敗するAZがあるので注意)
セキュリティグループ そのまま
パブリック IP の自動割り当て DISABLED
配置テンプレート AZバランススプレッド

タスクの実行をクリックし、タスクを起動する。今回はシェルコマンドを実行するのみのタスクなので、即座にタスクが停止する。ステータスがSTOPPEDになったタスクから、今回実行したタスクをクリックするとコンテナ欄で以下のように表示されているはず。

CloudWatchのログを表示をクリックすると、タスク実行時のログが表示される。以下のようにログが表示されていれば、タスクの実行およびNvidiaドライバーによるGPUの認識に成功している。

まとめ

  • ECSをGPUで展開するには2022/10月時点ではECS on EC2しか手が無い。
  • ECSクラスター作成時にEC2 Linux + ネットワーキングを選択することで、簡単にEC2をECSに紐づけることができた。
  • 今回は簡単のためにVPCをクラスター作成時に自動作成してもらう方法をとったが、実運用時にはPrivateなセグメントを用意して、そこにECSサービスを配置するように注意されたい。

参考