[AWS/EC2/ARM/GPU]G5gインスタンスをインフラとしたECSを構築する
Opt Fitエンジニアの@KAZYPinkSaurusです。
AWS EC2のG5gインスタンスは2021年末に使えるようになりました。
当インスタンスはArm系のCPUなのですが、GPUが使えてかつコストパフォーマンスも良いという噂なので最近触ってみています。
全く同じスペックではないので単純な比較はできませんが、どちらもNVIDIAのGPUが使えてg4dn.xlargeが東京リージョンでオンデマンド時間あたり0.71 USD
に対してg5g.xlargeは0.5669 USD
といった具合です。
追記(2022/10/30)
記事の中で
G5gインスタンスをECSから利用したいと考えたが、Amazon ECS GPU に最適化されたAMIが見つかりませんでした
と書いていたため本記事を作成したのですがBottlerocketというAWSが構築しているOSを使ったコンテナ向けのAMIが提供されていることを教えてもらいました。
こちらを利用すれば良さそうです。
ちなみにBottolerocketとはAWSによると
Bottlerocketはセキュリティとメンテナンス性を重視し、コンテナベースのワークロードをホスティングするための信頼性と一貫性のある Linux ディストリビューションを提供するオープンソースプロジェクトです。
とのことです。
概要
G5gインスタンスでECSを使うためにECSコンテナエージェントをインストールしたAMIを作成します。
そしてECSからnvidia-smiコマンドが実行できることを確認します。
対象読者
G5gインスタンスをECSから使用したい方。ただしECSコンテナエージェント導入部分に絞って説明します[1]。
ECSでEC2を構築する方法については以下で紹介しています。
今回作成したインスタンスをAMI化して起動テンプレートに指定するとECSのインフラストラクチャとして利用できます。
背景
G5gインスタンスをECSから利用したいと考えたが、Amazon ECS GPU に最適化されたAMIが見つかりませんでした[2]。そのため自前でAMIを作成することとしました。
G5gインスタンスとは
AWS Graviton2プロセッサとNVIDIA T4G Tensor Core GPUを搭載際したインスタンスです。
詳しくは以下をご覧ください。
Graviton2は性能面でも評判が良さそうなので期待は高まります。
ECSコンテナエージェントとは
コンテナインスタンスをクラスターに接続するためのソフトウェアです。
EC2インスタンス(または外部インスタンス)にインストールして起動するとECSクラスター内でのインフラストラクチャとして使えるようになります。
Amazon ECSに最適化されたAMIでははじめからコンテナエージェントがインストールされているため、あまり意識していなくてもECS上でEC2インスタンスを運用できるようになっています。
ECSコンテナエージェントのインストール方法
2つの方法が見つかりました。
1つ目は以下のドキュメントにあるdebファイル経由での方法で
もう一つは以下のECSコンテナエージェントのGitHubにあるDocker runで行う方法です。
どちらでも動作させられることは確認しましたが、今回は前者のdebファイルを経由の方法を紹介します。[3]
EC2作成
まずAMIの元になるEC2をAWS CLIで作成していきます。
GPUが使いたいのでCUDAとNvidia DockerがインストールされているDeep Learning AMI Graviton GPU CUDA 11.4.2 (Ubuntu 20.04) 20211119
のAMIを使います。
インスタンスタイプはg5g.xlarge
です。
$ aws ec2 run-instances \
--image-id ami-0687c2f36741b8ca6 \ # Deep Learning AMI Graviton GPU CUDA 11.4.2 (Ubuntu 20.04) 20211119
--count 1 \
--instance-type g5g.xlarge \
--associate-public-ip-address \
--key-name XXXXXXXXXXXXXX \
--security-group-ids sg-XXXXXXXXXX \
--subnet-id subnet-XXXXXXXXXXX \
--iam-instance-profile Name="ecsInstanceRole" \ # ECSとして利用するために必要な権限が入っているロール
--tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=5g5-ecs}]" # 任意EC2インスタンスにNameタグを付与
ECSコンテナエージェントをインストールする
こちらのドキュメント通りインストールしていきます。
私はアジアパシフィック (東京)を利用したのでURLがap-northeast-1になっています。
$ curl -O https://s3.ap-northeast-1.amazonaws.com/amazon-ecs-agent-ap-northeast-1/amazon-ecs-init-latest.arm64.deb
$ sudo dpkg -i amazon-ecs-init-latest.arm64.deb
設定ファイル作成
設定ファイルを作成します。
ここでは空にしておきます。
$ sudo mkdir -p /etc/ecs/
$ sudo touch /etc/ecs/ecs.config
AMI作成
ここまででAMI作成までの設定は以上となります。
この状態でAMIを作成しましょう。
アクション>イメージとテンプレート>イメージを作成
と選べばAMIが作成できます。
一つ注意点があるのですがecs-agentは状態を保持するのでAMI化する前にコンテナエージェントを起動させてしまったときは以下を実行しておきましょう。
rm -f /var/lib/ecs/data/*
rm -f /var/log/ecs/*
設定ファイル記述
先程からのファイルで作った設定ファイルに設定を書き込んでいきましょう。
GPUサポートのオプションはデフォルトでFalseになっているのでTrueにしましょう。
これでGPUが使えるようになります。
$ echo "ECS_ENABLE_GPU_SUPPORT=true" | sudo tee -a /etc/ecs/ecs.config
次にEC2を利用するクラスター名を設定しましょう。
今回はdefaultクラスターに設定します。
$ echo "ECS_CLUSTER=default" | sudo tee -a /etc/ecs/ecs.config
ECSコンテナエージェント起動
起動します。
sudo systemctl start ecs
起動したてだとhealthがstartingとなっています。
~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47009fd6bdf7 amazon/amazon-ecs-agent:latest "/agent" 16 seconds ago Up 11 seconds (health: starting) ecs-agent
数十秒程度待っているとhealthyになります。
こちらでECSコンテナエージェントの起動は完了です。
~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47009fd6bdf7 amazon/amazon-ecs-agent:latest "/agent" 58 seconds ago Up 53 seconds (healthy) ecs-agent
コンソールからクラスターを見るとコンテナインスタンスというところに作成したEC2インスタンスが現れていればOKです。
作成したAMIをECSから呼び出しGPU動作を確認する
GPUを利用するタスクを起動させてみます。
以下のようなnvidia-smiだけをする簡単なタスク定義を作成し実行してみます。
{
︙略
"containerDefinitions": [
{
"image": "nvidia/cuda:11.4.0-base-ubuntu20.04",
"resourceRequirements": [
{
"type":"GPU",
"value": "1"
}
],
"command": [
"sh",
"-c",
"nvidia-smi"
],
}
],
︙略
}
かなり見にくくて申し訳ないですがGPUが、認識されていることが確認できました。
余談
G5gをnortheast-1aで起動しようとすると枯渇気味なのかよくエラーが出てcやdを使うよう促されました。
さいごに
ECS agentを自分で入れている人の情報がかなり少ないと感じました。
私もこれまでECSに最適化されたAMIしか使っていなかったので勉強になりました。
それではまた。
参考
🔔採用情報
ジム施設向けDXソリューションGYMDXではエンジニアを積極採用中です。
ジュニア層のエンジニアからリーダー職まで幅広く募集しています。
2022年7月にプレシリーズAラウンドにて資金調達を実施しました。
リードエンジニア
バックエンドエンジニア
Discussion