

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 存取您的 SageMaker HyperPod 叢集節點
<a name="sagemaker-hyperpod-run-jobs-slurm-access-nodes"></a>

您可以使用 SageMaker HyperPod 叢集主機名稱的格式執行 AWS CLI 命令`aws ssm start-session`，透過 AWS Systems Manager (SSM) 存取 **InService** 叢集`sagemaker-cluster:[cluster-id]_[instance-group-name]-[instance-id]`。您可以從 [SageMaker HyperPod 主控台](sagemaker-hyperpod-operate-slurm-console-ui.md#sagemaker-hyperpod-operate-slurm-console-ui-view-details-of-clusters)或是從 [SageMaker HyperPod 的AWS CLI 命令](sagemaker-hyperpod-operate-slurm-cli-command.md#sagemaker-hyperpod-operate-slurm-cli-command-list-cluster-nodes)執行 `describe-cluster` 和 `list-cluster-nodes`，擷取叢集 ID、執行個體 ID 和執行個體群組名稱。例如，如果您的叢集 ID 為 `aa11bbbbb222`、叢集節點名稱為 `controller-group`，而叢集節點 ID 為 `i-111222333444555aa`，則 SSM `start-session` 命令應該如下。

**注意**  
授予使用者 HyperPod 叢集節點的存取權，可讓使用者在節點上安裝和操作使用者受管軟體。確保您維護使用者最低權限許可的原則。  
如果您尚未設定 AWS Systems Manager，請遵循 提供的指示[設定 AWS Systems Manager 和執行為叢集使用者存取控制](sagemaker-hyperpod-prerequisites.md#sagemaker-hyperpod-prerequisites-ssm)。

```
$ aws ssm start-session \
    --target sagemaker-cluster:aa11bbbbb222_controller-group-i-111222333444555aa \
    --region us-west-2
Starting session with SessionId: s0011223344aabbccdd
root@ip-111-22-333-444:/usr/bin#
```

請注意，這最初會將您連線為根使用者。在執行任務之前，請執行下列命令來切換到 `ubuntu` 使用者。

```
root@ip-111-22-333-444:/usr/bin# sudo su - ubuntu
ubuntu@ip-111-22-333-444:/usr/bin#
```

如需 HyperPod 叢集實際使用的進階設定，請參閱下列主題。

**Topics**
+ [存取 SageMaker HyperPod 叢集節點的其他秘訣](#sagemaker-hyperpod-run-jobs-slurm-access-nodes-tips)
+ [透過 Amazon FSx 共用空間設定多使用者環境](#sagemaker-hyperpod-run-jobs-slurm-access-nodes-multi-user-with-fxs-shared-space)
+ [透過將 HyperPod 叢集與 Active Directory 整合來設定多使用者環境](#sagemaker-hyperpod-run-jobs-slurm-access-nodes-multi-user-with-active-directory)

## 存取 SageMaker HyperPod 叢集節點的其他秘訣
<a name="sagemaker-hyperpod-run-jobs-slurm-access-nodes-tips"></a>

**使用 HyperPod 提供的 `easy-ssh.sh` 指令碼來簡化連線程序**

為了將先前的程序變成單行命令，HyperPod 團隊會提供 [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/easy-ssh.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/easy-ssh.sh) 指令碼，擷取叢集資訊、將其彙總到 SSM 命令，以及連線至運算節點。您不需要手動尋找所需的 HyperPod 叢集資訊，因為此指令碼會執行 `describe-cluster` 和 `list-cluster-nodes` 命令，並剖析完成 SSM 命令所需的資訊。下列範例命令顯示如何執行 [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/easy-ssh.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/easy-ssh.sh) 指令碼。如果成功執行，您將以根使用者身分連線到叢集。它也會列印程式碼片段，透過 SSM Proxy 將 HyperPod 叢集新增為遠端主機來設定 SSH。透過設定 SSH，您可以將 Visual Studio Code 等本機開發環境與 HyperPod 叢集連線。

```
$ chmod +x easy-ssh.sh
$ ./easy-ssh.sh -c <node-group> <cluster-name>
Cluster id: <cluster_id>
Instance id: <instance_id>
Node Group: <node-group>
Add the following to your ~/.ssh/config to easily connect:

$ cat <<EOF >> ~/.ssh/config
Host <cluster-name>
  User ubuntu
  ProxyCommand sh -c "aws ssm start-session  --target sagemaker-cluster:<cluster_id>_<node-group>-<instance_id> --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
EOF

Add your ssh keypair and then you can do:

$ ssh <cluster-name>

aws ssm start-session --target sagemaker-cluster:<cluster_id>_<node-group>-<instance_id>

Starting session with SessionId: s0011223344aabbccdd
root@ip-111-22-333-444:/usr/bin#
```

請注意，這最初會將您連線為根使用者。在執行任務之前，請執行下列命令來切換到 `ubuntu` 使用者。

```
root@ip-111-22-333-444:/usr/bin# sudo su - ubuntu
ubuntu@ip-111-22-333-444:/usr/bin#
```

**使用 HyperPod 運算節點做為遠端主機，設定透過 SSH 輕鬆存取**

為了進一步簡化從本機電腦使用 SSH 存取運算節點，`easy-ssh.sh` 指令碼會輸出程式碼片段，將 HyperPod 叢集設定為遠端主機，如上節所示。此程式碼片段會自動產生，以協助您直接新增至本機裝置上的 `~/.ssh/config` 檔案。下列程序說明如何設定透過 SSM Proxy 使用 SSH 輕鬆存取，以便您或您的叢集使用者可以直接執行 `ssh <cluster-name>` 以連線至 HyperPod 叢集節點。

1. 在本機裝置上，將具有使用者名稱的 HyperPod 運算節點做為遠端主機新增至 `~/.ssh/config` 檔案。下列命令顯示如何將自動產生的程式碼片段從 `easy-ssh.sh` 指令碼附加至 `~/.ssh/config` 檔案。確定您從 `easy-ssh.sh` 指令碼自動產生且具有正確叢集資訊的輸出中複製它。

   ```
   $ cat <<EOF >> ~/.ssh/config
   Host <cluster-name>
     User ubuntu
     ProxyCommand sh -c "aws ssm start-session  --target sagemaker-cluster:<cluster_id>_<node-group>-<instance_id> --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
   EOF
   ```

1. 在 HyperPod 叢集節點上，將本機裝置上的公有金鑰新增至 HyperPod 叢集節點上的 `~/.ssh/authorized_keys` 檔案。

   1. 在本機電腦上列印公有金鑰檔案。

      ```
      $ cat ~/.ssh/id_rsa.pub
      ```

      這應該會傳回您的金鑰。複製此命令的輸出。

      (選用) 如果您沒有公有金鑰，請執行下列命令建立一個。

      ```
      $ ssh-keygen -t rsa -q -f "$HOME/.ssh/id_rsa" -N ""
      ```

   1. 連線至叢集節點，並切換到使用者以新增金鑰。下列命令是以 `ubuntu` 使用者身分存取的範例。將 `ubuntu` 取代為您想要使用 SSH 設定輕鬆存取的使用者名稱。

      ```
      $ ./easy-ssh.sh -c <node-group> <cluster-name>
      $ sudo su - ubuntu
      ubuntu@ip-111-22-333-444:/usr/bin#
      ```

   1. 開啟 `~/.ssh/authorized_keys` 檔案，並在檔案結尾新增公有金鑰。

      ```
      ubuntu@ip-111-22-333-444:/usr/bin# vim ~/.ssh/authorized_keys
      ```

完成設定後，您可以執行簡化的 SSH 命令，以使用者身分連線至 HyperPod 叢集節點，如下所示。

```
$ ssh <cluster-name>
ubuntu@ip-111-22-333-444:/usr/bin#
```

此外，您可以使用主機從本機裝置上的 IDE 進行遠端開發，例如 [Visual Studio Code Remote - SSH](https://code.visualstudio.com/docs/remote/ssh)。

## 透過 Amazon FSx 共用空間設定多使用者環境
<a name="sagemaker-hyperpod-run-jobs-slurm-access-nodes-multi-user-with-fxs-shared-space"></a>

您可以使用 Amazon FSx 共用空間，管理 SageMaker HyperPod 上 Slurm 叢集中的多使用者環境。如果您在 HyperPod 叢集建立期間已使用 Amazon FSx 設定 Slurm 叢集，這是為叢集使用者設定工作區的好選項。建立新的使用者，並在 Amazon FSx 共用檔案系統上設定使用者的主目錄。

**提示**  
若要允許使用者透過其使用者名稱和專用目錄存取您的叢集，您也應該依照《 AWS Systems Manager 使用者指南》中[開啟 Linux 和 macOS 受管節點的執行身分支援](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-preferences-run-as.html)提供的程序**開啟 Linux 和 macOS 受管節點的執行身分支援**下步驟 5 的**選項 2** 中的指引，將它們與 IAM 角色或使用者建立關聯。另請參閱[設定 AWS Systems Manager 和執行為叢集使用者存取控制](sagemaker-hyperpod-prerequisites.md#sagemaker-hyperpod-prerequisites-ssm)。

**在 SageMaker HyperPod 上建立 Slurm 叢集時設定多使用者環境**

SageMaker HyperPod 服務團隊會提供指令碼 [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/add_users.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/add_users.sh) 做為基本生命週期指令碼範例的一部分。

1. 準備名為 `shared_users.txt` 的文字檔案，您需要以下列格式建立該文字檔案。第一欄用於使用者名稱、第二欄用於唯一使用者 ID，而第三欄用於 Amazon FSx 共用空間中的使用者目錄。

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

1. 確定您將 `shared_users.txt` 和 [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/add_users.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/add_users.sh) 檔案上傳至 HyperPod 生命週期指令碼的 S3 儲存貯體。當叢集建立、叢集更新或叢集軟體更新正在進行時，[https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/add_users.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/add_users.sh) 會在 `shared_users.txt` 中讀取並正確設定使用者目錄。

**建立新的使用者，並將其新增至 SageMaker HyperPod 上執行的現有 Slurm 叢集**

1. 在主節點上執行下列命令，以儲存有助於建立使用者的指令碼。確定您透過 sudo 許可來執行此操作。

   ```
   $ cat > create-user.sh << EOL
   #!/bin/bash
   
   set -x
   
   # Prompt user to get the new user name.
   read -p "Enter the new user name, i.e. 'sean': 
   " USER
   
   # create home directory as /fsx/<user>
   # Create the new user on the head node
   sudo useradd \$USER -m -d /fsx/\$USER --shell /bin/bash;
   user_id=\$(id -u \$USER)
   
   # add user to docker group
   sudo usermod -aG docker \${USER}
   
   # setup SSH Keypair
   sudo -u \$USER ssh-keygen -t rsa -q -f "/fsx/\$USER/.ssh/id_rsa" -N ""
   sudo -u \$USER cat /fsx/\$USER/.ssh/id_rsa.pub | sudo -u \$USER tee /fsx/\$USER/.ssh/authorized_keys
   
   # add user to compute nodes
   read -p "Number of compute nodes in your cluster, i.e. 8: 
   " NUM_NODES
   srun -N \$NUM_NODES sudo useradd -u \$user_id \$USER -d /fsx/\$USER --shell /bin/bash;
   
   # add them as a sudoer
   read -p "Do you want this user to be a sudoer? (y/N):
   " SUDO
   if [ "\$SUDO" = "y" ]; then
           sudo usermod -aG sudo \$USER
           sudo srun -N \$NUM_NODES sudo usermod -aG sudo \$USER
           echo -e "If you haven't already you'll need to run:\n\nsudo visudo /etc/sudoers\n\nChange the line:\n\n%sudo   ALL=(ALL:ALL) ALL\n\nTo\n\n%sudo   ALL=(ALL:ALL) NOPASSWD: ALL\n\nOn each node."
   fi
   EOL
   ```

1. 使用下列命令執行指令碼。系統會提示您新增使用者的名稱，以及您要允許使用者存取的運算節點數量。

   ```
   $ bash create-user.sh
   ```

1. 執行下列命令測試使用者。

   ```
   $ sudo su - <user> && ssh $(srun hostname)
   ```

1. 將使用者資訊新增至 `shared_users.txt` 檔案，以便使用者將在任何新的運算節點或新的叢集上建立。

## 透過將 HyperPod 叢集與 Active Directory 整合來設定多使用者環境
<a name="sagemaker-hyperpod-run-jobs-slurm-access-nodes-multi-user-with-active-directory"></a>

在實際使用案例中，HyperPod 叢集通常由多個使用者使用：機器學習 (ML) 研究人員、軟體工程師、資料科學家和叢集管理員。他們編輯自己的檔案並執行自己的任務，而不會影響彼此的工作。若要設定多使用者環境，請使用 Linux 使用者和群組機制，透過生命週期指令碼在每個執行個體上靜態建立多個使用者。不過，此方法的缺點是，您需要跨叢集中的多個執行個體複製使用者和群組設定，才能在進行新增、編輯和移除使用者等更新時，在所有執行個體之間保持一致的組態。

若要解決此問題，您可以使用[輕量型目錄存取通訊協定 (LDAP)](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) 和 [LDAP over TLS/SSL (LDAPS)](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) 與目錄服務整合，例如 [AWS Directory Service for Microsoft Active Directory](https://aws.amazon.com/directoryservice/)。若要進一步了解如何在 HyperPod 叢集中設定 Active Directory 和多使用者環境，請參閱部落格文章[將 HyperPod 叢集與 Active Directory 整合，以進行多使用者無縫登入](https://aws.amazon.com/blogs/machine-learning/integrate-hyperpod-clusters-with-active-directory-for-seamless-multi-user-login/)。