はじめに
GPU使用率を取得するにあたり、IMDSv2対応などで少し手間取ったため忘れないように記載します。
CPU使用率はcloud watch agentで簡単に取得できるが、GPU使用率の場合は取得するプロフラムを用意する必要があり、少し手間がかかる。
対応手順
事前にcloud watch agentはインストールしておきます。
- 権限の設定
対象のEC2に下記権限が必要なため、ポリシーを追加します。
CloudWatchAgentServerPolicy
- 必要なライブラリを確認
$ pip3 list |grep -e boto3 -e nvidia
boto3 1.26.142
nvidia-ml-py 11.525.112
不足している場合はインストールします。
$ python3 -m pip install nvidia-ml-py
$ python3 -m pip install boto3
- GPUをモニタリングするソースコードを用意
下記サイトからgpumon.pyをダウンロードします。
記事中ほどの 「Python コードをダウンロードします」からダウンロードできます。
gpumon.pyを実行する環境に沿って書き換えます。
EC2_REGION
us-east-1
からap-northeast-1
に変更
my_NameSpace
DeepLearningTrain
からGPUMonitor
に変更
この辺りは下記サイトを参考にしてください。
こちらのサイトにもサンプルコードが記載されています。
IMDSv2対応のGPU使用率の出力について
IMDSv2でなければ上記対応のみで良かったが、IMDSv2の場合追加の対応が必要となります。
単にGETリクエストのレスポンス見るだけだった部分を、以下のように修正する必要があります。
1.PUT http://169.254.169.254/latest/api/token
でトークンを生成する
2.リクエストヘッダにトークンを含めてGET http://169.254.169.254/latest/meta-data/*
でメタデータを取得する。
上記の通り、メタ情報を取得している部分を書き換えると下記のようになります。
#Issue Token
TOKEN_BASE_URL = 'http://169.254.169.254/latest/api/token/'
tokenrequest = urllib2.Request(TOKEN_BASE_URL, headers={"X-aws-ec2-metadata-token-ttl-seconds" : "21600"}, method='PUT')
TOKEN = urllib2.urlopen(tokenrequest).read()
#Instance information
BASE_URL = 'http://169.254.169.254/latest/meta-data/'
content_header = {"X-aws-ec2-metadata-token" : TOKEN}
request = urllib2.Request(BASE_URL + 'instance-id', headers=content_header)
INSTANCE_ID = urllib2.urlopen(request).read().decode(encoding)
request = urllib2.Request(BASE_URL + 'ami-id', headers=content_header)
IMAGE_ID = urllib2.urlopen(request).read().decode(encoding)
request = urllib2.Request(BASE_URL + 'instance-type', headers=content_header)
INSTANCE_TYPE = urllib2.urlopen(request).read().decode(encoding)
request = urllib2.Request(BASE_URL + 'placement/availability-zone', headers=content_header)
INSTANCE_AZ = urllib2.urlopen(request).read().decode(encoding)
EC2_REGION = INSTANCE_AZ[:-1]
GPU使用率取得の実行
下記コマンドで実行し、正常に処理が出来ていればCloudWatchに出力されます。
$ python3 gpumon.py
上記コマンドでは実行中のみしか取得できないため、サービス化します。
- サービスファイルの作成
$ vi /etc/systemd/system/gpumon.service
- サービスファイルの中身
[Unit]
Description = gpumon daemon
[Service]
ExecStart =/opt/tensorflow/bin/python3 「gpumon.pyのパス」
Restart = always
Type = simple
[Install]
WantedBy = multi-user.target
- サービスの起動
$ sudo systemctl daemon-reload
$ sudo systemctl start gpumon
$ sudo systemctl enable gpumon
以上で終了です。