1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

EC2のGPU 使用率をモニタリング

Last updated at Posted at 2024-12-20

はじめに

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

以上で終了です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?