🦖

[AWS/EC2/ARM/GPU]G5gインスタンスをインフラとしたECSを構築する

2022/10/17に公開

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 ディストリビューションを提供するオープンソースプロジェクトです。

とのことです。

https://aws.amazon.com/jp/blogs/news/getting-started-with-bottlerocket-and-amazon-ecs/

概要

G5gインスタンスでECSを使うためにECSコンテナエージェントをインストールしたAMIを作成します。
そしてECSからnvidia-smiコマンドが実行できることを確認します。

対象読者

G5gインスタンスをECSから使用したい方。ただしECSコンテナエージェント導入部分に絞って説明します[1]

ECSでEC2を構築する方法については以下で紹介しています。
今回作成したインスタンスをAMI化して起動テンプレートに指定するとECSのインフラストラクチャとして利用できます。

https://zenn.dev/optfit/articles/df7b0b84487a41

背景

G5gインスタンスをECSから利用したいと考えたが、Amazon ECS GPU に最適化されたAMIが見つかりませんでした[2]。そのため自前でAMIを作成することとしました。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-optimized_AMI.html

G5gインスタンスとは

AWS Graviton2プロセッサとNVIDIA T4G Tensor Core GPUを搭載際したインスタンスです。

詳しくは以下をご覧ください。
https://aws.amazon.com/jp/blogs/news/new-amazon-ec2-g5g-instances-powered-by-aws-graviton2-processors-and-nvidia-t4g-tensor-core-gpus/

Graviton2は性能面でも評判が良さそうなので期待は高まります。

https://www.m3tech.blog/entry/2021/12/13/110318

https://developers.cyberagent.co.jp/blog/archives/27782/

ECSコンテナエージェントとは

コンテナインスタンスをクラスターに接続するためのソフトウェアです。
EC2インスタンス(または外部インスタンス)にインストールして起動するとECSクラスター内でのインフラストラクチャとして使えるようになります。
Amazon ECSに最適化されたAMIでははじめからコンテナエージェントがインストールされているため、あまり意識していなくてもECS上でEC2インスタンスを運用できるようになっています。

ECSコンテナエージェントのインストール方法

2つの方法が見つかりました。
1つ目は以下のドキュメントにあるdebファイル経由での方法で

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-agent-install.html

もう一つは以下のECSコンテナエージェントのGitHubにあるDocker runで行う方法です。

https://github.com/aws/amazon-ecs-agent

どちらでも動作させられることは確認しましたが、今回は前者の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しか使っていなかったので勉強になりました。

それではまた。

参考

https://devcloud.co.za/how-to-use-arm-based-gpu-ec2-instances-as-ecs-container-instances/
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-agent-config.html
https://medium.com/codex/deep-learning-setup-ecs-gpu-task-on-ubuntu-part-4-46c364d1b556
https://devcloud.co.za/how-to-use-arm-based-gpu-ec2-instances-as-ecs-container-instances/

🔔採用情報

ジム施設向けDXソリューションGYMDXではエンジニアを積極採用中です。
ジュニア層のエンジニアからリーダー職まで幅広く募集しています。

2022年7月にプレシリーズAラウンドにて資金調達を実施しました。
https://prtimes.jp/main/html/rd/p/000000015.000055404.html

リードエンジニア

https://herp.careers/v1/optfit/GpvSeC-fA995

バックエンドエンジニア

https://herp.careers/v1/optfit/KsDmlZ1VhTmU

脚注
  1. タイトルはG5gインスタンスとしていますが他のマシンタイプでも適用できる内容となっています。 ↩︎

  2. 2022年10月時点 ↩︎

  3. debファイルのほうが私にはシンプルに見えたからです。 ↩︎

Opt Fit テックブログ

Discussion