

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# SageMaker HyperPod 클러스터의 작업
<a name="sagemaker-hyperpod-run-jobs-slurm"></a>

다음 주제에서는 컴퓨팅 노드에 액세스하고 프로비저닝된 SageMaker HyperPod 클러스터에서 ML 워크로드를 실행하는 절차와 예제를 제공합니다. HyperPod 클러스터에서 환경을 설정한 방식에 따라 HyperPod 클러스터에서 ML 워크로드를 실행하는 방법은 다양합니다. HyperPod 클러스터에서 ML 워크로드를 실행하는 예제는 [Awsome Distributed Training GitHub 리포지토리](https://github.com/aws-samples/awsome-distributed-training/)에서도 제공됩니다. 다음 주제에서는 프로비저닝된 HyperPod 클러스터에 로그인하고 샘플 ML 워크로드 실행을 시작하는 방법을 안내합니다.

**작은 정보**  
실제 예제 및 솔루션을 찾으려면 [SageMaker HyperPod 워크숍](https://catalog.workshops.aws/sagemaker-hyperpod)을 참조하세요.

**Topics**
+ [SageMaker HyperPod 클러스터 노드에 액세스](sagemaker-hyperpod-run-jobs-slurm-access-nodes.md)
+ [SageMaker HyperPod 클러스터에서 Slurm 작업 예약](sagemaker-hyperpod-run-jobs-slurm-schedule-slurm-job.md)
+ [HyperPod의 Slurm 컴퓨팅 노드에서 Docker 컨테이너 실행](sagemaker-hyperpod-run-jobs-slurm-docker.md)
+ [HyperPod에서 Slurm을 사용하여 분산 훈련 워크로드 실행](sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload.md)

# SageMaker HyperPod 클러스터 노드에 액세스
<a name="sagemaker-hyperpod-run-jobs-slurm-access-nodes"></a>

형식의 SageMaker HyperPod 클러스터 호스트 이름으로 AWS CLI 명령을 실행하여 AWS Systems Manager (SSM)`aws ssm start-session`을 통해 **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)에서 클러스터 ID, 인스턴스 ID 및 인스턴스 그룹 이름을 검색하거나 [AWS CLI SageMaker HyperPod](sagemaker-hyperpod-operate-slurm-cli-command.md#sagemaker-hyperpod-operate-slurm-cli-command-list-cluster-nodes)의 명령에서 `describe-cluster` 및 `list-cluster-nodes`을 실행하여 검색할 수 있습니다. 예를 들어 클러스터 ID가 `aa11bbbbb222`이고 클러스터 노드 이름이 이고 `controller-group`클러스터 노드 ID가 `i-111222333444555aa`인 경우SSM `start-session` 명령은 다음과 같아야 합니다.

**참고**  
사용자에게 HyperPod 클러스터 노드에 대한 액세스 권한을 부여하면 사용자가 노드에 사용자 관리형 소프트웨어를 설치하고 작동할 수 있습니다. 사용자에 대해 최소 권한 원칙을 유지해야 합니다.  
를 설정하지 않은 경우에 제공된 지침을 AWS Systems Manager따릅니다[클러스터 사용자 액세스 제어를 위한 설정 AWS Systems Manager 및 Run As](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 팀은 클러스터 정보를 검색하고, 이를 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) 스크립트를 제공합니다. 이 스크립트는 `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` 사용자로 액세스하는 예제입니다. SSH를 사용하여 쉽게 액세스할 수 있도록 설정할 사용자 이름으로 `ubuntu`를 바꿉니다.

      ```
      $ ./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) 와 같은 로컬 디바이스의 IDE에서 원격으로 개발할 수 있습니다.

## 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 관리형 노드에 대한 Run As 지원 켜기](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-preferences-run-as.html)에서 제공된 **Linux 및 macOS 관리형 노드에 대한 다음으로 실행 지원을 켜기** 절차 아래 5단계의 **옵션 2**에 안내된 대로 태그를 지정하여 IAM 역할 또는 사용자와 연결해야 합니다. 또한 [클러스터 사용자 액세스 제어를 위한 설정 AWS Systems Manager 및 Run As](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`라는 텍스트 파일을 준비합니다. 첫 번째 열은 사용자 이름, 두 번째 열은 고유한 사용자 IDs 세 번째 열은 Amazon FSx 공유 공간의 사용자 디렉터리입니다.

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

1. HyperPod 수명 주기 스크립트용 S3 버킷에 `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) 파일을 업로드해야 합니다. 클러스터 생성, 클러스터 업데이트 또는 클러스터 소프트웨어 업데이트가 진행되는 동안 [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[(Lightweight Directory Access Protocol)](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) 및 [LDAP over TLS/SSL(LDAPS)](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol)을 사용하여 [AWS Microsoft Active Directory용 Directory Service 같은 디렉터리 서비스와 통합할 수 있습니다](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/) 블로그 게시물을 참조하세요.

# SageMaker HyperPod 클러스터에서 Slurm 작업 예약
<a name="sagemaker-hyperpod-run-jobs-slurm-schedule-slurm-job"></a>

표준 Slurm `sbatch` 또는 `srun` 명령을 사용하여 훈련 작업을 시작할 수 있습니다. 예를 들어 8노드 훈련 작업을 시작하려면 `srun -N 8 --exclusive train.sh` SageMaker HyperPod를 실행하여 `conda`, `venv`, `docker`, 및 `enroot`를 포함한 다양한 환경에서 훈련을 지원할 수 있습니다. SageMaker HyperPod 클러스터에서 수명 주기 스크립트를 실행하여 ML 환경을 구성할 수 있습니다. 가상 환경으로도 사용할 수 있는 Amazon FSx와 같은 공유 파일 시스템을 연결할 수도 있습니다.

다음 예제에서는 Amazon FSx 공유 파일 시스템이 있는 SageMaker HyperPod 클러스터에서 완전 샤딩된 데이터 병렬 처리(FSDP) 기술로 Llama-2를 훈련하기 위한 작업을 실행하는 방법을 보여줍니다. [Awsome Distributed Training GitHub 리포지토리](https://github.com/aws-samples/awsome-distributed-training/) 에서 더 많은 예제를 찾을 수도 있습니다.

**작은 정보**  
모든 SageMaker HyperPod 예제는 [Awsome Distributed Training GitHub 리포지토리](https://github.com/aws-samples/awsome-distributed-training/)의 `3.test_cases` 폴더에서 사용할 수 있습니다.

1. [Awsome Distributed Training GitHub 리포지토리](https://github.com/aws-samples/awsome-distributed-training/)를 복제하고 훈련 작업 예제를 Amazon FSx 파일 시스템에 복사합니다.

   ```
   $ TRAINING_DIR=/fsx/users/my-user/fsdp
   $ git clone https://github.com/aws-samples/awsome-distributed-training/
   ```

1. [https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/10.FSDP/0.create_conda_env.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/10.FSDP/0.create_conda_env.sh) 스크립트 실행. 이렇게 하면 Amazon FSx 파일 시스템에 `conda` 환경이 생성됩니다. 클러스터의 모든 노드가 파일 시스템에 액세스할 수 있는지 확인합니다.

1. 다음과 같이 단일 노드 슬러밍 작업을 시작하여 가상 Conda 환경을 구축합니다.

   ```
   $ srun -N 1 /path_to/create_conda_env.sh
   ```

1. 환경이 구축된 후 공유 볼륨의 환경 경로를 가리키면 훈련 작업을 시작할 수 있습니다. 동일한 설정으로 단일 노드 및 다중 노드 훈련 작업을 모두 시작할 수 있습니다. 작업을 시작하려면 다음과 같이 작업 시작 스크립트(엔트리 포인트 스크립트라고도 함)를 생성합니다.

   ```
   #!/usr/bin/env bash
   set -ex
   
   ENV_PATH=/fsx/users/my_user/pytorch_env
   TORCHRUN=$ENV_PATH/bin/torchrun
   TRAINING_SCRIPT=/fsx/users/my_user/pt_train.py
   
   WORLD_SIZE_JOB=$SLURM_NTASKS
   RANK_NODE=$SLURM_NODEID
   PROC_PER_NODE=8
   MASTER_ADDR=(`scontrol show hostnames \$SLURM_JOB_NODELIST | head -n 1`)
   MASTER_PORT=$(expr 10000 + $(echo -n $SLURM_JOBID | tail -c 4))
   
   DIST_ARGS="--nproc_per_node=$PROC_PER_NODE \
              --nnodes=$WORLD_SIZE_JOB \
              --node_rank=$RANK_NODE \
              --master_addr=$MASTER_ADDR \
              --master_port=$MASTER_PORT \
             "
             
   $TORCHRUN $DIST_ARGS $TRAINING_SCRIPT
   ```
**작은 정보**  
SageMaker HyperPod 의 자동 재개 기능을 사용하여 하드웨어 장애에 대한 훈련 작업을 더 탄력적으로 만들려면 진입점 스크립트에서 `MASTER_ADDR` 환경 변수를 올바르게 설정해야 합니다. 자세한 내용은 [자동 노드 복구 및 자동 재개](sagemaker-hyperpod-resiliency-slurm-auto-resume.md)를 참조하세요.

   이 자습서에서는 이 스크립트가 `/fsx/users/my_user/train.sh`로 저장된다고 가정합니다.

1. `/fsx/users/my_user/train.sh`의 공유 볼륨에 이 스크립트를 사용하여 다음 `srun` 명령을 실행하여 Slurm 작업을 예약합니다.

   ```
   $ cd /fsx/users/my_user/
   $ srun -N 8 train.sh
   ```

# HyperPod의 Slurm 컴퓨팅 노드에서 Docker 컨테이너 실행
<a name="sagemaker-hyperpod-run-jobs-slurm-docker"></a>

SageMaker HyperPod 에서 Slurm을 사용하여 Docker 컨테이너를 실행하려면 [Enroot](https://github.com/NVIDIA/enroot) 및 [Pyxis](https://github.com/NVIDIA/pyxis)를 사용해야 합니다. HyperPod Enroot 패키지는 Docker 이미지를 Slurm이 이해할 수 있는 런타임으로 변환하는 데 도움이 되는 반면, Pyxis는 `srun` 명령안 `srun --container-image=docker/image:tag`을 통해 런타임을 Slurm 작업으로 예약할 수 있도록 합니다.

**작은 정보**  
Docker, Enroot 및 Pyxis 패키지는 [HyperPod에서 제공하는 기본 수명 주기 스크립트](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-base-config.md)에 설명된 대로 수명 주기 스크립트 실행의 일환으로 클러스터 생성 중에 설치해야 합니다. HyperPod 클러스터를 생성할 때 HyperPod 서비스 팀이 제공하는 [기본 수명 주기 스크립트](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config)를 사용합니다. 이러한 기본 스크립트는 기본적으로 패키지를 설치하도록 설정되어 있습니다. [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py) 스크립트에는 패키지를 설치하기 위한 부울 유형 파라미터가 `True`(`enable_docker_enroot_pyxis=True`)로 설정된 `Config` 클래스가 있습니다. 이는 [https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/utils](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/utils) 폴더에서 `install_docker.sh` 및 `install_enroot_pyxis.sh` 스크립트를 호출하는 [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/lifecycle_script.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/lifecycle_script.py) 스크립트에서 호출되고 구문 분석됩니다. 설치 스크립트는 패키지의 실제 설치가 이루어지는 곳입니다. 또한 설치 스크립트는 실행 중인 인스턴스에서 NVMe 스토어 경로를 감지하고 Docker 및 Enroot의 루트 경로를 `/opt/dlami/nvme`로 설정할 수 있는지 여부를 식별합니다. 새 인스턴스의 기본 루트 볼륨은 100GB EBS 볼륨으로만 `/tmp`에 탑재되며, 실행하려는 워크로드에 LLM 훈련이 포함되고 따라서 크기가 큰 Docker 컨테이너가 필요한 경우 이 볼륨은 사라집니다. 로컬 NVMe 스토리지에 P 및 G와 같은 인스턴스 패밀리를 사용하는 경우 `/opt/dlami/nvme`에 연결된 NVMe 스토리지를 사용해야 하며 설치 스크립트가 구성 프로세스를 처리해야 합니다.

**루트 경로가 제대로 설정되었는지 확인하려면**

SageMaker HyperPod의 Slurm 클러스터 컴퓨팅 노드에서 다음 명령을 실행하여 수명 주기 스크립트가 제대로 작동하고 각 노드의 루트 볼륨이 `/opt/dlami/nvme/*`로 설정되어 있는지 확인합니다. 다음 명령은 Slurm 클러스터의 컴퓨팅 노드 8개에 대한 Enroot 런타임 경로 및 데이터 루트 경로를 확인하는 예를 보여줍니다.

```
$ srun -N 8 cat /etc/enroot/enroot.conf | grep "ENROOT_RUNTIME_PATH"
ENROOT_RUNTIME_PATH        /opt/dlami/nvme/tmp/enroot/user-$(id -u)
... // The same or similar lines repeat 7 times
```

```
$ srun -N 8 cat /etc/docker/daemon.json
{
    "data-root": "/opt/dlami/nvme/docker/data-root"
}
... // The same or similar lines repeat 7 times
```

런타임 경로가 `/opt/dlami/nvme/*`로 올바르게 설정되었는지 확인한 후 Enroot 및 Pyxis를 사용하여 Docker 컨테이너를 빌드하고 실행할 준비가되었습니다.

**Slurm을 사용하여 Docker를 테스트하려면**

1. 컴퓨팅 노드에서 다음 명령을 시도하여 Docker 및 Enroot가 제대로 설치되었는지 확인합니다.

   ```
   $ docker --help
   $ enroot --help
   ```

1. [NVIDIA CUDA Ubuntu](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda) 이미지 중 하나를 실행하여 Pyxis 및 Enroot가 올바르게 설치되었는지 테스트합니다.

   ```
   $ srun --container-image=nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY nvidia-smi
   pyxis: importing docker image: nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY
   pyxis: imported docker image: nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY
   DAY MMM DD HH:MM:SS YYYY
   +-----------------------------------------------------------------------------+
   | NVIDIA-SMI 470.141.03   Driver Version: 470.141.03   CUDA Version: XX.YY    |
   |-------------------------------+----------------------+----------------------+
   | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
   | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
   |                               |                      |               MIG M. |
   |===============================+======================+======================|
   |   0  Tesla T4            Off  | 00000000:00:1E.0 Off |                    0 |
   | N/A   40C    P0    27W /  70W |      0MiB / 15109MiB |      0%      Default |
   |                               |                      |                  N/A |
   +-------------------------------+----------------------+----------------------+
   
   +-----------------------------------------------------------------------------+
   | Processes:                                                                  |
   |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
   |        ID   ID                                                   Usage      |
   |=============================================================================|
   |  No running processes found                                                 |
   +-----------------------------------------------------------------------------+
   ```

   스크립트를 생성하고 다음과 같이 `sbatch` 명령을 실행하여 테스트할 수도 있습니다.

   ```
   $ cat <<EOF >> container-test.sh
   #!/bin/bash
   #SBATCH --container-image=nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY
   nvidia-smi
   EOF
   
   $ sbatch container-test.sh
   pyxis: importing docker image: nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY
   pyxis: imported docker image: nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY
   DAY MMM DD HH:MM:SS YYYY
   +-----------------------------------------------------------------------------+
   | NVIDIA-SMI 470.141.03   Driver Version: 470.141.03   CUDA Version: XX.YY    |
   |-------------------------------+----------------------+----------------------+
   | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
   | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
   |                               |                      |               MIG M. |
   |===============================+======================+======================|
   |   0  Tesla T4            Off  | 00000000:00:1E.0 Off |                    0 |
   | N/A   40C    P0    27W /  70W |      0MiB / 15109MiB |      0%      Default |
   |                               |                      |                  N/A |
   +-------------------------------+----------------------+----------------------+
   
   +-----------------------------------------------------------------------------+
   | Processes:                                                                  |
   |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
   |        ID   ID                                                   Usage      |
   |=============================================================================|
   |  No running processes found                                                 |
   +-----------------------------------------------------------------------------+
   ```

**Docker를 사용하여 테스트 Slurm 작업을 실행하려면**

Docker를 사용하여 Slurm 설정을 완료한 후 사전 구축된 Docker 이미지를 가져오고 SageMaker HyperPod에서 Slurm을 사용하여 실행할 수 있습니다. 다음은 SageMaker HyperPod에서 Docker 및 Slurm을 사용하여 훈련 작업을 실행하는 방법을 안내하는 샘플 사용 사례입니다. SageMaker AI 모델 병렬화(SMP) 라이브러리를 사용한 Llama 2 모델의 모델 병렬 훈련 예시를 보여줍니다.

1. SageMaker AI 또는 DLC에서 배포한 사전 구축된 ECR 이미지 중 하나를 사용하려면 HyperPod 클러스터에 [SageMaker HyperPod의 IAM 역할](sagemaker-hyperpod-prerequisites-iam.md#sagemaker-hyperpod-prerequisites-iam-role-for-hyperpod)를 통해 ECR 이미지를 가져올 수 있는 권한을 부여해야 합니다. 자체 또는 오픈 소스 Docker 이미지를 사용하는 경우 이 단계를 건너뛸 수 있습니다. [SageMaker HyperPod의 IAM 역할](sagemaker-hyperpod-prerequisites-iam.md#sagemaker-hyperpod-prerequisites-iam-role-for-hyperpod)에 다음 권한을 추가합니다. 이 자습서에서는 [SMP 라이브러리와 함께 사전 패키징된 SMP Docker 이미지](distributed-model-parallel-support-v2.md#distributed-model-parallel-supported-frameworks-v2)를 사용합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ecr:BatchCheckLayerAvailability",
                   "ecr:BatchGetImage",
                   "ecr-public:*",
                   "ecr:GetDownloadUrlForLayer",
                   "ecr:GetAuthorizationToken",
                   "sts:*"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 컴퓨팅 노드에서 리포지토리를 복제하고 SMP를 사용한 훈련의 예제 스크립트를 제공하는 폴더로 이동합니다.

   ```
   $ git clone https://github.com/aws-samples/awsome-distributed-training/
   $ cd awsome-distributed-training/3.test_cases/17.SM-modelparallelv2
   ```

1. 이 자습서에서는 SMP Docker 이미지를 가져와서 Docker 컨테이너를 빌드하고 Enroot 런타임으로 [https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/17.SM-modelparallelv2/docker_build.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/17.SM-modelparallelv2/docker_build.sh) 실행하는 샘플 스크립트를 실행합니다. 원하는 대로 수정할 수 있습니다.

   ```
   $ cat docker_build.sh
   #!/usr/bin/env bash
   
   region=us-west-2
   dlc_account_id=658645717510
   aws ecr get-login-password --region $region | docker login --username AWS --password-stdin $dlc_account_id.dkr.ecr.$region.amazonaws.com
   
   docker build -t smpv2 .
   enroot import -o smpv2.sqsh  dockerd://smpv2:latest
   ```

   ```
   $ bash docker_build.sh
   ```

1. 배치 스크립트를 생성하여 `sbatch`를 사용하여 훈련 작업을 시작합니다. 이 자습서에서 제공된 샘플 스크립트 [https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/17.SM-modelparallelv2/launch_training_enroot.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/17.SM-modelparallelv2/launch_training_enroot.sh)는 8개의 컴퓨팅 노드에 합성 데이터세트가 있는 700억 파라미터 Llama 2 모델의 모델 병렬 훈련 작업을 시작합니다. 훈련 스크립트 세트는 [https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/17.SM-modelparallelv2/scripts](https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/17.SM-modelparallelv2/scripts)에 제공되며 `launch_training_enroot.sh`는 진입점 스크립트로 `train_external.py`를 사용합니다.
**중요**  
SageMaker HyperPod에서 Docker 컨테이너를 사용하려면 이 경우 HyperPod 컴퓨팅 노드인 호스트 시스템의 `/var/log` 디렉터리를 컨테이너의 `/var/log` 디렉터리에 탑재해야 합니다. Enroot에 다음 변수를 추가하여 설정할 수 있습니다.  

   ```
   "${HYPERPOD_PATH:="/var/log/aws/clusters":"/var/log/aws/clusters"}"
   ```

   ```
   $ cat launch_training_enroot.sh
   #!/bin/bash
   
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: MIT-0
   
   #SBATCH --nodes=8 # number of nodes to use, 2 p4d(e) = 16 A100 GPUs
   #SBATCH --job-name=smpv2_llama # name of your job
   #SBATCH --exclusive # job has exclusive use of the resource, no sharing
   #SBATCH --wait-all-nodes=1
   
   set -ex;
   
   ###########################
   ###### User Variables #####
   ###########################
   
   #########################
   model_type=llama_v2
   model_size=70b
   
   # Toggle this to use synthetic data
   use_synthetic_data=1
   
   
   # To run training on your own data  set Training/Test Data path  -> Change this to the tokenized dataset path in Fsx. Acceptable formats are huggingface (arrow) and Jsonlines.
   # Also change the use_synthetic_data to 0
   
   export TRAINING_DIR=/fsx/path_to_data
   export TEST_DIR=/fsx/path_to_data
   export CHECKPOINT_DIR=$(pwd)/checkpoints
   
   # Variables for Enroot
   : "${IMAGE:=$(pwd)/smpv2.sqsh}"
   : "${HYPERPOD_PATH:="/var/log/aws/clusters":"/var/log/aws/clusters"}" # This is needed for validating its hyperpod cluster
   : "${TRAIN_DATA_PATH:=$TRAINING_DIR:$TRAINING_DIR}"
   : "${TEST_DATA_PATH:=$TEST_DIR:$TEST_DIR}"
   : "${CHECKPOINT_PATH:=$CHECKPOINT_DIR:$CHECKPOINT_DIR}"   
   
   
   ###########################
   ## Environment Variables ##
   ###########################
   
   #export NCCL_SOCKET_IFNAME=en
   export NCCL_ASYNC_ERROR_HANDLING=1
   
   export NCCL_PROTO="simple"
   export NCCL_SOCKET_IFNAME="^lo,docker"
   export RDMAV_FORK_SAFE=1
   export FI_EFA_USE_DEVICE_RDMA=1
   export NCCL_DEBUG_SUBSYS=off
   export NCCL_DEBUG="INFO"
   export SM_NUM_GPUS=8
   export GPU_NUM_DEVICES=8
   export FI_EFA_SET_CUDA_SYNC_MEMOPS=0
   
   # async runtime error ...
   export CUDA_DEVICE_MAX_CONNECTIONS=1
   
   
   #########################
   ## Command and Options ##
   #########################
   
   if [ "$model_size" == "7b" ]; then
       HIDDEN_WIDTH=4096
       NUM_LAYERS=32
       NUM_HEADS=32
       LLAMA_INTERMEDIATE_SIZE=11008
       DEFAULT_SHARD_DEGREE=8
   # More Llama model size options
   elif [ "$model_size" == "70b" ]; then
       HIDDEN_WIDTH=8192
       NUM_LAYERS=80
       NUM_HEADS=64
       LLAMA_INTERMEDIATE_SIZE=28672
       # Reduce for better perf on p4de
       DEFAULT_SHARD_DEGREE=64
   fi
   
   
   if [ -z "$shard_degree" ]; then
       SHARD_DEGREE=$DEFAULT_SHARD_DEGREE
   else
       SHARD_DEGREE=$shard_degree
   fi
   
   if [ -z "$LLAMA_INTERMEDIATE_SIZE" ]; then
       LLAMA_ARGS=""
   else
       LLAMA_ARGS="--llama_intermediate_size $LLAMA_INTERMEDIATE_SIZE "
   fi
   
   
   if [ $use_synthetic_data == 1 ]; then
       echo "using synthetic data"
       declare -a ARGS=(
       --container-image $IMAGE
       --container-mounts $HYPERPOD_PATH,$CHECKPOINT_PATH
       )
   else
       echo "using real data...."
       declare -a ARGS=(
       --container-image $IMAGE
       --container-mounts $HYPERPOD_PATH,$TRAIN_DATA_PATH,$TEST_DATA_PATH,$CHECKPOINT_PATH
       )
   fi
   
   
   declare -a TORCHRUN_ARGS=(
       # change this to match the number of gpus per node:
       --nproc_per_node=8 \
       --nnodes=$SLURM_JOB_NUM_NODES \
       --rdzv_id=$SLURM_JOB_ID \
       --rdzv_backend=c10d \
       --rdzv_endpoint=$(hostname) \
   )
   
   srun -l "${ARGS[@]}" torchrun "${TORCHRUN_ARGS[@]}" /path_to/train_external.py \
               --train_batch_size 4 \
               --max_steps 100 \
               --hidden_width $HIDDEN_WIDTH \
               --num_layers $NUM_LAYERS \
               --num_heads $NUM_HEADS \
               ${LLAMA_ARGS} \
               --shard_degree $SHARD_DEGREE \
               --model_type $model_type \
               --profile_nsys 1 \
               --use_smp_implementation 1 \
               --max_context_width 4096 \
               --tensor_parallel_degree 1 \
               --use_synthetic_data $use_synthetic_data \
               --training_dir $TRAINING_DIR \
               --test_dir $TEST_DIR \
               --dataset_type hf \
               --checkpoint_dir $CHECKPOINT_DIR \
               --checkpoint_freq 100 \
   
   $ sbatch launch_training_enroot.sh
   ```

다운로드 가능한 코드 예시를 찾으려면 *Awsome Distributed Training GitHub 리포지토리*의 [Run a model-parallel training job using the SageMaker AI model parallelism library, Docker and Enroot with Slurm](https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/17.SM-modelparallelv2#option-2----run-training-using-docker-and-enroot)을 참조하세요. SageMaker HyperPod에서 Slurm 클러스터를 사용한 분산 훈련에 대한 자세한 내용은 [HyperPod에서 Slurm을 사용하여 분산 훈련 워크로드 실행](sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload.md)의 다음 주제로 진행하세요.

# HyperPod에서 Slurm을 사용하여 분산 훈련 워크로드 실행
<a name="sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload"></a>

SageMaker HyperPod는 대규모 언어 모델(LLM) 및 파운데이션 모델(FM) 훈련의 워크로드에 특화되었습니다. 이러한 워크로드에는 여러 병렬 처리 기법을 사용하고 ML 인프라 및 리소스에 최적화된 작업이 필요한 경우가 많습니다. SageMaker HyperPod를 사용하면 다음과 같은 SageMaker AI 분산 훈련 프레임워크를 사용할 수 있습니다.
+  AWS에 최적화된 집합 통신 작업을 제공하는 [SageMaker AI distributed data parallelism (SMDDP) library](data-parallel.md)입니다.
+ 다양한 모델 병렬화 기법을 구현하는 [SageMaker AI model parallelism (SMP) library](model-parallel-v2.md)입니다.

**Topics**
+ [SageMaker HyperPod에서 SMDDP 사용](#sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload-smddp)
+ [SageMaker HyperPod 클러스터에서 SMP 사용](#sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload-smp)

## SageMaker HyperPod에서 SMDDP 사용
<a name="sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload-smddp"></a>

[SMDDP 라이브러리](data-parallel.md)는 분산 데이터 병렬 훈련의 컴퓨팅 성능을 개선하는 집합 통신 라이브러리입니다. SMDDP 라이브러리는 다음과 같은 오픈 소스 분산 훈련 프레임워크에서 작동합니다.
+ [PyTorch 분산 데이터 병렬(DDP)](https://pytorch.org/docs/stable/notes/ddp.html)
+ [PyTorch 완전 샤딩 데이터 병렬 처리(FSDP)](https://pytorch.org/docs/stable/fsdp.html)
+ [DeepSpeed](https://github.com/microsoft/DeepSpeed)
+ [Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed)

SMDDP 라이브러리는 SageMaker HyperPod에 대해 다음을 제공하여 키 집합 통신 작업의 통신 오버헤드를 해결합니다.
+ 라이브러리는에 `AllGather` 최적화되어 있습니다 AWS. `AllGather`는 샤딩된 데이터 병렬 훈련에 사용되는 키 작업으로, 인기 있는 라이브러리에서 제공하는 메모리 효율적인 데이터 병렬 처리 기법입니다. 여기에는 SageMaker AI 모델 병렬화(SMP) 라이브러리, DeepSpeed Zero Redundancy Optimizer(ZeRO) 및 PyTorch 완전 샤딩 데이터 병렬화(FSDP)가 포함됩니다.
+ 라이브러리는 AWS 네트워크 인프라와 SageMaker AI ML 인스턴스 토폴로지를 완전히 활용하여 최적화된 node-to-node 통신을 수행합니다.

**샘플 데이터 병렬 훈련 작업을 실행하려면**

SMDDP 라이브러리를 사용하여 데이터 병렬 처리 기술을 구현하는 다음 분산 훈련 샘플을 살펴보세요.
+ [https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/12.SM-dataparallel-FSDP](https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/12.SM-dataparallel-FSDP)
+ [https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/13.SM-dataparallel-deepspeed](https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/13.SM-dataparallel-deepspeed)

**SageMaker HyperPod에서 SMDDP 라이브러리를 사용하기 위한 환경을 설정하려면**

다음은 SageMaker HyperPod 에서 SMDDP 라이브러리를 사용하기 위한 훈련 환경 요구 사항입니다.
+ PyTorch v2.0.1 이상
+ CUDA v11.8 이상
+ 3보다 큰 `libstdc++` 런타임 버전
+ Python v3.10.x 이상
+ SMDDP 라이브러리에서 지원하는 인스턴스 유형인 `ml.p4d.24xlarge` 및 `ml.p4de.24xlarge`
+ `imdsv2` 훈련 호스트에서 활성화됨

분산 훈련 작업을 실행하는 방법에 따라 SMDDP 라이브러리를 설치하는 두 가지 옵션이 있습니다.
+ SMDDP 바이너리 파일을 사용한 직접 설치입니다.
+ SMDDP 라이브러리와 함께 사전 설치된 SageMaker AI Deep Learning Containers(DLC) 사용.

SMDDP 라이브러리 또는 SMDDP 바이너리 파일의 URL이 사전 설치된 Docker 이미지는 SMDDP 라이브러리 설명서의 [지원되는 프레임워크](https://docs.aws.amazon.com/sagemaker/latest/dg/distributed-data-parallel-support.html#distributed-data-parallel-supported-frameworks)에 나열되어 있습니다.

**SageMaker HyperPod DLAMI에 SMDDP 라이브러리를 설치하려면**
+ `pip install --no-cache-dir https://smdataparallel.s3.amazonaws.com/binary/pytorch/<pytorch-version>/cuXYZ/YYYY-MM-DD/smdistributed_dataparallel-X.Y.Z-cp310-cp310-linux_x86_64.whl`
**참고**  
Conda 환경에서 작업하는 경우 `pip` 대신 `conda install`를 사용하여 PyTorch를 설치해야 합니다.  

  ```
  conda install pytorch==X.Y.Z  torchvision==X.Y.Z torchaudio==X.Y.Z pytorch-cuda=X.Y.Z -c pytorch -c nvidia
  ```

**Docker 컨테이너에서 SMDDP 라이브러리를 사용하려면**
+ SMDDP 라이브러리는 SageMaker AI 딥 러닝 컨테이너(DLC)에 사전 설치됩니다. SMDDP 라이브러리가 있는 PyTorch용 SageMaker AI 프레임워크 DLC 목록을 찾으려면 SMDDP 라이브러리 설명서의 [Supported Frameworks](https://docs.aws.amazon.com/sagemaker/latest/dg/distributed-data-parallel-support.html#distributed-data-parallel-supported-frameworks)를 참조하세요. SMDDP 라이브러리를 사용하기 위해 필요한 종속 항목이 설치된 자체 Docker 컨테이너를 가져올 수도 있습니다. SMDDP 라이브러리를 사용하도록 사용자 지정 Docker 컨테이너를 설정하는 방법에 대한 자세한 내용은 [SageMaker AI 분산 데이터 병렬 라이브러리로 자체 Docker 컨테이너 만들기](data-parallel-bring-your-own-container.md) 섹션도 참조하세요.
**중요**  
Docker 컨테이너에서 SMDDP 라이브러리를 사용하려면 호스트 시스템의 `/var/log` 디렉터리를 컨테이너의 `/var/log`에 탑재합니다. 컨테이너를 실행할 때 다음 옵션을 추가하여 이 작업을 수행할 수 있습니다.  

  ```
  docker run <OTHER_OPTIONS> -v /var/log:/var/log ...
  ```

일반적으로 SMDDP를 사용하여 데이터 병렬 훈련 작업을 실행하는 방법을 알아보려면 [SageMaker AI 분산형 데이터 병렬화 라이브러리를 사용한 분산 훈련](data-parallel-modify-sdp.md) 섹션을 참조하세요.

## SageMaker HyperPod 클러스터에서 SMP 사용
<a name="sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload-smp"></a>

[SageMaker AI model parallelism (SMP) library](model-parallel-v2.md)는 다음과 같은 다양한 [최첨단 모델 병렬화 기법](model-parallel-core-features-v2.md)을 제공합니다.
+ 완전히 샤딩된 데이터 병렬 처리
+ 전문가 병렬 처리
+ FP16/BF16 및 FP8 데이터 유형을 사용한 혼합 정밀도 훈련
+ 텐서 병렬 처리

SMP 라이브러리는 PyTorch FSDP, NVIDIA Megatron 및 NVIDIA Transformer Engine과 같은 오픈 소스 프레임워크와도 호환됩니다.

**샘플 모델 병렬 훈련 워크로드를 실행하려면**

SageMaker AI 서비스 팀은 [https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/17.SM-modelparallelv2](https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/17.SM-modelparallelv2)에서 SMP 라이브러리와 모델 병렬화를 구현하는 샘플 훈련 작업을 제공합니다.