Amazon SageMaker HyperpodのMonitoring – Amazon Managed Grafana

# はじめに – HyperPodのモニタリングの重要性
AWS SageMaker HyperPodは、機械学習やHPCワークロードの大規模な並列処理を可能にする強力なクラスター環境です。しかし、**最適なパフォーマンスを維持し、リソースのボトルネックを解消するためには、適切なモニタリングが不可欠**です。

モニタリングを行うことで、以下のような重要な[ポイント](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-cluster-observability-managed-grafana-ws.html#sagemaker-hyperpod-cluster-observability-managed-grafana-ws-import-dashboards)を把握できます。

- Compute Nodeのリソース使用率（CPU、メモリ、GPU）
- ジョブの状態や実行時間（Slurmジョブ管理）
- FSx for Lustreのストレージパフォーマンス（スループット、IOPS）
- NVIDIA DCGM Exporter Dashboard による GPU 使用率の可視化
- EFA Metrics Dashboard による Elastic Fabric Adapter (EFA) のネットワークパフォーマンス監視

AWSでは、**Amazon CloudWatch、Amazon Managed Prometheus、Amazon Managed Grafana**を活用し、HyperPod環境をリアルタイムで監視・可視化する方法を提供しています。本記事では、特に**Amazon Managed Grafana**を用いた効果的なモニタリング手法について解説します。

# Amazon Managed Grafanaとは？

Amazon Managed Grafanaは、**AWSが提供するフルマネージドなGrafanaサービス**であり、インフラのセットアップや管理不要で、高度な可視化とモニタリングを実現できます。Grafanaは、オープンソースのダッシュボードツールであり、AWS環境のメトリクスやログを直感的に可視化するのに適しています。

Amazon Managed Grafanaの特徴

- AWSネイティブ統合：CloudWatch、Amazon Managed Prometheus、Amazon OpenSearchなどとシームレスに連携
- 柔軟なデータソース対応：Prometheus、Loki、InfluxDB、MySQLなど、様々なデータソースを統合可能
- セキュアなアクセス管理：AWS IAM Identity Center（旧AWS SSO）を活用した認証・アクセス制御

HyperPod環境では、**NVIDIA DCGM Exporterを活用したGPUモニタリングや、EFA Metrics Dashboardを使ったネットワーク監視**などにGrafanaを活用できます。本記事では、これらのダッシュボード構築方法について詳しく解説していきます。

# Hyperpodのモニタリング環境構築の前に確認すべき前提条件

- AWS Organizationsを活用するための基本知識があること
    - AWS Organizationsの設定が完了しており、その配下にMember Accountが存在していること。
- Hyperpodを活用するための基本知識があること
    - 参考：[Amazon SageMaker Hyperpodの構築手順 – Terraformを活用した構築](https://qiita.com/jeayoon/items/39de03f72d1f3482f254)

# HyperPodのモニタリング環境構築

<img width="800" alt="Image" src="https://github.com/user-attachments/assets/5931c5d6-9b71-4fa4-8fa5-cc15fd72a485" />

構成図：[SageMaker HyperPod cluster resources monitoring](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-cluster-observability.html)

HyperPodのモニタリング環境は、**Amazon Managed Grafana、Amazon Managed Service for Prometheus、SLURM Exporter、DCGM Exporter、EFA Node Exporter**を組み合わせて構築します。

1. **データ収集**:
    - SLURM Exporter (8080番ポート) を使用し、ジョブのスケジューリング状況を取得
    - DCGM Exporter (9400番ポート) でGPUの使用率・メモリ・温度を監視
    - EFA Node Exporter (9100番ポート) によりElastic Fabric Adapter (EFA) のネットワークパフォーマンスを取得
2. **データの統合と可視化**:
    - Prometheus にデータを保存し、Grafanaでリアルタイム監視
    - IAM Identity Center を活用し、エンジニアや管理者がセキュアにアクセス

この構成により、HyperPodのリソース監視を効率的に行い、最適なパフォーマンス管理を実現します。

これから環境設定について説明しますが、本記事では**AWS Organizationsを有効化**している環境を前提とし、2つのアカウントを使用して解説します。
言語の混乱を避けるため、AWSの標準的なアカウント名称を使用します。
- **Management Account**
- **Member Account**

## 1. HyperPodのAWS Infra環境構築

**※Member Account上で実行します。**

構築方法については、こちらの[Terraformを用いた環境のコード化](https://qiita.com/jeayoon/items/39de03f72d1f3482f254#terraform%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E7%92%B0%E5%A2%83%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%8C%96)で詳しく解説しているため、本記事では詳細な説明を省略します。

本記事で扱う Infra環境は、以下の構成図において**SSMとHyperPodを除いた部分**を指します。
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/df4daa77-c81f-4fa8-9e0e-7ba6656a41d1" />

## 2. Amazon Managed Grafanaの構築

**※Member Account上で実行します。**

Amazon Managed Grafanaは、AWSが提供する**HyperPod用のCloudFormation**を活用して構築できます。
[AWS GitHub Cluster-observability.yaml](https://github.com/aws-samples/awsome-distributed-training/blob/main/4.validation_and_observability/4.prometheus-grafana/cluster-observability.yaml)


<img width="800" alt="Image" src="https://github.com/user-attachments/assets/a8bbd764-0a09-40b6-92fe-fe5cf373c438" />

Lifecycle Script内のモニタリングスクリプトでは、**PrometheusとGrafanaのARNを参照する部分が含まれている**ため、スムーズに環境を構築するには、このCloudFormationを利用するのが適切でしょう。
また、**HyperPodクラスターと同じRegion**での利用が推奨されています。

なお、CloudFormationを適用すると、以下のリソースが自動的に作成されます。
- Amazon Managed Grafana
- Amazon Managed Grafana用のIAM Role
- Amazon Managed Service for Prometheus

<img width="800" alt="Image" src="https://github.com/user-attachments/assets/9b9031ea-ca3e-411a-8830-268bffea4cca" />
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/e0c61928-6881-4148-83fa-9c0d2296cf19" />

## 3. Amazon Managed Grafana用のIAM Role修正

**※Member Account上で実行します。**

FSx for LustreのメトリクスをCloudWatchから取得するため、**GrafanaのIAMロールに「CloudWatchReadOnlyAccess」Policyを手動でアタッチ**してください。
ちなみに、この設定はCloudFormationには含まれていないため、別途対応が必要です。

<img width="800" alt="Image" src="https://github.com/user-attachments/assets/ed0ac176-b71d-42a6-95cc-7d43c783fbf6" />

## 4. Lifecycle scriptsの設定

### 4-1.provisioning_parameters.json設定
まず、Lifecycle Scriptsの準備やprovisioning_parameters.jsonの設定については、**別のブログ記事で詳しく解説しているため、そちらを参考にしてください。**
[provisioning_parameters.json設定](https://qiita.com/jeayoon/items/39de03f72d1f3482f254#1-provisioning_parametersjson%E8%A8%AD%E5%AE%9A)

### 4-2. utils/install_prometheus.shの修正

既存のLifecycle Scriptsの[/utils/install_prometheus.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/utils/install_prometheus.sh)では**Prometheusへのログ送信が行われない**状態だったため、以下の `prometheus.service`部分だけを修正してください。
原因は**Agent Modeが有効になっていなかった**ことによるもので、その設定が適用されるように修正しました。

この修正の詳細については、別のブログ記事で解説します。

:::note info
[install_prometheus.sh](https://github.com/jeayoon/terraform-setup/blob/master/aws/hyperpod/cluster/lifecycle_files/utils/install_prometheus.sh)の修正例
:::

```bash
sudo tee /etc/systemd/system/prometheus.service > /dev/null <<EOF
[Unit]
Description=Prometheus Exporter

[Service]
Environment=PATH=/opt/slurm/bin:\$PATH
ExecStart=/usr/bin/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.agent.path=/opt/prometheus/data-agent --agent
Restart=on-failure
RestartSec=15
Type=simple

[Install]
WantedBy=multi-user.target
EOF
```
### 4-3.config.pyの修正

`enable_observability`を`true`に設定します。

```bash
class Config:
# 省略
enable_observability = True
# 省略
```

すると、Lifecycle Scriptsの実行時に`install_prometheus.sh`が適用されるようになります。
```bash
 # Install metric exporting software and Prometheus for observability
        if Config.enable_observability:
            if node_type == SlurmNodeType.COMPUTE_NODE:
                ExecuteBashScript("./utils/install_docker.sh").run()
                ExecuteBashScript("./utils/install_dcgm_exporter.sh").run()
                ExecuteBashScript("./utils/install_efa_node_exporter.sh").run()

            if node_type == SlurmNodeType.HEAD_NODE:
                wait_for_scontrol()
                ExecuteBashScript("./utils/install_docker.sh").run()
                ExecuteBashScript("./utils/install_slurm_exporter.sh").run()
                ExecuteBashScript("./utils/install_head_node_exporter.sh").run()
                ExecuteBashScript("./utils/install_prometheus.sh").run()
```

### 4-4. Lifecycle ScriptsをS3にUploadする

HyperPodクラスターを起動する際、**Lifecycle Scriptsの保存先であるS3を参照する**ため、事前にS3へUploadしておきます。

```bash

aws s3 sync "lifecycle_files/" s3://{your_lifecycle_bucket_name}/lifecycle-script-directory/src
```

## 5. HyperPodクラスター構築

前提条件のセクションで説明した通り、本記事では**クラスター構築に必要なJSONファイルの作成方法や、Head Nodeへのアクセス方法の詳細は省略**します。
それでは、HyperPodクラスターを立ち上げます。

```bash

aws sagemaker create-cluster --cli-input-json file://create_cluster.json
```

クラスター起動後、Head Nodeにアクセスし、以下の`sinfo`コマンドでノードの状態を確認します。
今回のノード構成は以下の通りです。
- Head Node: ml.m5.large × 1台
- Compute Node: ml.g5.xlarge × 2台

```bash
ubuntu@ip-10-1-36-89:~$ sinfo
PARTITION   AVAIL  TIMELIMIT  NODES  STATE NODELIST
dev*           up   infinite      2   idle ip-10-1-5-52,ip-10-1-23-154
partition-1    up   infinite      2   idle ip-10-1-5-52,ip-10-1-23-154
```

クラスター構築時に**Amazon Managed Grafanaの設定**と**Lifecycle Scriptsの適用**を行ったため、
HyperPodクラスターが起動後、**Prometheusが正しく動作しているかを確認**してください。

Prometheusの正常稼働`active (running)`を確認するには、以下のコマンドを実行します。

```bash

ubuntu@ip-10-1-36-89:~$ sudo systemctl status prometheus
● prometheus.service - Prometheus Exporter
     Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2025-03-11 01:06:36 UTC; 28min ago
   Main PID: 9472 (prometheus)
      Tasks: 8 (limit: 9150)
     Memory: 31.0M
     CGroup: /system.slice/prometheus.service
             └─9472 /usr/bin/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.agent.path=/opt/prometheus/data-agent --agent
```
以下のコマンドを実行し、Prometheusの設定ファイルが正しく適用されているかを検証します。
実行結果には、各ノードのターゲット情報や、Prometheus Workspaceの**Remote Write URL**が含まれていることを確認してください。

これにより、HyperPodのメトリクスが正しく**Prometheusに蓄積され、Amazon Managed Grafanaを通じて可視化できる状態**になっていることを確認できます。

```bash

ubuntu@ip-10-1-36-89:~$ cat /etc/prometheus/prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s
  scrape_timeout: 15s

scrape_configs:
  - job_name: 'head_node_metrics'
    static_configs:
      - targets:
          - 'localhost:9100'
  - job_name: 'slurm_exporter'
    static_configs:
      - targets:
          - 'localhost:8080'
  - job_name: 'dcgm_exporter'
    static_configs:
      - targets:
          - '10.1.5.52:9400'
          - '10.1.23.154:9400'
  - job_name: 'efa_node_exporter'
    static_configs:
      - targets:
          - '10.1.5.52:9100'
          - '10.1.23.154:9100'

remote_write:
  - url: https://aps-workspaces.ap-northeast-1.amazonaws.com/workspaces/ws-bc3adc55-a4e9-45b7-8199-dbcd283bd545/api/v1/remote_write
    queue_config:
      max_samples_per_send: 1000
      max_shards: 200
      capacity: 2500
    sigv4:
      region: ap-northeast-1

```

この設定により、GrafanaのダッシュボードでHyperPodのメトリクスが可視化され、適切なモニタリングが可能になります。

## 6. IAM Identity CenterのUser作成
**※Management Account上で実行します。**

Amazon Managed Grafanaにログインするため、AWS IAM Identity Centerにユーザーを作成してください。
[Add users to your Identity Center directory](https://docs.aws.amazon.com/singlesignon/latest/userguide/addusers.html)

<img width="800" alt="Image" src="https://github.com/user-attachments/assets/0a6184ac-1f4f-456b-ada3-dea6cff53432" />


## 7. Amazon Managed GrafanaにUserを追加
**※Member Account上で実行します。**

先ほどAWS IAM Identity CenterでGrafanaへのログイン用ユーザーを作成したため、次にGrafanaとの紐付け作業を行います。

### 7-1. Grafanaにユーザーを割り当てる

- Amazon Managed Grafanaの詳細ページ に移動し、画面下部にある`Authentication`タブを開きます。
- `Assign new user or group`をクリックします。
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/cdb83057-2bb9-48a7-9a44-f42e1443ebd4" />

### 7-2. ユーザーの選択と権限設定
- `Assign new user or group`のページに移動したら、Identity Centerで作成したユーザーを選択します。
- `Assign new user or group`をクリックして次のステップに進みます。
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/6168b183-1579-4129-9935-cbb7f6493f64" />

### 7-3. ユーザーの管理者権限の付与
- 該当するユーザーの`User Type`を`Admin`に変更します。
- 右側の`Action`リストから`Make admin`をクリックします。
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/18d6f335-55f8-40a7-b954-b75a7c2ad9f9" />

### 7-4. 紐付けの確認 
- ユーザーの割り当てが完了すると、`Enable`に変更されていることを確認してください。
- これで、Identity Centerのユーザーが Grafanaに管理者としてアクセスできるようになります。
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/9b221278-ef91-4cb6-ae79-b5eba4b04fc9" />

### 7-5. Grafanaのデータソースを確認

- `Data Sources`タブを開きます。
- **Amazon Managed Service for Prometheus**と**Amazon CloudWatch**が正しくアタッチされていることを確認してください。

これらのデータソースは、Grafana専用のCloudFormationテンプレートによって自動的に設定されます。
もし正しく設定されていない場合は、CloudFormationの実行状況を確認し、必要に応じて手動で追加してください。

<img width="800" alt="Image" src="https://github.com/user-attachments/assets/d78b19b4-7f04-46c9-9aa2-655b0560b035" />

## 8. Amazon Managed Grafanaにアクセス
**※Member Account上で実行します。**

Grafanaの設定が完了したので、Grafana WorkspaceのURL にアクセスして、ログインを試してみましょう。

`Grafana Workspace URL`に移動します。
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/406f92d1-87ee-4613-8cb3-ea55f9aaa63d" />

`Sign in with AWS IAM Identity Center`のページが表示されるので、先ほど作成したIAM Identity Centerのユーザーでログインしてください。
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/08bf99ba-673d-4d18-9e4b-510fd73efa39" />

正しくログインできると、Grafanaの管理画面が表示されます。
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/b6c6f754-91dd-4a9d-a108-43c2cb7110eb" />

これで、Grafanaのセットアップが完了し、ダッシュボードを利用できる状態になりました。

## 9. Grafanaダッシュボードの作成

HyperPodのモニタリングを行うために、まず**Data Sourcesを設定**し、ログをGrafanaに取り込む必要があります。

HyperPod環境では、以下の4つのメトリクスが Prometheusに送信されます。
- Slurm: ジョブスケジューリングの状況を監視
- Node Exporter Full: システムリソース（CPU、メモリ、ディスクなどを監視
- NVIDIA DCGM Exporter: GPUの利用状況を監視
- EFA Metrics: Elastic Fabric Adapter (EFA) のネットワークパフォーマンスを監視
    - **GPU Instance Typeの最上位Specのみが取得される[仕様](https://grafana.com/grafana/dashboards/20579-efa-metrics-dev/)（2025/3/11時点）**

また、FSx for LustreのメトリクスはCloudWatchを使用してダッシュボードを作成します。

:::note info
FSx for LustreのGrafanaダッシュボード設定時の注意点

FSx for LustreのメトリクスをGrafanaで可視化する際は、以下の2点に注意してください。

- **Grafana Data SourceはCloudWatch**
    - FSxのメトリクスは PrometheusではなくCloudWatchから取得します。
- **AWS公式のGrafana Dashboard URLの誤り（2025/3/11時点）**
    - 正しいURLは以下を使用してください。
        - https://grafana.com/grafana/dashboards/20906-fsx/
:::

今回は、作成したばかりのHyperPodを例に ノードの状態を可視化するNode Exporter Fullを構築します。

### 9-1. Data Sourcesの設定

- Grafanaの左サイドメニューから`Apps` → `AWS Data Sources`に移動します。
- `Amazon Managed Service for Prometheus`を選択します。
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/1c37d0f2-62a3-4ce3-aa3d-61168556ca0c" />

- Data Sourcesの詳細画面に移動したら、`Regions`をPrometheusが構築されているリージョン（例: Tokyo）に設定します。
- 表示されたPrometheusのWorkspaceを選択し、`Add 1 data source`をクリックします。
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/df18d8a6-089e-431d-b5c3-f5e5d5a8c51b" />

- これで、Prometheusがデータソースとして登録されました。
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/29e75dcf-0172-4fbf-8383-7f5b247321e2" />

### 9-2. Dashboardの作成

- 左サイドメニューの`Data Sources`に移動し、右上の`New` → `Import`をクリックします。
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/75f4ef3c-4e23-4bb7-868a-135f9b7d2548" />

- [Grafanaの公式ダッシュボードをインポートする](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-cluster-observability-managed-grafana-ws.html#sagemaker-hyperpod-cluster-observability-managed-grafana-ws-import-dashboards)ため、以下の Node ExporterダッシュボードのURLを入力し、`Load`をクリックします。
```bash
https://grafana.com/grafana/dashboards/1860-node-exporter-full/
```
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/761aec4f-a888-4bc9-944e-a91936164b6c" />

- Import設定画面に移動したら、下部の`Prometheus Data Source`を選択し、`Import`をクリックします。
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/7e009df8-6249-4654-9d72-8b80b20a8f39" />

- これで、Node Exporter Full Dashboardが生成され、ノードの状態をリアルタイムで監視できるようになります。

<img width="800" alt="Image" src="https://github.com/user-attachments/assets/a4dc839d-7d3a-49ef-bae7-39e964b3a8a2" />
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/9c5841f8-0a92-410f-81d4-4a1fd316cbd3" />

- Dashboard上で、Head NodeとCompute Nodeを選択可能になっており、Compute Nodeについては各ノードのIPを指定して個別に表示することもできます。

<img width="800" alt="Image" src="https://github.com/user-attachments/assets/5b6b26df-3dc2-436e-ba0b-6ed9d74b30fc" />
<img width="800" alt="Image" src="https://github.com/user-attachments/assets/07225701-4623-40bc-bd16-089377a95253" />

これで、**Node Exporter Full Dashboard**の作成が完了しました。

# 最後に
Amazon SageMaker HyperPodにAmazon Managed Grafanaを組み合わせたモニタリング環境を構築し、実際に運用してみることで、その有用性と課題が明確になりました。

今回は、Compute Nodeのリソース監視を中心に構築しましたが、リアルタイムでのリソース可視化やメトリクスの蓄積が可能になり、運用管理の効率化に大きく貢献することを実感しました。

特に、以下のようなメリットを得ることができました。
- HyperPodのリソース状況を一目で把握できる
- AWS Consoleを活用することで、監視システムの運用負担を軽減できる

このモニタリング環境を活用することで、HyperPodの安定運用がさらに向上し、パフォーマンスの最適化や障害対応の迅速化にもつながることが分かりました。

以上、「Amazon SageMaker HyperpodのMonitoring – Amazon Managed Grafana」に関する記事でした。ご覧いただき、ありがとうございました！