

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

# p6e-gb200 인스턴스에서 NVIDIA-Imex 지원
<a name="support-nvidia-imex-p6e-gb200-instance"></a>

이 자습서에서는 P6e-GB200 AWS ParallelCluster 에서를 시작하여 AI 훈련 및 추론에 가장 높은 GPU 성능을 활용하는 방법을 보여줍니다. [ p6e-gb200.36xlarge 인스턴스는 P6e-GB200 UltraServers를 통해서만 사용할 수](https://aws.amazon.com/ec2/instance-types/p6/) 있습니다. 여기서 `u-p6e-gb200x72`는 Ultraserver 크기이고는 Ultraserver를 구성하는 [InstanceType](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-ComputeResources-InstanceType)`p6e-gb200.36xlarge`입니다. Ultraserver를 구매`u-p6e-gb200x72`하면 `p6e-gb200.36xlarge` 인스턴스가 18개인 [ML용 EC2 용량 블록을](https://aws.amazon.com/ec2/capacityblocks/) 통해 사용할 수 있습니다. 자세한 내용은 [P6e-GB200](https://aws.amazon.com/ec2/instance-types/p6/)을 참조하세요.

AWS ParallelCluster 버전 3.14.0: 
+ 는이 인스턴스 유형에 필요한 전체 NVIDIA 소프트웨어 스택(드라이버, CUDA, EFA, NVIDIA-IMEX)을 제공합니다.
+ 는 P6e-GB200 Ultraserver에 대한 nvidia-imex 구성을 생성합니다.
+ P6e-GB200 Ultraserver에 대한 `nvidia-imex` 서비스 활성화 및 시작
+ 는 모든 P6e-GB200 Ultraserver(EC2 용량 블록)가 적절한 크기의 Slurm 블록이 되도록 Slurm 블록 토폴로지 플러그인을 구성합니다(버전 3.14.0의 [릴리스 정보 및 문서 기록](document_history.md) 항목 참조).

그러나 NVLink를 통한 GPU-to-GPU 통신에는 추가 구성, 특히 ParallelCluster가 자동으로 생성하지 않는 IMEX 도메인에 있는 컴퓨팅 노드의 IP 주소가 포함된 [https://docs.nvidia.com/multi-node-nvlink-systems/imex-guide/config.html#imex-service-node-configuration-file-location](https://docs.nvidia.com/multi-node-nvlink-systems/imex-guide/config.html#imex-service-node-configuration-file-location) 파일이 필요합니다. 이 파일을 생성하는 데 도움이 되도록 컴퓨팅 노드 IPs를 자동으로 검색하고 [https://docs.nvidia.com/multi-node-nvlink-systems/imex-guide/config.html#imex-service-node-configuration-file-location](https://docs.nvidia.com/multi-node-nvlink-systems/imex-guide/config.html#imex-service-node-configuration-file-location) 다음과 같은 [ NVIDIA IMEX Slurm 작업 스케줄러 통합](https://docs.nvidia.com/multi-node-nvlink-systems/imex-guide/deployment.html#job-scheduler-integration) 권장 사항을 구성하는 prolog 스크립트를 제공합니다. 이 자습서에서는 로그 스크립트를 생성하고, HeadNode 사용자 지정 작업을 통해 배포하고, IMEX 설정을 검증하는 방법을 안내합니다.

**참고**  
P6e-GB200은 Amazon Linux 2023, Ubuntu 22.04 및 Ubuntu 24.04에서 AWS ParallelCluster v3.14.0부터 지원됩니다. 자세한 소프트웨어 버전과 지원되는 배포의 업데이트된 목록은 [AWS ParallelCluster 변경 로그](https://github.com/aws/aws-parallelcluster/blob/develop/CHANGELOG.md)를 참조하세요.

## NVIDIA-Imex를 관리하기 위한 Prolog 스크립트 생성
<a name="support-nvidia-imex-p6e-gb200-instance-prolog"></a>

**제한:**
+ 이 prolog 스크립트는 배타적 작업 제출 시 실행됩니다. 이는 IMEX 재시작이 IMEX 도메인에 속하는 p6e-Gb200 노드에서 실행 중인 작업을 중단하지 않도록 하기 위한 것입니다.

다음은 Slurm에서 prolog로 구성해야 하는 `91_nvidia_imex_prolog.sh` 스크립트입니다. 컴퓨팅 노드에서 nvidia-imex 구성을 자동으로 업데이트하는 데 사용됩니다. 스크립트의 이름에는 SchedMD의 이름 지정 규칙을 준수하기 `91` 위한 접두사가 있습니다. [ SchedMD](https://slurm.schedmd.com/prolog_epilog.html) 이렇게 하면 시퀀스의 다른 prolog 스크립트보다 먼저 실행됩니다. 스크립트는 작업이 시작될 때 NVIDIA Imex 노드의 구성을 재구성하고 필요한 NVIDIA 데몬을 다시 로드합니다.

**참고**  
동일한 노드에서 여러 작업이 동시에 시작되는 경우이 스크립트는 실행되지 않으므로 제출 시 `--exclusive` 플래그를 사용하는 것이 좋습니다.

```
#!/usr/bin/env bash

# This prolog script configures the NVIDIA IMEX on compute nodes involved in the job execution.
#
# In particular:
# - Checks whether the job is executed exclusively.
#   If not, it exits immediately because it requires jobs to be executed exclusively.
# - Checks if it is running on a p6e-gb200 instance type.
#   If not, it exits immediately because IMEX must be configured only on that instance type.
# - Checks if the IMEX service is enabled.
#   If not, it exits immediately because IMEX must be enabled to get configured.
# - Creates the IMEX default channel.
#   For more information about IMEX channels, see https://docs.nvidia.com/multi-node-nvlink-systems/imex-guide/imexchannels.html
# - Writes the private IP addresses of compute nodes into /etc/nvidia-imex/nodes_config.cfg.
# - Restarts the IMEX system service.
#
# REQUIREMENTS:
#  - This prolog assumes to be run only with exclusive jobs.

LOG_FILE_PATH="/var/log/parallelcluster/nvidia-imex-prolog.log"
SCONTROL_CMD="/opt/slurm/bin/scontrol"
IMEX_START_TIMEOUT=60
IMEX_STOP_TIMEOUT=15
ALLOWED_INSTANCE_TYPES="^(p6e-gb200)"
IMEX_SERVICE="nvidia-imex"
IMEX_NODES_CONFIG="/etc/nvidia-imex/nodes_config.cfg"

function info() {
  echo "$(date "+%Y-%m-%dT%H:%M:%S.%3N") [INFO] [PID:$$] [JOB:${SLURM_JOB_ID}] $1"
}

function warn() {
  echo "$(date "+%Y-%m-%dT%H:%M:%S.%3N") [WARN] [PID:$$] [JOB:${SLURM_JOB_ID}] $1"
}

function error() {
  echo "$(date "+%Y-%m-%dT%H:%M:%S.%3N") [ERROR] [PID:$$] [JOB:${SLURM_JOB_ID}] $1"
}

function error_exit() {
  error "$1" && exit 1
}

function prolog_end() {
    info "PROLOG End JobId=${SLURM_JOB_ID}: $0"
    info "----------------"
    exit 0
}

function get_instance_type() {
  local token=$(curl -X PUT -s "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
  curl -s -H "X-aws-ec2-metadata-token: ${token}" http://169.254.169.254/latest/meta-data/instance-type
}

function return_if_unsupported_instance_type() {
  local instance_type=$(get_instance_type)

  if [[ ! ${instance_type} =~ ${ALLOWED_INSTANCE_TYPES} ]]; then
    info "Skipping IMEX configuration because instance type ${instance_type} does not support it"
    prolog_end
  fi
}

function return_if_imex_disabled() {
  if ! systemctl is-enabled "${IMEX_SERVICE}" &>/dev/null; then
    warn "Skipping IMEX configuration because system service ${IMEX_SERVICE} is not enabled"
    prolog_end
  fi
}

function return_if_job_is_not_exclusive() {
  if [[ "${SLURM_JOB_OVERSUBSCRIBE}" =~ ^(NO|TOPO)$  ]]; then
    info "Job is exclusive, proceeding with IMEX configuration"
  else
    info "Skipping IMEX configuration because the job is not exclusive"
    prolog_end
  fi
}

function get_ips_from_node_names() {
  local _nodes=$1
  ${SCONTROL_CMD} -ao show node "${_nodes}" | sed 's/^.* NodeAddr=\([^ ]*\).*/\1/'
}

function get_compute_resource_name() {
  local _queue_name_prefix=$1
  local _slurmd_node_name=$2
  echo "${_slurmd_node_name}" | sed -E "s/${_queue_name_prefix}(.+)-[0-9]+$/\1/"
}

function reload_imex() {
  info "Stopping IMEX"
  timeout ${IMEX_STOP_TIMEOUT} systemctl stop ${IMEX_SERVICE}
  pkill -9 ${IMEX_SERVICE}

  info "Restarting IMEX"
  timeout ${IMEX_START_TIMEOUT} systemctl start ${IMEX_SERVICE}
}

function create_default_imex_channel() {
  info "Creating IMEX default channel"
  MAJOR_NUMBER=$(cat /proc/devices | grep nvidia-caps-imex-channels | cut -d' ' -f1)
  if [ ! -d "/dev/nvidia-caps-imex-channels" ]; then
    sudo mkdir /dev/nvidia-caps-imex-channels
  fi

  # Then check and create device node
  if [ ! -e "/dev/nvidia-caps-imex-channels/channel0" ]; then
    sudo mknod /dev/nvidia-caps-imex-channels/channel0 c $MAJOR_NUMBER 0
    info "IMEX default channel created"
  else
    info "IMEX default channel already exists"
  fi
}

{
  info "PROLOG Start JobId=${SLURM_JOB_ID}: $0"

  return_if_job_is_not_exclusive
  return_if_unsupported_instance_type
  return_if_imex_disabled

  create_default_imex_channel

  IPS_FROM_CR=$(get_ips_from_node_names "${SLURM_NODELIST}")

  info "Node Names: ${SLURM_NODELIST}"
  info "Node IPs: ${IPS_FROM_CR}"
  info "IMEX Nodes Config: ${IMEX_NODES_CONFIG}"

  info "Updating IMEX nodes config ${IMEX_NODES_CONFIG}"
  echo "${IPS_FROM_CR}" > "${IMEX_NODES_CONFIG}"
  reload_imex

  prolog_end

} 2>&1 | tee -a "${LOG_FILE_PATH}" | logger -t "91_nvidia_imex_prolog"
```

## HeadNode OnNodeStart 사용자 지정 작업 스크립트 생성
<a name="support-nvidia-imex-p6e-gb200-instance-action-script"></a>

컴퓨팅 노드에서 액세스하고 실행할 적절한 권한을 설정하는 공유 디렉터리에 앞서 언급한 prolog 스크립트를 다운로드`/opt/slurm/etc/scripts/prolog.d/`하는 `install_custom_action.sh` 사용자 지정 작업을 생성합니다.

```
#!/bin/bash
set -e

echo "Executing $0"

PROLOG_NVIDIA_IMEX=/opt/slurm/etc/scripts/prolog.d/91_nvidia_imex_prolog.sh
aws s3 cp "s3://<Bucket>/91_nvidia_imex_prolog.sh" "${PROLOG_NVIDIA_IMEX}"
chmod 0755 "${PROLOG_NVIDIA_IMEX}"
```

## 클러스터 생성
<a name="support-nvidia-imex-p6e-gb200-instance-cluster"></a>

P6e-GB200 인스턴스를 포함하는 클러스터를 생성합니다. 아래에서 Ultraserver 유형 용 SlurmQueues가 포함된 구성 예제를 찾을 수 있습니다`u-p6e-gb200x72`.

P6e-GB200은 현재 로컬 영역에서만 사용할 수 있습니다. 일부 [로컬 영역은 NAT 게이트웨이를 지원하지](https://docs.aws.amazon.com/local-zones/latest/ug/local-zones-connectivity-nat.html) 않으므로 ParallelCluster가 AWS 서비스에 [제한된 환경에 대한 보안 그룹 구성](security-groups-configuration.md) 연결해야 하므로 [로컬 영역에 대한 연결 옵션을](https://docs.aws.amazon.com/local-zones/latest/ug/local-zones-connectivity.html) 따르세요. Ultraserver는 용량 블록으로만 사용할 수 있으므로 [용량 블록(CB)을 사용하여 인스턴스 시작](launch-instances-capacity-blocks.md) (AWS ParallelClusterLaunch)를 따르세요.

```
HeadNode:
  CustomActions:
    OnNodeStart:
      Script: s3://<s3-bucket-name>/install_custom_action.sh
    S3Access:
      - BucketName: <s3-bucket-name>
  InstanceType: <HeadNode-instance-type>
  Networking:
    SubnetId: <subnet-abcd78901234567890>
  Ssh:
    KeyName: <Key-name>
Image:
  Os: ubuntu2404
Scheduling:
  Scheduler: slurm
  SlurmSettings:
    CustomSlurmSettings:
      - PrologFlags: "Alloc,NoHold"
      - MessageTimeout: 240
  SlurmQueues:
    - CapacityReservationTarget:
        CapacityReservationId: <cr-123456789012345678>
      CapacityType: CAPACITY_BLOCK
      ComputeResources: ### u-p6e-gb200x72
        - DisableSimultaneousMultithreading: true
          Efa:
            Enabled: true
          InstanceType: p6e-gb200.36xlarge  
          MaxCount: 18
          MinCount: 18
          Name: cr1
      Name: q1
      Networking:
        SubnetIds:
          - <subnet-1234567890123456>
```

## IMEX 설정 검증
<a name="support-nvidia-imex-p6e-gb200-instance-validate"></a>

Slurm 작업을 제출하면 `91_nvidia_imex_prolog.sh` prolog가 실행됩니다. 다음은 NVIDIA-imex 도메인 상태를 확인하는 작업의 예입니다.

```
#!/bin/bash
#SBATCH --job-name=nvidia-imex-status-job
#SBATCH --ntasks-per-node=1
#SBATCH --output=slurm-%j.out
#SBATCH --error=slurm-%j.err

QUEUE_NAME="q1"
COMPUTE_RES_NAME="cr1"
IMEX_CONFIG_FILE="/opt/parallelcluster/shared/nvidia-imex/config_${QUEUE_NAME}_${COMPUTE_RES_NAME}.cfg"

srun bash -c "/usr/bin/nvidia-imex-ctl -N -c ${IMEX_CONFIG_FILE} > result_\${SLURM_JOB_ID}_\$(hostname).out 2> result_\${SLURM_JOB_ID}_\$(hostname).err"
```

작업의 출력을 확인합니다.

```
Connectivity Table Legend:
I - Invalid - Node wasn't reachable, no connection status available
N - Never Connected
R - Recovering - Connection was lost, but clean up has not yet been triggered.
D - Disconnected - Connection was lost, and clean up has been triggreed.
A - Authenticating - If GSSAPI enabled, client has initiated mutual authentication.
!V! - Version mismatch, communication disabled.
!M! - Node map mismatch, communication disabled.
C - Connected - Ready for operation

5/12/2025 06:08:10.580
Nodes:
Node #0   - 172.31.48.81    - READY                - Version: 570.172
Node #1   - 172.31.48.98    - READY                - Version: 570.172
Node #2   - 172.31.48.221   - READY                - Version: 570.172
Node #3   - 172.31.49.228   - READY                - Version: 570.172
Node #4   - 172.31.50.39    - READY                - Version: 570.172
Node #5   - 172.31.50.44    - READY                - Version: 570.172
Node #6   - 172.31.51.66    - READY                - Version: 570.172
Node #7   - 172.31.51.157   - READY                - Version: 570.172
Node #8   - 172.31.52.239   - READY                - Version: 570.172
Node #9   - 172.31.53.80    - READY                - Version: 570.172
Node #10  - 172.31.54.95    - READY                - Version: 570.172
Node #11  - 172.31.54.183   - READY                - Version: 570.172
Node #12  - 172.31.54.203   - READY                - Version: 570.172
Node #13  - 172.31.54.241   - READY                - Version: 570.172
Node #14  - 172.31.55.59    - READY                - Version: 570.172
Node #15  - 172.31.55.187   - READY                - Version: 570.172
Node #16  - 172.31.55.197   - READY                - Version: 570.172
Node #17  - 172.31.56.47    - READY                - Version: 570.172

 Nodes From\To  0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17
       0        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C 
       1        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C 
       2        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C
       3        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C  
       4        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C 
       5        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C 
       6        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C
       7        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C 
       8        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C 
       9        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   
      10        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   
      11        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   
      12        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   
      13        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   
      14        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C  
      15        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C  
      16        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C  
      17        C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C   C  

Domain State: UP
```