が提供するベースライフサイクルスクリプトから開始する HyperPod - Amazon SageMaker

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

が提供するベースライフサイクルスクリプトから開始する HyperPod

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

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

で Slurm クラスターを設定するためのベースライフサイクルスクリプト SageMaker HyperPod は、 で入手できます1.architectures/5.sagemaker_hyperpods/LifecycleScripts/base-config

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

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

HyperPod クラスター作成の詳細なフローチャートとライフサイクルスクリプトの構造。

図: HyperPod クラスター作成の詳細なフローチャートとライフサイクルスクリプトの構造。(1) 破線の矢印は、ボックスが「」と呼ばれる場所に送られ、設定ファイルとライフサイクルスクリプトの準備の流れを示します。準備provisioning_parameters.jsonとライフサイクルスクリプトから始まります。次に、これらは でコード化されlifecycle_script.py、一括実行が順番に行われます。また、lifecycle_script.pyスクリプトの実行は、インスタンスターミナルで HyperPod実行されるon_create.shシェルスクリプトによって行われます。(2) 実線の矢印は、メイン HyperPod クラスター作成フローと、ボックスが「」または「送信先」と呼ばれる方法を示しています。 on_create.shは、 create_cluster.jsonまたはコンソール UI のクラスター作成リクエストフォームのいずれかで必要です。リクエストを送信すると、 はリクエストとライフサイクルスクリプトから指定された設定情報CreateClusterAPIに基づいて HyperPod を実行します。(3) 点線の矢印は、クラスターリソースのプロビジョニング中に HyperPod プラットフォームがクラスターインスタンスresource_config.jsonに を作成することを示します。 resource_config.jsonには、 HyperPod クラスター ARN、インスタンスタイプ、IP アドレスなどのクラスターリソース情報が含まれています。クラスターの作成中に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リクエストの入力と送信を管理し、バックエンドCreateClusterAPIで を実行します。この場合、 を作成する必要はありませんcreate_cluster.json。代わりに、クラスター作成送信フォームに正しいクラスター設定情報を指定してください。

  2. on_create.sh – インスタンスグループごとに、コマンドの実行on_create.sh、ソフトウェアパッケージのインストールのためのスクリプトの実行、および Slurm によるクラスター環境のセットアップ HyperPodのために、エントリポイントシェルスクリプト を提供する必要があります。準備する必要がある 2 つのことは、Slurm をセットアップ HyperPod するために がprovisioning_parameters.json必要とする と、ソフトウェアパッケージをインストールするための一連のライフサイクルスクリプトです。このスクリプトは、 のサンプルスクリプトに示すように、次のファイルを検索して実行するために記述する必要がありますon_create.sh

    注記

    ライフサイクルスクリプトのセット全体を、 で指定した S3 ロケーションにアップロードしてくださいcreate_cluster.json。また、 provisioning_parameters.jsonを同じ場所に配置する必要があります。

    1. provisioning_parameters.json – これは ですで Slurm ノードをプロビジョニングするための設定フォーム HyperPodon_create.sh スクリプトは、このJSONファイルを見つけ、そのファイルへのパスを識別するための環境変数を定義します。このJSONファイルを使用して、Amazon FSx for Lustre for Slurm などの Slurm ノードとストレージオプションを通信するように設定できます。ではprovisioning_parameters.json、 で指定した名前を使用して HyperPod クラスターインスタンスグループcreate_cluster.jsonを、セットアップ方法に基づいて適切に Slurm ノードに割り当てます。

      次の図は、 HyperPod インスタンスグループを Slurm ノードに割り当てるために provisioning_parameters.json 2 つのJSON設定ファイル create_cluster.json と を書き込む方法の例を示しています。この例では、コントローラー (管理) ノード、ログインノード (オプション)、コンピューティング (ワーカー) ノードの 3 つの Slurm ノードをセットアップする場合を想定しています。

      ヒント

      これらの 2 つのJSONファイルを検証するため、 HyperPodサービスチームは検証スクリプト を提供しますvalidate-config.py。詳細については、「で Slurm クラスターを作成する前に設定JSONファイルを検証する HyperPod」を参照してください。

      .json ファイル間の直接比較。

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

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

      を実行するとCreateClusterAPI、 HyperPodは ファイル/opt/ml/config/resource_config.jsonに基づいて でリソース設定create_cluster.jsonファイルを作成します。ファイルパスは、 という名前の環境変数に保存されますSAGEMAKER_RESOURCE_CONFIG_PATH

      重要

      resource_config.json ファイルは HyperPod プラットフォームによって自動生成されるため、作成NOTする必要があります。次のコードは、前のステップ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" } ] } ] }
    3. lifecycle_script.py – これは、プロビジョニング中に HyperPod クラスターで Slurm をセットアップするライフサイクルスクリプトをまとめて実行するメイン Python スクリプトです。このスクリプトは、 で指定または識別されたパスprovisioning_parameters.jsonresource_config.jsonを読み取りon_create.sh、関連情報を各ライフサイクルスクリプトに渡してから、ライフサイクルスクリプトを順番に実行します。

      ライフサイクルスクリプトは、Slurm のセットアップ、ユーザーの作成、Conda または Docker のインストールなど、クラスターの作成中にソフトウェアパッケージをインストールしたり、必要な設定やカスタム設定をセットアップしたりするためにカスタマイズできる完全な柔軟性を持つスクリプトのセットです。サンプルlifecycle_script.pyスクリプトは、Slurm deamons (start_slurm.sh) の起動、Amazon FSx for Lustre () のマウント、MariaDB アカウンティング (mount_fsx.sh) とアカRDSウンティング (setup_mariadb_accounting.sh) の設定など、リポジトリで他のベースライフサイクルスクリプトを実行する準備ができていますsetup_rds_accounting.sh。また、スクリプトを追加し、同じディレクトリにパッケージ化し、コード行を に追加lifecycle_script.pyして、スクリプト HyperPod の実行を許可することもできます。ベースライフサイクルスクリプトの詳細については、Awsome Distributed Training GitHub リポジトリ「3.1 Lifecycle scripts」も参照してください。

      注記

      HyperPod はクラスターの各インスタンスSageMaker HyperPod DLAMIで実行され、 AMIには、クラスターと HyperPod機能間の互換性に準拠したソフトウェアパッケージがプリインストールされています。事前にインストールされたパッケージのいずれかを再インストールする場合、互換性のあるパッケージをインストールする責任があり、一部の HyperPod 機能が期待どおりに動作しない場合があることに注意してください。

      デフォルト設定に加えて、以下のソフトウェアをインストールするためのスクリプトがutilsフォルダで利用できます。lifecycle_script.py ファイルには、インストールスクリプトを実行するためのコード行を含める準備が既にできているため、以下の項目を参照して行を検索し、コメントを解除してアクティブ化します。

      1. 次のコード行は、Docker Enroot 、および Pyxis をインストールするためのものです。これらのパッケージは、Slurm クラスターで Docker コンテナを実行するために必要です。

        このインストールステップを有効にするには、 config.py ファイルTrueenable_docker_enroot_pyxisパラメータを に設定します。

        # 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)
      2. HyperPod クラスターを Amazon Managed Service for Prometheus および Amazon Managed Grafana と統合して、クラスターおよびクラスターノードに関するメトリクスを HyperPod Amazon Managed Grafana ダッシュボードにエクスポートできます。メトリクスをエクスポートし、Amazon Managed Grafana の Slurm ダッシュボード NVIDIADCGMエクスポーターダッシュボード 、およびEFAメトリクスダッシュボードを使用するには、Prometheus の Slurm エクスポーター NVIDIADCGMエクスポーター 、およびEFAノードエクスポーター をインストールする必要があります。エクスポーターパッケージのインストールと Amazon Managed Grafana ワークスペースでの Grafana ダッシュボードの使用の詳細については、「」を参照してくださいSageMaker HyperPod クラスターリソースのモニタリング

        このインストールステップを有効にするには、 config.py ファイルTrueenable_observabilityパラメータを に設定します。

        # 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()
  3. ステップ 2 のすべての設定ファイルとセットアップスクリプトを、ステップ 1CreateClusterリクエストで指定した S3 バケットにアップロードしてください。例えば、 に次のcreate_cluster.jsonものがあるとします。

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

    次に、 には、on_create.shlifecycle_script.pyprovisioning_parameters.json、、およびその他のすべてのセットアップスクリプトが含まれている"s3://sagemaker-hyperpod-lifecycle/src"必要があります。次のように、ローカルフォルダにファイルを準備したとします。

    └── 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