翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
SageMaker HyperPod ライフサイクル設定のベストプラクティス
SageMaker HyperPod は、常に up-and-running コンピューティングクラスターを提供します。これは、クラスターリソースの設定 SageMaker HyperPod 方法を指示するライフサイクルスクリプトを記述できるため、高度にカスタマイズ可能です。以下のトピックは、オープンソースのワークロードマネージャーツールで SageMaker HyperPod クラスターをセットアップするためのライフサイクルスクリプトを準備するためのベストプラクティスです。
で Slurm を設定するためのライフサイクルスクリプトを準備する SageMaker HyperPod
以下のトピックでは、 で Slurm
トピック
大まかな概要
次の手順は、クラスターをプロビジョニングし、 HyperPodSlurm で設定する主な流れです。ステップはボトムアップアプローチの順に並べられます。
-
HyperPod クラスターに Slurm ノードを作成する方法を計画します。例えば、2 つの Slurm ノードを設定する場合は、 HyperPod クラスターに 2 つのインスタンスグループを設定する必要があります。
-
である
provisioning_parameters.json
ファイルを準備しますに Slurm ノードをプロビジョニングするための設定フォーム HyperPod HyperPod。 には、クラスターでプロビジョニングする Slurm ノード設定情報が含まれているprovisioning_parameters.json
必要があります。これは、ステップ 1 の Slurm ノードの設計を反映する必要があります。 -
で Slurm をセットアップしてソフトウェアパッケージをインストールし、ユースケースに合わせてクラスターに環境をセットアップ HyperPod するライフサイクルスクリプトのセットを準備します。ライフサイクルスクリプトを中央 Python スクリプト (
lifecycle_script.py
) の順序でまとめて実行し、エントリポイントシェルスクリプト (on_create.sh
) を記述して Python スクリプトを実行する必要があります。エントリポイントシェルスクリプトは、ステップ 5 で後述する HyperPod クラスター作成リクエストに提供する必要があります。また、クラスターの作成時に によって HyperPod生成される
resource_config.json
ことが予想されるスクリプトを記述する必要があります。resource_config.json
には HyperPod、IP アドレス、インスタンスタイプ、ARNsなどのクラスターリソース情報が含まれており、Slurm の設定に使用する必要があります。 -
前のステップのすべてのファイルをフォルダに収集します。
└── 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 バケットにアップロードします。S3 バケットパスをコピーして保持します。プレフィックス で始まる S3 バケットパスのみを許可する でアの IAM ロール SageMaker HyperPodタッチされた を選択する必要がある
sagemaker-
ためAmazonSageMakerClusterInstanceRolePolicy、 で始まる S3 バケットパスを作成する必要がありますsagemaker-
。次のコマンドは、すべてのファイルを S3 バケットにアップロードするコマンドの例です。aws s3 cp --recursive
./lifecycle_files
s3://sagemaker-hyperpod-lifecycle/src
-
HyperPod クラスター作成リクエストを準備します。
-
オプション 1: を使用する場合は AWS CLI、「」の手順に従って、クラスター作成リクエストを JSON 形式 (
create_cluster.json
) で書き込みます新しいクラスターを作成する。 -
オプション 2: SageMaker コンソール UI を使用する場合は、「」の手順に従って、 HyperPod コンソール UI でクラスター作成リクエストフォームに入力します SageMaker HyperPod クラスターを作成する。
この段階では、ステップ 1 と 2 で計画したのと同じ構造でインスタンスグループを作成してください。また、リクエストフォームでステップ 5 で S3 バケットを指定していることを確認してください。
-
-
クラスター作成 request. HyperPod provisions リクエストに基づいてクラスターを送信し、 HyperPod クラスターインスタンスに
resource_config.json
ファイルを作成し、ライフサイクルスクリプトを実行しているクラスターに Slurm を設定します。
次のセクションでは、 HyperPod クラスターの作成時に設定ファイルとライフサイクルスクリプトを適切に機能させる方法の詳細を説明します。
が提供する基本ライフサイクルスクリプトから開始する HyperPod
このセクションでは、トップダウンアプローチ HyperPod で で Slurm を設定する基本的なフローのすべてのコンポーネントについて説明します。CreateCluster
API を実行するための HyperPod クラスター作成リクエストの準備から始まり、階層構造をライフサイクルスクリプトにまで掘り下げます。Awsome 分散トレーニング GitHub リポジトリ
git clone https://github.com/aws-samples/awsome-distributed-training/
で SageMaker HyperPod Slurm クラスターを設定するための基本ライフサイクルスクリプトは、 で入手できます1.architectures/5.sagemaker_hyperpods/LifecycleScripts/base-config
cd awsome-distributed-training/1.architectures/5.sagemaker_hyperpods/LifecycleScripts/base-config
次のフローチャートは、基本ライフサイクルスクリプトの設計方法の詳細な概要を示しています。以下の図と手順ガイドでは、API コール中の HyperPod CreateCluster
動作について説明します。
![](images/hyperpod-lifecycle-structure.png)
provisioning_parameters.json
とライフサイクルスクリプトから始まります。その後、これらは集合実行lifecycle_script.py
のために順番に でコーディングされます。また、lifecycle_script.py
スクリプトの実行は、 HyperPod インスタンスターミナルで実行されるon_create.sh
シェルスクリプトによって行われます。(2) 実線の矢印は、メイン HyperPod クラスター作成フローと、ボックスが「 を呼び出す」または「 に送信する」方法を示しています。 on_create.sh
は、 create_cluster.json
またはコンソール UI のクラスター作成リクエストフォームのいずれかで必要です。リクエストを送信すると、 はリクエストとライフサイクルスクリプトから指定された設定情報に基づいて CreateCluster
API HyperPod を実行します。(3) 点線の矢印は、クラスターリソースのプロビジョニング中に HyperPod プラットフォームがクラスターインスタンスresource_config.json
に を作成することを示します。 resource_config.json
には、 HyperPod クラスター ARN、インスタンスタイプ、IP アドレスなどのクラスターリソース情報が含まれています。クラスターの作成時に resource_config.json
ファイルを想定するようにライフサイクルスクリプトを準備する必要があることに注意してください。詳細については、以下の手順ガイドを参照してください。以下の手順ガイドでは、 HyperPod クラスターの作成中に何が起こるか、および基本ライフサイクルスクリプトの設計方法について説明します。
-
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
。代わりに、「クラスターの作成」送信フォームに正しいクラスター設定情報を指定してください。 -
on_create.sh
– インスタンスグループごとに、コマンドの実行、ソフトウェアパッケージのインストールスクリプトの実行on_create.sh
、Slurm による HyperPod クラスター環境の設定を行うためのエントリポイントシェルスクリプト を指定する必要があります。準備する必要がある 2 つのことは、Slurm をセットアップ HyperPod するために がprovisioning_parameters.json
必要とする と、ソフトウェアパッケージをインストールするための一連のライフサイクルスクリプトです。このスクリプトは、 のサンプルスクリプトに示すように、次のファイルを検索して実行するように記述する必要がありますon_create.sh
。 注記
ライフサイクルスクリプトのセット全体を、 で指定した S3 の場所にアップロードしてください
create_cluster.json
。また、provisioning_parameters.json
を同じ場所に配置する必要があります。-
provisioning_parameters.json
– これは ですに Slurm ノードをプロビジョニングするための設定フォーム HyperPod。このon_create.sh
スクリプトは、この JSON ファイルを検索し、そのパスを識別するための環境変数を定義します。この JSON ファイルを使用して、Slurm が通信する Amazon FSx for Lustre などの Slurm ノードとストレージオプションを設定できます。ではprovisioning_parameters.json
、 で指定した名前を使用して HyperPod クラスターインスタンスグループcreate_cluster.json
を、設定方法に基づいて適切に Slurm ノードに割り当てます。次の図は、インスタンス HyperPod グループを Slurm ノードに割り当てるために 2 つの JSON 設定ファイル
create_cluster.json
と をprovisioning_parameters.json
書き込む方法の例を示しています。この例では、コントローラー (管理) ノード、ログインノード (オプション)、コンピューティング (ワーカー) ノードの 3 つの Slurm ノードを設定するケースを想定しています。ヒント
これら 2 つの JSON ファイルを検証しやすくするために、 HyperPod サービスチームは検証スクリプト を提供します
validate-config.py
。詳細については、「で Slurm クラスターを作成する前に JSON 設定ファイルを検証する HyperPod」を参照してください。 図: クラスター作成create_cluster.json
と HyperPod Slurm 設定provisiong_params.json
の を直接比較します。のインスタンスグループの数は、Slurm ノードとして設定するノードの数と一致するcreate_cluster.json
必要があります。図の例では、3 つのインスタンスグループの HyperPod クラスターに 3 つの Slurm ノードが設定されます。それに応じてインスタンスグループ名を指定して、 HyperPod クラスターインスタンスグループを Slurm ノードに割り当てる必要があります。 -
resource_config.json
– クラスターの作成中に、lifecycle_script.py
スクリプトは からのresource_config.json
ファイルを期待するように書き込まれます HyperPod。このファイルには、インスタンスタイプや IP アドレスなど、クラスターに関する情報が含まれています。CreateCluster
API を実行すると、 は ファイル/opt/ml/config/resource_config.json
に基づいて にリソース設定create_cluster.json
ファイル HyperPod を作成します。ファイルパスは、 という名前の環境変数に保存されます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" } ] } ] }
-
lifecycle_script.py
– これは、プロビジョニング中に HyperPod クラスターで Slurm をセットアップするライフサイクルスクリプトをまとめて実行する主要な Python スクリプトです。このスクリプトは、 で指定または識別されるパスprovisioning_parameters.json
resource_config.json
との間で読み取りを行いon_create.sh
、関連情報を各ライフサイクルスクリプトに渡してから、ライフサイクルスクリプトを順番に実行します。ライフサイクルスクリプトは、Slurm のセットアップ、ユーザーの作成、Conda や Docker のインストールなど、クラスターの作成時にソフトウェアパッケージのインストールや、必要な設定やカスタム設定のカスタマイズを柔軟に行えるスクリプトのセットです。サンプル
lifecycle_script.py
スクリプトは、Slurm デーモンの起動 ( start_slurm.sh
)、Amazon FSx for Lustre のマウント ( mount_fsx.sh
)、MariaDB アカウンティング () と RDS アカウンティング ( setup_mariadb_accounting.sh
) の設定など、リポジトリで他の基本ライフサイクルスクリプトを実行する準備ができています setup_rds_accounting.sh
。また、スクリプトを追加し、同じディレクトリにパッケージ化し、コード行を に追加 lifecycle_script.py
して、 がスクリプト HyperPod を実行できるようにすることもできます。基本ライフサイクルスクリプトの詳細については、Awsome Distributed Training リポジトリの「3.1 Lifecycle scripts」も参照してください。 GitHub デフォルトのセットアップに加えて、
utils
フォルダで以下のソフトウェアをインストールするためのスクリプトも追加されています。 lifecycle_script.py
ファイルはすでにインストールスクリプトを実行するためのコード行を含める準備ができているため、以下の項目を参照して行を検索し、コメントを解除してアクティブ化します。-
次のコード行は、Docker
、Enroot 、および Pyxis のインストール用です。これらのパッケージは、Slurm クラスターで Docker コンテナを実行するために必要です。 このインストールステップを有効にするには、
config.py
ファイル True
でenable_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)
-
HyperPod クラスターを Amazon Managed Service for Prometheus および Amazon Managed Grafana と統合して、クラスターとクラスターノードに関するメトリクスを HyperPod Amazon Managed Grafana ダッシュボードにエクスポートできます。メトリクスをエクスポートし、Amazon Managed Grafana の Slurm ダッシュボード
、NVIDIA DCGM Exporter ダッシュボード 、EFA Metrics ダッシュボード を使用するには、Prometheus の Slurm Exporter 、NVIDIA DCGM Exporter 、および EFA ノードエクスポーター をインストールする必要があります。Amazon Managed Grafana ワークスペースでのエクスポーターパッケージのインストールと Grafana ダッシュボードの使用の詳細については、「」を参照してください SageMaker HyperPod クラスターリソースのモニタリング。 このインストールステップを有効にするには、
config.py
ファイル True
でenable_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()
-
-
ステップ 2 のすべての設定ファイルとセットアップスクリプトを、ステップ 1 の
CreateCluster
リクエストで指定した S3 バケットにアップロードしてください。 例えば、 に次のcreate_cluster.json
ものがあるとします。"LifeCycleConfig": { "SourceS3URI": "
s3://sagemaker-hyperpod-lifecycle/src
", "OnCreate": "on_create.sh
" }次に、 には、
on_create.sh
、lifecycle_script.py
provisioning_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
Slurm 設定ファイルで HyperPod 管理される特定の設定
で Slurm クラスターを作成すると HyperPod、 HyperPod エージェントは で slurm.conf
gres.conf
/opt/slurm/etc/
を管理します。次のリストは、 HyperPod エージェントが処理および上書きする特定のパラメータを示しています。
重要
によって管理されるこれらのパラメータは変更しないことを強くお勧めします HyperPod。
-
HyperPod では
slurm.conf
、、、 ClusterName
、、SlurmctldHost
および の基本的なパラメータを設定しますPartitionName
NodeName
。また、 自動再開機能を有効にするには、 に パラメータ
TaskPlugin
とSchedulerParameters
パラメータが次のように設定 HyperPod されている必要があります。 HyperPod エージェントは、デフォルトで必要な値を使用してこれら 2 つのパラメータを設定します。TaskPlugin=task/none SchedulerParameters=permit_job_expansion
-
HyperPod では
gres.conf
、GPU ノード NodeName
を管理します。
Amazon FSx for Lustre を HyperPod クラスターにマウントする
Amazon FSx for Lustre 共有ファイルシステムを HyperPod クラスターにマウントするには、以下を設定します。
-
Amazon VPC を使用します。
-
HyperPod クラスターインスタンスが VPC 内で通信するには、 を の IAM ロール(オプション) Amazon Virtual Private Cloud SageMaker HyperPod で を使用するための追加のアクセス許可にアタッチしてください SageMaker HyperPod。
-
に
create_cluster.json
、次の VPC 情報を含めます。"VpcConfig": { "SecurityGroupIds": [ "
string
" ], "Subnets": [ "string
" ] }Amazon VPC のセットアップに関するその他のヒントについては、「」を参照してください(オプション) Amazon VPC SageMaker HyperPod で をセットアップする。
-
-
Amazon FSx for Lustre で Slurm の設定を完了するには、 が提供する基本ライフサイクルスクリプトから開始する HyperPodセクションの図
provisioning_parameters.json
に示すように、 で Amazon FSx DNS 名と Amazon FSx マウント名を指定します。Amazon FSx の情報は、アカウントの Amazon FSx for Lustre コンソールから、または次の AWS CLI コマンド を実行して確認できますaws fsx describe-file-systems
。"fsx_dns_name": "
fs-12345678a90b01cde
.fsx.us-west-2
.amazonaws.com", "fsx_mountname": "1abcdefg
"
で Slurm クラスターを作成する前に JSON 設定ファイルを検証する HyperPod
クラスター作成リクエストを送信する前に JSON 設定ファイルを検証するには、設定検証スクリプト を使用しますvalidate-config.py
create_cluster.json
および provisioning_parameters.json
ファイルを検証するには、次のように検証スクリプトを実行します。
python3 validate-config.py --cluster-config
create_cluster.json
--provisioning-parametersprovisioning_parameters.json
以下は、検証が成功した場合の出力例です。
✔️ Validated instance group name worker-group-1 is correct ... ✔️ Validated subnet subnet-012345abcdef67890 ... ✔️ Validated security group sg-012345abcdef67890 ingress rules ... ✔️ Validated security group sg-012345abcdef67890 egress rules ... ✔️ Validated FSx Lustre DNS name fs-012345abcdef67890.fsx.us-east-1.amazonaws.com ✔️ Validated FSx Lustre mount name abcdefgh ✅ Cluster Validation succeeded
で Slurm クラスターで本番ワークロードを実行する前にランタイムを検証する HyperPod
で Slurm クラスターで本番ワークロードを実行する前にランタイムを確認するには HyperPod、ランタイム検証スクリプト を使用しますhyperpod-precheck.py
複数のノードでスクリプトを一度に実行するには、次のコマンド例srun
に示すように、8 ノードの Slurm クラスターでスクリプトを実行する を使用します。
# The following command runs on 8 nodes srun -N
8
python3 hyperpod-precheck.py
注記
スクリプトが提供するランタイム検証関数や、検証に合格しない問題を解決するためのガイドラインなど、検証スクリプトの詳細については、「Awsome Distributed Training GitHub リポジトリ」の「ワークロードを実行する前にランタイム検証
クラスターノードでインタラクティブにライフサイクルスクリプトを開発する
このセクションでは、 HyperPod クラスターを繰り返し作成および削除することなく、ライフサイクルスクリプトをインタラクティブに開発する方法について説明します。
-
基本ライフサイクルスクリプトを使用して HyperPod クラスターを作成します。
-
クラスターノードにログインします。
-
ノードでスクリプト (
configure_xyz.sh
) を編集して繰り返し実行することで、スクリプト () を開発します。-
HyperPod はライフサイクルスクリプトをルートユーザーとして実行するため、開発中に をルートユーザー
configure_xyz.sh
として実行して、スクリプトが で実行されているときに同じ条件でテストされていることを確認することをお勧めします HyperPod。
-
-
次のようなコード行
lifecycle_script.py
を追加して、スクリプトを に統合します。ExecuteBashScript("./utils/
configure_xyz.sh
").run() -
基本ライフサイクルスクリプトのアップロードに最初に使用した S3 バケットに、更新されたライフサイクルスクリプトをアップロードします。
-
新しい HyperPod クラスター
lifecycle_script.py
を作成して、 の統合バージョンをテストします。
新規または更新されたライフサイクルスクリプトでクラスターを更新する
HyperPod ソフトウェアを更新するには 3 つの方法があります。
-
HyperPod ソフトウェアにパッチを適用するための
UpdateClusterSoftware
API は、インスタンスグループ全体でライフサイクルスクリプトを再実行します。 -
UpdateCluster
API は、新しいインスタンスグループのライフサイクルスクリプトのみを実行します。 -
ライフサイクルスクリプトをインスタンスで HyperPod直接実行することもできます。
考慮事項
を使用する場合は、次の点を考慮してください SageMaker HyperPod。
-
HyperPod はクラスターの各インスタンスSageMaker HyperPod DLAMIで実行され、AMI には、クラスターと HyperPod機能間の互換性に準拠するソフトウェアパッケージがプリインストールされています。プリインストールされたパッケージのいずれかを再インストールする場合、互換性のあるパッケージをインストールする責任があり、一部の HyperPod 機能が期待どおりに動作しない場合があることに注意してください。