🦖

[AWS/Inf1/ECS]Neuron Coreの使用率などをCloud Watchに送るコンテナを作る

2023/01/17に公開


AWS Neuron


これがやりたい

対象読者

ECSやでInf1インスタンスを使っている人。
Inferentiaチップのメトリクスを監視したい人。

背景

Neuron Coreの使用率などをCloud Watchのカスタムメトリクスとして取得できることは以前の記事で確認しました。

https://zenn.dev/optfit_tech/articles/b36d20eaf2b015

今度はECSでInf1インスタンスを運用出来るように、サイドカーパターンを用いて、これらのメトリクスをCloud Watchに送ることにしました。

サイドカーパターンとは、コンテナデザインパターンの一つで、ざっくりいうとメインのコンテナと、それを補助するコンテナで構成するパターンのことです[1]

実行環境

マシンタイプ AMI
inf1.xlarge ECSに最適化されたInf1インスタンス用AMI(amzn2-ami-ecs-inf-hvm-2.0.20221213-x86_64-ebs)

方針

Supervisorを用いてプロセスが落ちても再起動するようにします。

カスタムメトリクスをCloud Watchに送信するコマンドをコンテナで動かしてみたら、30時間くらいで終了してしまったためです。

ECSタスクの全体を再起動させたくなかったので、プロセスだけを再起動することにしました。

実装


KAZYColorfulSaurus

neuron-monitorを動かすスクリプト

ディメンションにインスタンスIDとインスタンスタイプを入れています。
ディメンションを増やすとカスタムメトリクス数が増えるので料金には注意[2]してください。

メトリクスを送信するスクリプトは、後述するaws-neuron-toolsをインストールすると/opt/aws/neuron/bin/neuron-monitor-cloudwatch.pyに配置されるのでそちらを利用しています。

neuron-monitor.sh
neuron-monitor.sh
#!/bin/bash
neuron-monitor | /opt/aws/neuron/bin/neuron-monitor-cloudwatch.py  --common-dims instance_id,instance_type --region ap-northeast-1

Supervisor

コンテナが終了してしまわないようにデーモン化をoffにする設定を入れています。

supervisord.conf
supervisord.conf
[supervisord]
nodaemon=true

[program:neuron-monitor]
command=/neuron-monitor.sh

Dockerfile

Inferentiaチップに関するメトリクスを取得できるneuron-monitorコマンドと、Cloud Watchにカスタムメトリクスを送信するスクリプトはaws-neuron-toolsパッケージに含まれています。

そのため、aws-neuron-toolsのみをインストールしたイメージを作成しました。こちらを参考にしました。

Imageのサイズは約125MBです。

Dockerfile
FROM ubuntu:20.04

RUN apt-get update -y \
    && apt-get install -y --no-install-recommends \
    gnupg2 \
    wget \
    python3-pip \
    python3-setuptools \
    supervisor \
    &&  mkdir -p /var/log/supervisor \
    && cd /usr/local/bin \
    && pip3 --no-cache-dir install --upgrade pip \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

RUN pip3 install boto3

RUN echo "deb https://apt.repos.neuron.amazonaws.com bionic main" > /etc/apt/sources.list.d/neuron.list
RUN wget -qO - https://apt.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUB | apt-key add -

# Installing Neuron Tools
RUN apt-get update -y && apt-get install -y \
    aws-neuronx-tools

# Sets up Path for Neuron tools
ENV PATH="/opt/bin/:/opt/aws/neuron/bin:${PATH}"

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY neuron-monitor.sh /neuron-monitor.sh

CMD ["/usr/bin/supervisord"]

ECSのタスク定義

タスク全体がサイドカーによって終了させられないようにessentialをfalseにしています。

InferentiaチップにアクセスするにはlinuxParametersに設定が必要です。こちらを参考にしています。

CPU利用率はinf1.xlargeで観察していたところ基本1%(約10m)以下、大きくて5%(約51m)くらいです。メモリは60MiB程度です。リソースの予約をする場合は参考にしてください[3]

taskdef.json

メインのアプリケーションに関する部分は省略しています。

taskdef.json
︙略 
        {
            "name": "neuron-monitor",
            "image": "<ECRのパス>",
            "essential": false,
            "linuxParameters": {
                "capabilities": {
                    "add": [
                        "IPC_LOCK"
                    ]
                },
                "devices": [
                    {
                        "hostPath": "/dev/neuron0",
                        "containerPath": "/dev/neuron0",
                        "permissions": [
                            "read",
                            "write"
                        ]
                    }
                ]
            }
        }
︙略

出来上がり


neuron-monitorコンテナがアプリケーションコンテナと一緒に起動している様子

おわりに

ECSタスクのサイドカーとしてのカスタムメトリクスがCloud Watchに送信されるようになりました。

1インスタンスごとに27個のメトリクスが送信されるのですが、カスタムメトリクスは最初の10,000メトリクスは0.30USD/月かかるので、次回は必要なメトリクスのみ送信するようにしたいなと思います。

脚注
  1. 参考 https://www.oreilly.com/library/view/untitled/9784873118758/ch02.xhtml ↩︎

  2. 最初の10,000メトリクスは0.30USD/月。 ↩︎

  3. 予約をしなくても動きます。 ↩︎

GitHubで編集を提案
Opt Fit テックブログ

Discussion