

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

# UltraServer 인스턴스 구성
<a name="capacity-blocks-nvidia-imex"></a>

NVIDIA UltraServer 인스턴스는 NVLink를 사용하여 인스턴스 간에 여러 GPUs를 연결합니다. NVLink를 통한 GPU-to-GPU 통신에서는 [NVIDIA IMEX](https://docs.nvidia.com/multi-node-nvlink-systems/imex-guide/index.html) 서비스를 작업에 있는 모든 컴퓨팅 노드의 IP 주소로 구성해야 합니다. 이 페이지에서는 각 작업에 대해 IMEX를 자동으로 구성하는 Slurm prolog 스크립트를 생성하는 방법과 AWS 이를 PCS 클러스터에 배포하는 방법을 보여줍니다.

## 사전 조건
<a name="capacity-blocks-nvidia-imex-prerequisites"></a>
+ Slurm 25.05 이상이 설치된 AWS PCS 클러스터.
+ 용량 블록이 있는 UltraServer 인스턴스를 사용하는 컴퓨팅 노드 그룹입니다. 자세한 내용은 [용량 블록을 사용하도록 AWS PCS 컴퓨팅 노드 그룹 구성](capacity-blocks-configure-cng.md) 섹션을 참조하세요.
+ NVIDIA 드라이버, CUDA 및 IMEX 패키지가 설치된 AMI입니다. IMEX 서비스(`nvidia-imex`)는 AMI에서 활성화되어야 합니다.
+ 클러스터의 Slurm `Prolog` 설정에 구성된 경로의 모든 컴퓨팅 노드에서 prolog 스크립트를 사용할 수 있어야 합니다. 공유 파일 시스템을 사용하거나 사용자 지정 AMI에 스크립트를 포함할 수 있습니다.

## 자동 토폴로지 선택
<a name="capacity-blocks-nvidia-imex-topology"></a>

UltraServer 컴퓨팅 노드 그룹을 사용하여 AWS PCS 클러스터를 생성하면 시스템은 용량 블록을 검사하고, UltraServer 유형을 식별하고, 적절한 토폴로지 플러그인으로 Slurm을 구성합니다. 이 프로세스는 자동으로 실행되며 구성이 필요하지 않습니다.

AWS PCS는 동적으로 생성된 `topology.yaml` 파일을 통해 토폴로지를 관리합니다. 클러스터가 컴퓨팅 노드 그룹 추가 또는 제거를 통해 발전함에 따라 AWS PCS는 토폴로지 구성을 지속적으로 조정하여 현재 클러스터 상태를 반영합니다.

블록 토폴로지 모델은 모든 GPUs 참여하는 균일한 고대역폭 통신 도메인을 모델링합니다. NVLink `topology/block` 플러그인은 정의된 네트워크 토폴로지를 기반으로 노드를 할당하므로 작업이 동일한 UltraServer 내에 배치되고 GPU-to-GPU 통신은 EFA 네트워킹으로 돌아가는 대신 NVLink를 사용합니다.

## 토폴로지/블록 플러그인 사용
<a name="capacity-blocks-nvidia-imex-job-submission"></a>

UltraServer 대기열에 제출된 작업은 Slurm 스케줄러에 의해 동일한 블록(UltraServer) 내에 자동으로 배치됩니다. 블록의 모든 노드는 다음 블록을 사용하기 전에 작업에 할당됩니다. IMEX에는 작업당 전용 IMEX 도메인이 필요하고 IMEX 서비스를 다시 시작하면 동일한 노드에서 실행 중인 다른 작업이 중단되므로 작업은 `--exclusive` 플래그를 사용해야 합니다. 토폴로지/블록 플러그인에 대한 자세한 내용은 Slurm 설명서의 [토폴로지 가이드](https://slurm.schedmd.com/topology.html) 및 [topology.yaml 참조](https://slurm.schedmd.com/topology.yaml.html)를 참조하세요.

작업을 제출할 때 `sbatch` 및 `srun` 명령과 함께 `--segment=N` 인수를 사용하여 동일한 블록 내에서 함께 그룹화할 노드 수를 지정할 수 있습니다. 세그먼트의 크기는 계획 블록 크기보다 작거나 같아야 합니다. `--segment`를 사용해도 세그먼트가 다른 블록에 배치된다는 보장은 없습니다.

다음은 18노드 UltraServers를 사용하여 대기열에 블록을 할당하기 위한 샘플 시나리오입니다(예: `p6e-gb200.36xlarge` 인스턴스가 18`u-p6e-gb200x72`개 있는 ).

```
# Allocate a whole block (single UltraServer)
sbatch -N18 --exclusive --partition=ultra job.sh

# Allocate two full blocks (two UltraServers)
sbatch -N36 --exclusive --partition=ultra job.sh

# Allocate 24 nodes: full block is filled before 2nd block is used
sbatch -N24 --exclusive --partition=ultra job.sh

# Allocate 24 nodes as segments of 12, segments can fit on blocks with available space
sbatch -N24 --segment=12 --exclusive --partition=ultra job.sh
```

## UltraServer 토폴로지 모범 사례
<a name="capacity-blocks-nvidia-imex-best-practices"></a>

 AWS PCS에서 UltraServer 아키텍처를 사용하여 최적의 성능을 얻으려면:
+ **가용성을 높이기 위해 세그먼트 사용**: 전체 블록 크기보다 작은 값의 `--segment` 옵션을 사용하여 일부 드레이닝되거나 사용할 수 없는 노드가 있는 블록에서 작업을 예약할 수 있습니다. 이렇게 하면 절대 NVLink 로캘이 거래되어 작업 예약 시간이 단축됩니다. 자세한 내용은 [토폴로지/차단 플러그인을 사용하여 노드 예약에 대한 추가 제어 확보를](https://slurm.schedmd.com/SLUG24/NVIDIA-Craig_Tierney.pdf) 참조하세요.
+ **작업 크기 및 블록 크기 고려**: `BlockSizes=18`인 경우 인스턴스가 최대 18개인 작업은 항상 단일 UltraServer에서 실행됩니다. 18개 이상의 노드를 요청하는 작업은 각 블록 내의 NVLink 연결과 블록 간 EFA 네트워킹을 통해 여러 UltraServers에 걸쳐 있습니다.
+ **세그먼트 절충**:를 사용하면 고차 블록 크기 예약이 `--segment` 비활성화됩니다. 이 없으면 다음 블록`--segment`을 사용하기 전에 전체 블록이 채워집니다. 를 사용하면 사용 가능한 노드가 충분한 모든 블록에 `--segment`세그먼트를 배치할 수 있습니다.

## 제한 사항
<a name="capacity-blocks-nvidia-imex-limitations"></a>
+ AWS PCS를 사용하려면 UltraServer 컴퓨팅 노드 그룹을 UltraServer가 아닌 컴퓨팅 노드 그룹과 별도로 전용 대기열에 배치해야 합니다.
+ 각 컴퓨팅 노드 그룹은 하나의 UltraServer 용량 블록에만 연결할 수 있습니다.
+ 대기열에 여러 UltraServer 컴퓨팅 노드 그룹이 포함된 경우 각 컴퓨팅 노드 그룹의 인스턴스 수는 이들 간에 2의 파워 비율을 가져야 합니다(예: 9와 18 또는 2와 8).
+ UltraServer 대기열의 작업은 작업당 전용 IMEX 도메인을 보장하기 위해 `--exclusive` 플래그를 사용해야 합니다.
+ prolog 스크립트에 의해 생성된 IMEX 도메인에는 작업에 할당된 노드만 포함됩니다. AWS PCS는 노드를 작업에 동적으로 할당하므로 IMEX 도메인을 미리 생성할 수 없으며 작업 시작 시 구성해야 합니다. IMEX 도메인은 IP 주소를 기반으로 하므로 여러 UltraServers에 걸쳐 있는 작업은 서로 다른 UltraServers의 노드 간에 NVLink 연결이 되지 않으며 별도의 NVLink 구성 요소를 연결할 수 없습니다.
+ 서비스가 실행되는 동안에는 IMEX를 수정할 수 `nodes_config.cfg` 없습니다. 구성이 변경되면 IMEX는 일치하지 않는 노드와의 통신을 영구적으로 차단합니다. 유일한 복구 방법은 모든 노드에서 IMEX를 중지하고 일관된 구성으로 다시 시작하는 것입니다.

## IMEX prolog 스크립트 생성
<a name="capacity-blocks-nvidia-imex-prolog"></a>

다음 `91_nvidia_imex_prolog.sh` 스크립트는 Slurm 작업이 시작될 때 컴퓨팅 노드에서 NVIDIA IMEX를 구성합니다. 스크립트 이름은 로그 실행 순서 지정을 위해 [SchedMD의 명명 규칙에](https://slurm.schedmd.com/prolog_epilog.html) 따라 `91` 접두사를 사용합니다.

이 스크립트는 다음 작업을 수행합니다.

1. 작업이 배타적인지 확인합니다. IMEX 구성에는 동일한 노드에서 실행 중인 다른 작업이 중단되는 것을 방지하기 위한 전용 작업이 필요합니다.

1. 인스턴스 유형이 지원되는 UltraServer 유형(`p6e-gb200` 또는 )인지 확인합니다`p6e-gb300`.

1. IMEX 서비스가 활성화되어 있는지 확인합니다.

1. IMEX 기본 채널 디바이스가 없는 경우 생성합니다.

1. 모든 작업 노드의 프라이빗 IP 주소를에 씁니다`/etc/nvidia-imex/nodes_config.cfg`.

1. IMEX 서비스를 다시 시작합니다.

**중요**  
이 prolog 스크립트를 사용하려면 `--exclusive` 작업을 플래그와 함께 제출해야 합니다. 다른 작업이 동일한 노드에서 실행되는 동안 IMEX를 다시 시작하면 해당 작업이 중단됩니다.

**참고**  
이 prolog 스크립트는 `p6e-gb200` 및 `p6e-gb300` 인스턴스 유형을 지원합니다. 다른 인스턴스 유형에 맞게 조정하려면 스크립트의 `ALLOWED_INSTANCE_TYPES` 패턴을 업데이트합니다.

다음 스크립트를 로 저장합니다`91_nvidia_imex_prolog.sh`.

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

# This prolog script configures 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 supported UltraServer instance type.
#   If not, it exits immediately because IMEX must be configured only on those instance types.
# - 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/nvidia-imex-prolog.log"
SCONTROL_CMD="scontrol"
IMEX_START_TIMEOUT=60
IMEX_STOP_TIMEOUT=15
ALLOWED_INSTANCE_TYPES="^(p6e-gb200|p6e-gb300)"
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 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 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"
```

## prolog 스크립트 배포
<a name="capacity-blocks-nvidia-imex-deploy"></a>

prolog 스크립트를 배포하려면 클러스터에서 Slurm `Prolog` 및 `PrologFlags` 사용자 지정 설정을 구성합니다. 클러스터를 생성하거나 기존 클러스터를 업데이트할 때 이를 설정할 수 있습니다.

사용자 지정 Slurm 설정 구성에 대한 자세한 내용은 섹션을 참조하세요[AWS PCS 클러스터에 대한 사용자 지정 Slurm 설정](slurm-custom-settings-cluster.md). 클러스터를 업데이트하는 절차는 섹션을 참조하세요[AWS PCS 클러스터 업데이트](working-with_clusters_update_procedure.md).

클러스터에서 다음과 같은 사용자 지정 Slurm 설정을 지정합니다.
+ `Prolog` -와 같이 컴퓨팅 노드에서 prolog 스크립트를 사용할 수 있는 경로로 설정합니다`/shared/scripts/prolog.d/91_nvidia_imex_prolog.sh`.
+ `PrologFlags` -를 로 설정합니다`Alloc,NoHold`. `Alloc` 플래그는 작업에 처음 할당될 때 각 노드에서 prolog를 실행합니다. `NoHold` 플래그는 prolog가 실패할 경우 작업이 보류되지 않도록 합니다.

**Example AWS CLI를 사용하여 prolog 설정으로 클러스터 업데이트**  

```
aws pcs update-cluster \
  --cluster-identifier <cluster-id> \
  --slurm-configuration '{
    "slurmCustomSettings": [
      {"parameterName": "Prolog", "parameterValue": "/shared/scripts/prolog.d/91_nvidia_imex_prolog.sh"},
      {"parameterName": "PrologFlags", "parameterValue": "Alloc,NoHold"}
    ]
  }'
```

## IMEX 설정 검증
<a name="capacity-blocks-nvidia-imex-validate"></a>

Slurm 작업을 제출하면 prolog 스크립트가 자동으로 실행됩니다. 테스트 작업을 제출하여 IMEX가 모든 노드에서 올바르게 구성되었는지 확인합니다.

라는 작업 스크립트를 생성합니다`check-imex.sh`.

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

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

UltraServer 대기열에 작업을 제출합니다.

```
sbatch -p {{queue-name}} -N {{node-count}} check-imex.sh
```

출력 파일을 확인합니다. IMEX 구성이 성공하면 연결 테이블 및에 `C` (연결됨) `READY` 상태인 모든 노드가 표시됩니다`Domain State: UP`.

```
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/4/2026 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
```

## 문제 해결
<a name="capacity-blocks-nvidia-imex-troubleshooting"></a>

노드 구성 매핑 불일치  
연결 테이블 또는 IMEX 로그`!M!`에가 표시되면 `nodes_config.cfg` 파일이 모든 노드`Node configuration mapping mismatch`에서 일관되지 않은 것입니다. IMEX는 일치하지 않는 노드와의 통신을 영구적으로 차단합니다. prolog 스크립트가 모든 노드에서 실행되었는지 확인하고 작업을 다시 시작합니다.

IMEX 채널 디바이스를 찾을 수 없음  
prolog 스크립트가 IMEX 채널 디바이스를 생성하지 못하는 경우 NVIDIA 드라이버가 설치되어 있고가 `/proc/devices` 포함되어 있는지 확인합니다`nvidia-caps-imex-channels`.

Prolog 스크립트가 실행되지 않음  
클러스터에 `Prolog` 및 `PrologFlags` 설정이 구성되어 있는지 확인합니다. 스크립트 파일이 컴퓨팅 노드에 존재하고 실행 권한()이 있는지 확인합니다`chmod 0755`.