SageMaker HyperPod での Slurm クラスターでのユーザーの作成 - Amazon SageMaker AI

View a markdown version of this page

SageMaker HyperPod での Slurm クラスターでのユーザーの作成 - Amazon SageMaker AI

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

SageMaker HyperPod での Slurm クラスターでのユーザーの作成

SageMaker HyperPod 上の Slurm クラスターのノード間で POSIX ユーザーを作成する方法は 3 つあります。これらは、ユーザーが作成されるタイミングと、管理する必要があるライフサイクル設定の量によって異なります。最も簡単なものから高度なものまで、クラスターとワークフローに一致するオプションを選択します。

オプション 次の用途に適しています ライフサイクル設定が必要 ユーザーの作成時 スケールアップまたはノード交換の動作
オプション A: ユーザー作成ユーティリティスクリプトを使用してユーザーを追加する ライフサイクル設定に影響を与えずに、既に InService であるクラスターにユーザーを追加する なし スクリプトを実行するたびにオンデマンドで 手動。ユーザーは自動的に適用されません。ノードが追加または置き換えられるたびに (自動または手動で) スクリプトを再実行します。
オプション B: add-users拡張機能スクリプトを使用してユーザーを追加する ユーザーを自動的にプロビジョニングする AMI ベースのライフサイクル設定済みクラスター ユーザー拡張スクリプトを追加する ノードのプロビジョニング中自動的に - クラスターの作成時、ノードの追加 (スケールアップ)、AMI の更新、ノードの交換時。 自動。拡張機能は、ライフサイクルスクリプト Amazon S3 バケットのユーザーファイルを使用して、プロビジョニング中に新しいノードごとに実行されます。
オプション C: 基本ライフサイクルスクリプトを使用してユーザーを追加する 既に完全なカスタムベースライフサイクルスクリプトセットを使用しているクラスター フルカスタムライフサイクルスクリプトセット ノードのプロビジョニング中自動的に - クラスターの作成時、ノードの追加 (スケールアップ)、AMI の更新、ノードの交換時。 自動。基本ライフサイクルスクリプトは、ライフサイクルスクリプト Amazon S3 バケットのユーザーファイルを使用して、プロビジョニング中に新しい各ノードで実行されます。

3 つのオプションはすべて、SageMaker HyperPod サービスチームが GitHub ウェブサイトの Awsome Distributed Training リポジトリで提供するスクリプトを使用します。

オプション A: ユーザー作成ユーティリティスクリプトを使用してユーザーを追加する

これは最も簡単なオプションであり、ライフサイクル設定は必要ありません。クラスターが既に InService であり、今すぐユーザーを追加する場合に使用します。コントローラーノードの GitHub ウェブサイトで create_users.sh ユーティリティスクリプトを実行して、1 回の実行ですべてのノードにユーザーを作成します。このスクリプトは、クラスター設定ファイルから他のノードを自動検出し、SSH 経由でユーザーを作成し、大規模なクラスターにスケールするようにコンピューティングノードを並行して設定します。このスクリプトは、次の優先順位で、渡す引数と現在のディレクトリに存在するファイルによって選択されたユーザーを指定するための 3 つのモードをサポートしています。

  • コマンドラインモード — ユーザー名を引数として渡し、スクリプトによって UIDs が自動的に割り当てられます。これは、ユーザーを追加する最も簡単な方法です。

  • ファイルモード — スクリプトは、現在のディレクトリの shared_users.txt (CSV) ファイルまたは shared_users.yaml (YAML) ファイルからユーザー定義を読み取ります。

  • インタラクティブモード — スクリプトはユーザー名と、オプションで UIDs。

重要

すべてのモードでは、 は実行時に存在するノードにのみユーザーcreate_users.shを作成します。これには、ローカル shared_users.txtまたは を使用するファイルモードが含まれますshared_users.yaml。後でスケールアップまたはノード置換によって追加されたノードでは、ユーザーは自動的に再作成されません。これらは、POSIX アカウントを持たない新しいルートボリュームで新しいノードが起動するプロビジョニングイベントです。(共有ファイルシステムのホームディレクトリと SSH キーは存続しますが、ユーザーアカウント自体は存続しません)。新しいノードを追加create_users.shした後に再実行して、ノードをインラインにします。

スクリプトの再実行は安全です。コントローラーノードで実行します。他のクラスターノードを検出し、1 回の実行でクラスター全体にユーザーを適用します。これはノードごとにべき等です。欠落している場合にのみユーザーを作成し、既にユーザーを変更していないノードを残します。したがって、ノードを追加した後の再実行は新しいノードにのみ影響します。

新しいノードにユーザーを自動的に受信させるには、ユーザーファイルをクラスターのライフサイクル設定の一部にして、プロビジョニング中に実行する必要があります。ライフサイクルスクリプトの Amazon S3 バケットに shared_users.txtまたは shared_users.yaml ファイルを保存し、 オプション B: add-users拡張機能スクリプトを使用してユーザーを追加するまたは で使用しますオプション C: 基本ライフサイクルスクリプトを使用してユーザーを追加するcreate_users.sh は、作成したすべてのユーザーを追加して Amazon S3 にアップロードするshared_users.txtのに役立ちますが、それ自体はどのモードでも、プロビジョニングイベント全体でユーザーを永続化しません。

ユーザーごとに、スクリプトは次のとおりです。

  • すべてのノードで一貫した UID を持つ POSIX ユーザーを作成します。

  • 共有ファイルシステムにホームディレクトリを作成します ( の OpenZFS /homeまたは の Amazon FSx for Lustre を自動検出)/fsx

  • パスワードレスノード間 SSH 用の SSH キーペアを共有ファイルシステムに生成します。

  • ユーザーをdockerグループに追加します (オプションで sudo アクセスを付与します)。

  • ユーザーがジョブを送信できるように、コントローラーで Slurm アカウンティングにユーザーを登録します。

  • 新しいユーザーをshared_users.txtファイルに追加し、オプションで Amazon S3 にアップロードして、他のオプションで再利用できるようにします。

前提条件

開始する前に、次の要件が満たされていることを確認してください。

  • クラスターは InService であり、コントローラーノードに接続できます。「SageMaker HyperPod クラスターノードへのアクセス」を参照してください。

  • jq はコントローラーノードにインストールされます。

  • SSH アクセスは、コントローラーノードから他のすべてのノードに利用できます (HyperPod はこれをデフォルトユーザーに設定します)。

create_users.sh ユーティリティスクリプトを使用してユーザーを追加するには

以下の手順を実行します。

  1. コントローラーノードに接続し、スクリプトをダウンロードします。sudo アクセス許可で実行してください。

    $ curl -O https://raw.githubusercontent.com/awslabs/awsome-distributed-training/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/utils/create_users.sh chmod +x create_users.sh
  2. 3 つのモードのいずれかを使用してスクリプトを実行します。このモードは、渡した引数と現在のディレクトリ内のファイルから優先度で選択します。最初にコマンドライン引数、次にユーザーファイル、次にインタラクティブプロンプトです。すべてのモードが同じシーケンスを実行します。現在のノードでユーザーを作成し、共有ファイルシステムで SSH キーペアを設定し、残りのすべてのノード (コンピューティングノードと並列) でユーザーを作成し、コントローラーで Slurm アカウンティングに登録して、 に追加しshared_users.txt、そのファイルを Amazon S3 にアップロードすることを に提案します。

    次の例では、3 つのモードについて説明し、それぞれに 2 人のユーザー (user1 と ) を追加しますuser2

    コマンドラインモード

    ユーザー名を引数として渡します。スクリプトは UIDsし、新しいユーザーを sudoers にするかどうかをプロンプトします。これは、ユーザーを追加する最も簡単な方法です。

    $ sudo ./create_users.sh user1 user2

    スクリプトはユーザー名を検証し、sudoer アクセスを求めます。

    ======================================== Step 1: User Configuration ======================================== Users from CLI args: user1 user2 ✓ user1 — will be created (auto-assign UID) ✓ user2 — will be created (auto-assign UID) Make these user(s) sudoer(s)? (y/N): n

    次に、現在のノードにユーザーを作成し、SSH キーペアを設定し、コンピューティングノードに作成し、コントローラーの Slurm アカウンティングに登録して、 を書き込みshared_users.txt、最後にそのファイルを Amazon S3 にアップロードするよう促します。

    ファイルモード

    スクリプトと同じディレクトリにユーザーファイルを作成し、引数なしでスクリプトを実行します。このスクリプトは、ユーザー定義を読み取り、検証し (存在しないユーザーのみを作成し、UID 競合をスキップする)、すべてのノードにユーザーを作成します。スクリプトは 2 つのファイル形式を受け入れます。

    の場合shared_users.txt、CSV ファイルを 形式で 1 行に 1 人のユーザーで使用しますusername,uid,home_directory

    user1,2001,/fsx/user1 user2,2002,/fsx/user2

    または、 の場合はshared_users.yaml、ユーザーまたはグループに分類されたユーザーの簡単なリストを含む YAML ファイルを使用します。この形式を解析するには、ノードで PyYAML が必要です。以下はシンプルなリスト形式です。

    users: - username: user1 uid: 2001 - username: user2 uid: 2002

    両方のファイルが存在する場合、 shared_users.txtが優先されます。引数なしでスクリプトを実行します。

    $ sudo ./create_users.sh

    このスクリプトは、ファイルエントリを検証し、作成を確認し、sudoer アクセスのプロンプトを表示し、ファイルにないユーザーを追加することを に提案します。次に、 ファイル (2001 および 2002) から UIDs を持つすべてのノードuser1user2で と を作成し、SSH キーペアを設定し、Slurm アカウンティングに登録して、 を更新しますshared_users.txt

    インタラクティブ動画

    引数やユーザーファイルなしでスクリプトを実行します。このスクリプトでは、ユーザー名と、オプションで割り当てる UIDsの入力を求められます。

    $ sudo ./create_users.sh
    ======================================== Step 1: User Configuration ======================================== No shared_users.txt or shared_users.yaml found. Entering interactive mode... Enter username(s), comma-separated (e.g. 'sean' or 'sean,alice,bob'): user1,user2 Specify UIDs? (Enter for auto-assign, or comma-separated UIDs): 2001,2002 Make these user(s) sudoer(s)? (y/N): n

    プロンプトに応答すると、スクリプトは入力した UIDs を持つすべてのノードuser2user1と を作成し、SSH キーペアを設定し、Slurm アカウンティングに登録して、 を更新しますshared_users.txt

  3. ユーザーに切り替えてクラスター全体でコマンドを実行して、ユーザーをテストします。

    $ sudo su - user1 && ssh $(srun hostname)
注記

スクリプトはべき等です。既存のユーザーはスキップされ、既存の SSH キーと Slurm アカウンティングの関連付けはそのままになるため、再実行しても安全です。

オプション B: add-users拡張機能スクリプトを使用してユーザーを追加する

このオプションは、クラスターが AMI ベースの設定を使用していて、ユーザーを自動的にプロビジョニングする場合に使用します。拡張機能ライフサイクルオプションを使用すると、SageMaker HyperPod はまず完全な AMI ベースの設定を実行し、次に拡張機能スクリプトを実行します。サービスチームは、GitHub ウェブサイトの Awsome Distributed Training リポジトリの Extensions フォルダにready-to-use add-users 拡張機能を提供します。拡張機能はノードのプロビジョニング中に実行されるため、クラスターの作成時にユーザーが自動的に作成され、スケールアウト中に追加された新しいノードにも再度作成されます。

拡張機能の設定の詳細については、以下を参照してください。

add-users 拡張機能は、一貫した UIDs を持つ POSIX ユーザーを作成し、共有ファイルシステムにホームディレクトリを設定し、パスワードレスノード間 SSH の SSH キーペアを生成し、コントローラーで Slurm アカウンティングにユーザーを登録します。次の 2 つの入力形式を使用できます。

  • shared_users.txt — 基本ライフサイクルスクリプトで使用されるのと同じ CSV 形式 (username,uid,/fsx/username)。すべてのユーザーが Slurm root アカウントに追加されます。

  • shared_users.yaml — グループごとの Slurm アカウントとファイルシステムマウントを使用してユーザーをグループに整理することをサポートする YAML 形式。グループは組織のみであり、Linux グループは作成されません。

グループ形式shared_users.yamlを使用する例を次に示します。

groups: - name: research slurm_account: research users: - username: user1 uid: 2001 - username: user2 uid: 2002 - name: platform slurm_account: platform users: - username: user3 uid: 3001
クラスターの作成時に add-users拡張機能を持つユーザーを追加するには

以下の手順を実行します。

  1. add-users ディレクトリの適切なサンプルファイルをコピーし、ユーザーで編集します。

    $ cp shared_users_sample.yaml shared_users.yaml
  2. add-users ディレクトリをライフサイクルスクリプト Amazon S3 バケットにアップロードします (バケットパスは で始まる必要がありますs3://sagemaker-)。

    $ aws s3 cp add-users/ s3://DOC-EXAMPLE-BUCKET/add-users/ --recursive
  3. OnInitComplete スクリプトadd_users.shとして を使用して、CreateClusterリクエストの LifeCycleConfigブロックで拡張機能を指定します。

    "LifeCycleConfig": { "OnInitComplete": "add_users.sh", "SourceS3Uri": "s3://DOC-EXAMPLE-BUCKET/add-users/" }
ヒント

ユーザー作成 (オブザーバビリティなど) に加えてクラスターに複数の機能が必要な場合は、拡張機能フォルダ全体をアップロードし、run_extensions.shオーケストレーターを拡張機能スクリプトとして使用します。各機能を有効にする ENABLE_ADD_USERS="true" などのシンプルなブールトグルを提供します。詳細については、「を使用した SageMaker HyperPod の開始方法 AWS CLI」を参照してください。

作成後に既存のクラスターにユーザーを追加するには

拡張機能はノードのプロビジョニング中にのみ実行されるため、すでに実行されているノードにユーザーを追加するには、拡張機能を手動で実行する必要があります。

  1. ユーザーファイルを新しいユーザーで更新し (ファイル内の既存のユーザーを保持)、Amazon S3 にアップロードします。

    $ aws s3 cp add-users/shared_users.yaml s3://DOC-EXAMPLE-BUCKET/add-users/shared_users.yaml
  2. コントローラーノードに接続し、スクリプトを共有ファイルシステムにプルします。

    $ sudo mkdir -p /fsx/cluster-scripts/add-users sudo aws s3 cp s3://DOC-EXAMPLE-BUCKET/add-users/ /fsx/cluster-scripts/add-users/ --recursive sudo chmod +x /fsx/cluster-scripts/add-users/*.sh
  3. コントローラーで 拡張機能を実行します。

    $ sudo bash /fsx/cluster-scripts/add-users/add_users.sh
  4. を使用してコンピューティングノードで 拡張機能を実行しますsrun

    $ sudo srun --partition=partition-name bash /fsx/cluster-scripts/add-users/add_users.sh

スクリプトは既存のユーザーをスキップし、新しいユーザーのみを作成します。これらはべき等です。

オプション C: 基本ライフサイクルスクリプトを使用してユーザーを追加する

このオプションは、クラスターがプロビジョニングシーケンス全体を所有する完全なカスタムベースライフサイクルスクリプトセットを既に使用している場合にのみ使用します。これは、単一の拡張機能ではなく完全なライフサイクルスクリプトセットを管理するため、最も高度なオプションです。サービスチームは、GitHub ウェブサイトの add_users.sh スクリプトを、base-config ライフサイクルスクリプトセット内の 1 つのスクリプトとして提供します。クラスターの作成、クラスターの更新、またはクラスターソフトウェアの更新中、ライフサイクルスクリプトランナー (lifecycle_script.py) は を実行します。これによりadd_users.shshared_users.txtファイルが読み取られ、ユーザーとそのホームディレクトリが作成されます。

このオプションでは、 は POSIX ユーザーとホームディレクトリの作成のみadd_users.shを処理します。パスワードレスノード間 SSH の SSH キーペア生成は、基本ライフサイクルスクリプトセット ( などgen-keypair-ubuntu.sh) の別のモジュールであり、ライフサイクルスクリプトランナーはフルセットの一部として呼び出します。ユーザーが共有ファイルシステムでキーペアを取得できるように、SSH キーモジュールがライフサイクルスクリプトセットに含まれていることを確認します。

完全なカスタムライフサイクルスクリプトセットの設定の詳細については、以下を参照してください。

  • AWS コンソールを使用してライフサイクルスクリプトを設定するには、「カスタムセットアップ」の「ライフサイクル設定 - オプション」を参照してください。

  • API を使用してライフサイクルスクリプトを設定するには、「クラスターの作成」の「オプション C: OnCreate による完全なカスタムコントロール」を参照してください。

Slurm クラスターの作成中にユーザーを作成するには

以下の手順を実行します。

  1. GitHub ウェブサイトから base-config ライフサイクルスクリプトセットをダウンロードします。このオプションでは、 だけでなく、base-config フォルダ全体をライフサイクルスクリプトセットとしてアップロードしますadd_users.sh

  2. base-config フォルダで、次の形式で という名前shared_users.txtのテキストファイルを作成または編集します。最初の列はユーザー名、2 番目の列は一意のユーザー ID、3 番目の列は Amazon FSx 共有スペースのユーザーディレクトリです。

    username1,uid1,/fsx/username1 username2,uid2,/fsx/username2 ...

    add_users.sh は同じフォルダshared_users.txtから読み取るため、ファイルはスクリプトとともに base-config 内にある必要があります。

  3. ベース設定フォルダ全体を HyperPod ライフサイクルスクリプトの Amazon S3 バケットにアップロードします。クラスターの作成、クラスターの更新、またはクラスターソフトウェアの更新の進行中、ライフサイクルスクリプトランナーは を実行しadd_users.sh、ユーザーとそのホームディレクトリを読み取りshared_users.txt、セットアップします。

注記

add_users.sh は共有ファイルシステムを自動的に検出します。OpenZFS がマウントされている場合/home、そこにホームディレクトリが作成されます。それ以外の場合は、Amazon FSx for Lustre パスを使用します。