[AWS/Inf1/ECS]Neuron Coreの使用率などをCloud Watchに送るコンテナを作る
AWS Neuron
これがやりたい
対象読者
ECSやでInf1インスタンスを使っている人。
Inferentiaチップのメトリクスを監視したい人。
背景
Neuron Coreの使用率などをCloud Watchのカスタムメトリクスとして取得できることは以前の記事で確認しました。
今度は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
#!/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]
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
メインのアプリケーションに関する部分は省略しています。
︙略
{
"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/月かかるので、次回は必要なメトリクスのみ送信するようにしたいなと思います。
-
参考 https://www.oreilly.com/library/view/untitled/9784873118758/ch02.xhtml ↩︎
-
最初の10,000メトリクスは0.30USD/月。 ↩︎
-
予約をしなくても動きます。 ↩︎
Discussion