

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# HyperPod が提供する基本ライフサイクルスクリプト
<a name="sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-base-config"></a>

このセクションでは、***トップダウン***アプローチを使用して HyperPod で Slurm を設定する基本的なフローのすべてのコンポーネントについて説明します。これは、`CreateCluster` API を実行する HyperPod クラスター作成リクエストの準備から始まり、階層構造をライフサイクルスクリプトにまで掘り下げます。[Awsome Distributed Training GitHub リポジトリ](https://github.com/aws-samples/awsome-distributed-training/)で提供されているサンプルライフサイクルスクリプトを使用します。次のコマンドを実行して、リポジトリのクローンを作成します。

```
git clone https://github.com/aws-samples/awsome-distributed-training/
```

SageMaker HyperPod で Slurm クラスターを設定するための基本ライフサイクルスクリプトは、[https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config) で入手できます。

```
cd awsome-distributed-training/1.architectures/5.sagemaker_hyperpods/LifecycleScripts/base-config
```

次のフローチャートは、基本ライフサイクルスクリプトの設計方法の詳細な概要を示しています。以下の図と手順ガイドでは、HyperPod `CreateCluster` API コール時の動作について説明しています。

![HyperPod クラスター作成とライフサイクルスクリプトの構造の詳細なフローチャート。](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/hyperpod-lifecycle-structure.png)


***図:** HyperPod クラスター作成とライフサイクルスクリプトの構造の詳細なフローチャート。(1) 破線の矢印はボックスが「呼び出される」場所を指しており、設定ファイルとライフサイクル スクリプトの準備の流れを示しています。`provisioning_parameters.json` とライフサイクルスクリプトの準備から始まります。その後、これらは `lifecycle_script.py` でコード化され、集合実行が順番に行われます。また、`lifecycle_script.py` スクリプトの実行は、HyperPod インスタンスターミナルで実行される `on_create.sh` シェルスクリプトによって行われます。(2) 実線の矢印は、HyperPod クラスターの主な作成フローと、ボックスがどのように「呼び出される」か、または「送信される」かを示しています。`on_create.sh` は、`create_cluster.json` またはコンソール UI の **[クラスターを作成]** リクエストフォームのいずれかで、クラスター作成リクエストに必要となります。リクエストを送信すると、HyperPod はリクエストとライフサイクルスクリプトの指定された設定情報に基づいて `CreateCluster` API を実行します。(3) 点線の矢印は、クラスターリソースのプロビジョニング時に HyperPod プラットフォームがクラスターインスタンスに `resource_config.json` を作成することを示しています。`resource_config.json` には、クラスター ARN、インスタンスタイプ、IP アドレスなどの HyperPod クラスターリソース情報が含まれています。クラスターの作成時に `resource_config.json` ファイルを期待するようライフサイクルスクリプトを準備する必要がある点に注意してください。詳細については、以下の手順ガイドを参照してください。*

以下の手順ガイドでは、HyperPod クラスターの作成中に何が起こるか、および基本ライフサイクルスクリプトの設計方法について説明しています。

1. `create_cluster.json` – HyperPod クラスター作成リクエストを送信するには、JSON 形式の `CreateCluster` リクエストファイルを準備します。このベストプラクティス例では、リクエストファイルの名前が `create_cluster.json` であると想定しています。インスタンスグループを使用して HyperPod クラスターをプロビジョニングするには、`create_cluster.json` を書き込みます。ベストプラクティスとして、HyperPod クラスターで設定する予定の Slurm ノードの数と同じ数のインスタンスグループを追加することをお勧めします。設定する予定の Slurm ノードに割り当てるインスタンスグループに、固有の名前を付けてください。

   さらに、S3 バケットパスを指定して、設定ファイルとライフサイクルスクリプトのセット全体を `CreateCluster` リクエストフォームのフィールド名 `InstanceGroups.LifeCycleConfig.SourceS3Uri` に保存し、エントリポイントシェルスクリプトのファイル名 (`on_create.sh` という名前であると想定します) を `InstanceGroups.LifeCycleConfig.OnCreate` に指定する必要があります。
**注記**  
HyperPod コンソール UI で **[クラスターを作成]** 送信フォームを使用する場合、コンソールはユーザーに代わって `CreateCluster` リクエストの入力と送信を管理し、`CreateCluster` API をバックエンドで実行します。この場合、`create_cluster.json` を作成する必要はありません。代わりに、**[クラスターを作成]** 送信フォームに正しいクラスター設定情報を指定してください。

1. `on_create.sh` – インスタンスグループごとに、コマンドを実行するエントリポイントシェルスクリプト `on_create.sh` を提供して、ソフトウェアパッケージをインストールするスクリプトを実行し、Slurm のある HyperPod クラスター環境を設定する必要があります。Slurm を設定するために HyperPod が必要とする `provisioning_parameters.json` と、ソフトウェアパッケージをインストールするための一連のライフサイクルスクリプトの 2 つを準備する必要があります。このスクリプトは、[https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/on_create.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/on_create.sh) のサンプルスクリプトに示すように、以下のファイルを検索して実行するよう記述する必要があります。
**注記**  
ライフサイクルスクリプトのセット全体を、`create_cluster.json` で指定した S3 の場所にアップロードしてください。さらに、`provisioning_parameters.json` を同じ場所に配置する必要もあります。

   1. `provisioning_parameters.json` – これは [provisioning\_parameters.json の設定フォーム](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-provisioning-forms-slurm) です。`on_create.sh` スクリプトはこの JSON ファイルを見つけ、そのパスを識別するための環境変数を定義します。この JSON ファイルを使用して、通信する Slurm 用 Amazon FSx for Lustre などの Slurm ノードとストレージオプションを設定できます。`provisioning_parameters.json` では、`create_cluster.json` で指定した名前を使用して HyperPod クラスターインスタンスグループを、設定方法に基づいて Slurm ノードに適切に割り当ててください。

      次の図は、HyperPod インスタンスグループが Slurm ノードに割り当てられるよう 2 つの JSON 設定ファイル `create_cluster.json` および `provisioning_parameters.json` を記述する方法の例を示しています。この例では、コントローラー (管理) ノード、ログインノード (オプション)、コンピューティング (ワーカー) ノードの 3 つの Slurm ノードを設定するケースを想定しています。
**ヒント**  
これらの 2 つの JSON ファイルを検証するため、HyperPod サービスチームは検証スクリプト [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/validate-config.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/validate-config.py) を用意しています。詳細については[HyperPod での Slurm クラスター作成前の JSON 設定ファイルの検証](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-validate-json-files.md)を参照してください。  
![.json ファイル間の直接比較。](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/hyperpod-lifecycle-slurm-config.png)

      ***図:** HyperPod クラスター作成用の `create_cluster.json` と Slurm 設定用の `provisiong_params.json` の直接比較。`create_cluster.json` のインスタンスグループの数は、Slurm ノードとして設定するノードの数と一致する必要があります。図の例のケースでは、3 つのインスタンスグループの HyperPod クラスターに 3 つの Slurm ノードが設定されます。HyperPod クラスターインスタンスグループは、インスタンスグループ名を適切に指定して Slurm ノードに割り当てる必要があります。*

   1. `resource_config.json` – クラスターの作成時、`lifecycle_script.py` スクリプトは HyperPod からの `resource_config.json` ファイルを期待するよう記述されます。このファイルには、インスタンスタイプや IP アドレスなど、クラスターに関する情報が含まれています。

      `CreateCluster` API を実行すると、HyperPod は `create_cluster.json` ファイルに基づいて `/opt/ml/config/resource_config.json` にリソース設定ファイルを作成します。ファイルパスは、`SAGEMAKER_RESOURCE_CONFIG_PATH` という名前の環境変数に保存されます。
**重要**  
`resource_config.json` ファイルは、HyperPod プラットフォームによって自動生成されるため、作成する必要はありません。次のコードは、前のステップで `create_cluster.json` に基づいてクラスターの作成から作成される `resource_config.json` の例を示しており、バックエンドで何が行われ、自動生成された `resource_config.json` がどのようになるかを理解するのに役立ちます。

      ```
      {
      
          "ClusterConfig": {
              "ClusterArn": "arn:aws:sagemaker:us-west-2:111122223333:cluster/abcde01234yz",
              "ClusterName": "your-hyperpod-cluster"
          },
          "InstanceGroups": [
              {
                  "Name": "controller-machine",
                  "InstanceType": "ml.c5.xlarge",
                  "Instances": [
                      {
                          "InstanceName": "controller-machine-1",
                          "AgentIpAddress": "111.222.333.444",
                          "CustomerIpAddress": "111.222.333.444",
                          "InstanceId": "i-12345abcedfg67890"
                      }
                  ]
              },
              {
                  "Name": "login-group",
                  "InstanceType": "ml.m5.xlarge",
                  "Instances": [
                      {
                          "InstanceName": "login-group-1",
                          "AgentIpAddress": "111.222.333.444",
                          "CustomerIpAddress": "111.222.333.444",
                          "InstanceId": "i-12345abcedfg67890"
                      }
                  ]
              },
              {
                  "Name": "compute-nodes",
                  "InstanceType": "ml.trn1.32xlarge",
                  "Instances": [
                      {
                          "InstanceName": "compute-nodes-1",
                          "AgentIpAddress": "111.222.333.444",
                          "CustomerIpAddress": "111.222.333.444",
                          "InstanceId": "i-12345abcedfg67890"
                      },
                      {
                          "InstanceName": "compute-nodes-2",
                          "AgentIpAddress": "111.222.333.444",
                          "CustomerIpAddress": "111.222.333.444",
                          "InstanceId": "i-12345abcedfg67890"
                      },
                      {
                          "InstanceName": "compute-nodes-3",
                          "AgentIpAddress": "111.222.333.444",
                          "CustomerIpAddress": "111.222.333.444",
                          "InstanceId": "i-12345abcedfg67890"
                      },
                      {
                          "InstanceName": "compute-nodes-4",
                          "AgentIpAddress": "111.222.333.444",
                          "CustomerIpAddress": "111.222.333.444",
                          "InstanceId": "i-12345abcedfg67890"
                      }
                  ]
              }
          ]
      }
      ```

   1. `lifecycle_script.py` – これは、プロビジョニング中に HyperPod クラスターで Slurm を設定するライフサイクルスクリプトをまとめて実行するメイン Python スクリプトです。このスクリプトは、`on_create.sh` で指定または識別されたパスから `provisioning_parameters.json` および `resource_config.json` を読み取り、関連情報を各ライフサイクルスクリプトに渡してから、ライフサイクルスクリプトを順番に実行します。

      ライフサイクルスクリプトは、Slurm の設定、ユーザーの作成、Conda または Docker のインストールなど、クラスターの作成中にソフトウェアパッケージをインストールしたり、必要な設定やカスタム設定をセットアップしたりするためにカスタマイズできる高い柔軟性を持つスクリプトのセットです。サンプル [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/lifecycle_script.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/lifecycle_script.py) スクリプトは、Slurm デーモン ([https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/start_slurm.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/start_slurm.sh)) の起動、Amazon FSx for Lustre ([https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/mount_fsx.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/mount_fsx.sh)) のマウント、MariaDB アカウンティング ([https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/setup_mariadb_accounting.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/setup_mariadb_accounting.sh)) と RDS アカウンティング ([https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/setup_rds_accounting.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/setup_rds_accounting.sh)) の設定など、リポジトリで他の基本ライフサイクルスクリプトを実行する準備ができています。さらに、スクリプトを追加して、同じディレクトリにパッケージ化し、コード行を `lifecycle_script.py` に追加して、HyperPod がスクリプトを実行可能にすることもできます。基本ライフサイクルスクリプトの詳細については、*Awsome Distributed Training GitHub リポジトリ* の「[3.1 Lifecycle scripts](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod#31-lifecycle-scripts)」も参照してください。
**注記**  
HyperPod はクラスターの各インスタンスで [SageMaker HyperPod DLAMI](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-hyperpod-ami) を実行します。AMI には、AMI と HyperPod の機能の互換性に準拠したソフトウェアパッケージがプリインストールされています。プリインストールされたパッケージのいずれかを再インストールする場合、互換性のあるパッケージをインストールしなければならず、一部の HyperPod 機能が正常に動作しない場合がある点に注意してください。

      デフォルトのセットアップに加えて、以下のソフトウェアをインストールするための他のスクリプトが [https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/utils](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/utils) フォルダに用意されています。`lifecycle_script.py` ファイルは、インストールスクリプトを実行するためのコード行を含める準備が既に整っているため、以下の項目を参照して行を検索し、コメントを解除してアクティブ化してください。

      1. 次のコード行は、[Docker](https://www.docker.com/)、[Enroot](https://github.com/NVIDIA/enroot)、および [Pyxis](https://github.com/NVIDIA/pyxis) をインストールするためのものです。これらのパッケージは、Slurm クラスターで Docker コンテナを実行するために必要です。

         このインストールステップを有効にするには、[https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py) ファイルで `enable_docker_enroot_pyxis` パラメータを `True` に設定します。

         ```
         # Install Docker/Enroot/Pyxis
         if Config.enable_docker_enroot_pyxis:
             ExecuteBashScript("./utils/install_docker.sh").run()
             ExecuteBashScript("./utils/install_enroot_pyxis.sh").run(node_type)
         ```

      1. HyperPod クラスターを [Amazon Managed Service for Prometheus](https://docs.aws.amazon.com/prometheus/latest/userguide/what-is-Amazon-Managed-Service-Prometheus.html) および [Amazon Managed Grafana](https://docs.aws.amazon.com/grafana/latest/userguide/what-is-Amazon-Managed-Service-Grafana.html) と統合して、HyperPod クラスターとクラスターノードに関するメトリクスを Amazon Managed Grafana ダッシュボードにエクスポートできます。メトリクスをエクスポートし、Amazon Managed Grafana で [Slurm ダッシュボード](https://grafana.com/grafana/dashboards/4323-slurm-dashboard/)、[NVIDIA DCGM Exporter ダッシュボード](https://grafana.com/grafana/dashboards/12239-nvidia-dcgm-exporter-dashboard/)、および [EFA Metrics ダッシュボード](https://grafana.com/grafana/dashboards/20579-efa-metrics-dev/)を使用するには、[Prometheus の Slurm エクスポーター](https://github.com/vpenso/prometheus-slurm-exporter)、[NVIDIA DCGM エクスポーター](https://github.com/NVIDIA/dcgm-exporter)、および [EFA ノードエクスポーター](https://github.com/aws-samples/awsome-distributed-training/blob/main/4.validation_and_observability/3.efa-node-exporter/README.md)をインストールする必要があります。エクスポーターパッケージのインストールと Amazon Managed Grafana ワークスペースでの Grafana ダッシュボードの使用の詳細については、「[SageMaker HyperPod クラスターリソースのモニタリング](sagemaker-hyperpod-cluster-observability-slurm.md)」を参照してください。

         このインストールステップを有効にするには、[https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py) ファイルで `enable_observability` パラメータを `True` に設定します。

         ```
         # 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_prometheus.sh").run()
         ```

1. **ステップ 2** のすべての設定ファイルとセットアップスクリプトを、**ステップ 1** の `CreateCluster` リクエストで指定した S3 バケットにアップロードしてください。例えば、`create_cluster.json` に以下のものがあるとします。

   ```
   "LifeCycleConfig": { 
   
       "SourceS3URI": "{{s3://sagemaker-hyperpod-lifecycle/src}}",
       "OnCreate": "{{on_create.sh}}"
   }
   ```

   その場合、`"s3://sagemaker-hyperpod-lifecycle/src"` には、`on_create.sh`、`lifecycle_script.py`、`provisioning_parameters.json`、および他のすべてのセットアップスクリプトが含まれています。次のように、ローカルフォルダにファイルを準備したとします。

   ```
   └── lifecycle_files // your local folder
       ├── provisioning_parameters.json
       ├── on_create.sh
       ├── lifecycle_script.py
       └── ... // more setup scrips to be fed into lifecycle_script.py
   ```

   ファイルをアップロードするには、次のように S3 コマンドを使用します。

   ```
   aws s3 cp --recursive {{./lifecycle_scripts}} {{s3://sagemaker-hyperpod-lifecycle/src}}
   ```