

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 访问您的 SageMaker HyperPod 集群节点
<a name="sagemaker-hyperpod-run-jobs-slurm-access-nodes"></a>

您可以通过 Amazon Systems Manager (SSM) 访问**InService**集群，方法是运行`aws ssm start-session`带有 SageMaker HyperPod集群主机名的 Amazon CLI 命令，格式为。`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)检索集群 ID、实例 ID 和实例组名称，也可以通过运行和的[Amazon CLI 命令](sagemaker-hyperpod-operate-slurm-cli-command.md#sagemaker-hyperpod-operate-slurm-cli-command-list-cluster-nodes)来检索集群 ID、实例 ID `describe-cluster` 和`list-cluster-nodes`实例组名称 SageMaker HyperPod。例如，如果集群 ID 是 `aa11bbbbb222`，集群节点名称是 `controller-group`，集群节点 ID 是 `i-111222333444555aa`，则 SSM `start-session` 命令应如下所示。

**注意**  
授予用户访问 HyperPod 群集节点的权限允许他们在节点上安装和操作用户管理的软件。确保遵守用户的最低权限原则。  
如果您尚未设置 Amazon Systems Manager，请按照中提供的说明进行操作[为集群用户访问控制设置 Amazon 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>

**使用提供的`easy-ssh.sh`脚本 HyperPod 来简化连接过程**

为了将前面的过程变成单行命令，该 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 命令中，然后连接到计算节点。当此脚本运行`describe-cluster`并`list-cluster-nodes`命令和解析完成 SSM 命令所需的信息时，您无需手动查找所需的 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 集群添加为远程主机来设置 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 代理使用 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#
```

此外，您还可以使用主机从本地设备上的集成开发环境进行远程开发，例如 [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 共享空间来管理 Slurm 集群中的多用户环境。 SageMaker HyperPod如果您在创建集群 FSx 时使用 Amazon 配置了 Slurm HyperPod 集群，那么这是为集群用户设置工作空间的好选择。在 Amazon FSx 共享文件系统上创建新用户并为该用户设置主目录。

**提示**  
要让用户通过用户名和专用目录访问您的集群，您还可以按照《 Amazon Systems Manager 用户指南》中[为 Linux 和 macOS 托管节点启用“以另一种身份运行”支持](https://docs.amazonaws.cn/systems-manager/latest/userguide/session-preferences-run-as.html)提供的**为 Linux 和 macOS 托管节点开启“以另一种身份运行”支持**步骤下的步骤 5 **选项 2** 中的说明进行标记，将它们与 IAM 角色或用户关联起来。另请参阅[为集群用户访问控制设置 Amazon Systems Manager 和运行方式](sagemaker-hyperpod-prerequisites.md#sagemaker-hyperpod-prerequisites-ssm)。

**要在创建 Slurm 集群时设置多用户环境，请开启 SageMaker HyperPod**

 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` 的文本文件，需要按照以下格式创建。第一列用于用户名，第二列用于唯一用户 IDs，第三列用于表示 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)文件上传到 S3 存储桶以获取 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) 会读入 `shared_users.txt` 并正确设置用户目录。

**创建新用户并添加到上运行的现有 Slurm 集群 SageMaker HyperPod **

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) 和 LDAP](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) ov [er TLS/SSL (LDAPS)](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) 与目录服务（例如[微软 Active Directory 的Amazon 目录服务](https://www.amazonaws.cn/directoryservice/)）集成。要了解有关在集群中设置 Active Directory 和多用户环境的更多信息，请参阅博客文章[将 HyperPod 集群与 Active Directory 集成 HyperPod 以实现多用户无缝登录](https://www.amazonaws.cn/blogs/machine-learning/integrate-hyperpod-clusters-with-active-directory-for-seamless-multi-user-login/)。