

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# UltraServer インスタンスを設定する
<a name="capacity-blocks-nvidia-imex"></a>

NVIDIA UltraServer インスタンスGPUs を接続します。 NVLink NVLink 経由の GPU-to-GPU通信では、[NVIDIA IMEX](https://docs.nvidia.com/multi-node-nvlink-systems/imex-guide/index.html) サービスをジョブ内のすべてのコンピューティングノードの IP アドレスで設定する必要があります。このページでは、ジョブごとに IMEX を自動的に設定する Slurm プロログスクリプトを作成する方法と、それを PCS AWS クラスターにデプロイする方法を示します。

## 前提条件
<a name="capacity-blocks-nvidia-imex-prerequisites"></a>
+ Slurm AWS 25.05 以降の PCS クラスター。
+ キャパシティブロックを持つ UltraServer インスタンスを使用するコンピューティングノードグループ。詳細については、「[キャパシティブロックを使用するように PCS AWS コンピューティングノードグループを設定する](capacity-blocks-configure-cng.md)」を参照してください。
+ NVIDIA ドライバー、CUDA、IMEX パッケージがインストールされている AMI。IMEX サービス (`nvidia-imex`) は AMI で有効にする必要があります。
+ prolog スクリプトは、クラスターの Slurm `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)」と[「トポロジ.yaml リファレンス](https://slurm.schedmd.com/topology.yaml.html)」を参照してください。

ジョブを送信するときは、 コマンド`sbatch`と `srun` コマンドで `--segment=N`引数を使用して、同じブロック内でグループ化するノードの数を指定できます。セグメントのサイズは、計画ブロックサイズ以下である必要があります。`--segment` を使用しても、セグメントが異なるブロックに配置されるとは限りません。

以下は、18 ノードの UltraServers (たとえば、インスタンスが 18 `u-p6e-gb200x72`個の ) を持つキューにブロックを割り当てるシナリオの例です`p6e-gb200.36xlarge`。

```
# 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>

PCS の UltraServer AWS アーキテクチャで最適なパフォーマンスを得るには:
+ **可用性を高めるためにセグメントを使用する**: フルブロックサイズより小さい値を持つ `--segment`オプションを使用して、ドレインされたノードまたは使用できないノードがあるブロックでジョブをスケジュールできるようにします。これにより、NVLink の絶対ローカリティが取引され、ジョブのスケジューリング時間が短縮されます。詳細については、[「トポロジ/ブロックプラグインを使用してノードスケジューリングをより詳細に制御](https://slurm.schedmd.com/SLUG24/NVIDIA-Craig_Tierney.pdf)する」を参照してください。
+ **ジョブサイズとブロックサイズを考慮する**: の場合`BlockSizes=18`、最大 18 個のインスタンスを持つジョブは常に 1 つの UltraServer で実行されます。18 個を超えるノードをリクエストするジョブは複数の UltraServers にまたがり、各ブロック内の NVLink 接続とブロック間の EFA ネットワークを使用します。
+ **セグメントのトレードオフ**: を使用すると、高次ブロックサイズのスケジューリング`--segment`が無効になります。を使用しない場合`--segment`、次のブロックを使用する前に完全なブロックが埋められます。では`--segment`、十分な使用可能なノードを持つ任意のブロックにセグメントを配置できます。

## 制限事項
<a name="capacity-blocks-nvidia-imex-limitations"></a>
+ AWS PCS では、UltraServer コンピューティングノードグループは、UltraServer 以外のコンピューティングノードグループとは別の専用キューに配置する必要があります。
+ 各コンピューティングノードグループは、1 つの UltraServer キャパシティブロックにのみ関連付けることができます。
+ キューに複数の UltraServer コンピューティングノードグループが含まれている場合、各コンピューティングノードグループのインスタンス数は、それらの間に 2 倍の比率 (9 と 18、または 2 と 8 など) を持つ必要があります。
+ UltraServer キューのジョブでは、 `--exclusive`フラグを使用して、ジョブごとに専用の IMEX ドメインを確保する必要があります。
+ prolog スクリプトによって作成された IMEX ドメインには、ジョブに割り当てられたノードのみが含まれます。 AWS PCS はノードをジョブに動的に割り当てるため、IMEX ドメインを事前に作成することはできず、ジョブの開始時に設定する必要があります。複数の UltraServers にまたがるジョブは、IMEX ドメインが IP アドレスに基づいており、個別の NVLink エンスペック間でブリッジできないため、異なる UltraServers のノード間で NVLink 接続を持ちません。
+ サービスの実行中に IMEX を変更`nodes_config.cfg`することはできません。設定を変更すると、IMEX は一致しないノードへの通信を完全にブロックします。唯一の復旧は、すべてのノードで IMEX を停止し、一貫した設定で再起動することです。

## IMEX プロログスクリプトを作成する
<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 サービスを再起動します。

**重要**  
このプロログスクリプトでは、 `--exclusive`フラグを使用してジョブを送信する必要があります。他のジョブが同じノードで実行されている間に IMEX を再起動すると、それらのジョブが中断されます。

**注記**  
このプロログスクリプトは、 `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"
```

## プロログスクリプトをデプロイする
<a name="capacity-blocks-nvidia-imex-deploy"></a>

プロログスクリプトをデプロイするには、クラスターで Slurm `Prolog`と`PrologFlags`カスタム設定を設定します。これらは、クラスターの作成時または既存のクラスターの更新時に設定できます。

カスタム Slurm 設定の設定の詳細については、「」を参照してください[PCS クラスターのカスタム Slurm AWS 設定](slurm-custom-settings-cluster.md)。クラスターを更新する手順については、「」を参照してください[PCS AWS クラスターを更新する](working-with_clusters_update_procedure.md)。

クラスターで次のカスタム Slurm 設定を設定します。
+ `Prolog` - プロログスクリプトが などのコンピューティングノードで使用できるパスに設定します`/shared/scripts/prolog.d/91_nvidia_imex_prolog.sh`。
+ `PrologFlags` - を に設定します`Alloc,NoHold`。`Alloc` フラグは、ジョブに最初に割り当てられたときに、各ノードでプロログを実行します。`NoHold` フラグは、プロログが失敗した場合にジョブが保持されるのを防ぎます。

**Example CLI AWS を使用してプロログ設定でクラスターを更新する**  

```
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 ジョブを送信すると自動的に実行されます。テストジョブを送信して、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>

ノード設定マッピングの不一致  
`!M!` 接続テーブルまたは IMEX ログ`Node configuration mapping mismatch`に が表示されている場合、`nodes_config.cfg`ファイルはすべてのノードで一貫しているわけではありません。IMEX は、一致しないノードへの通信を完全にブロックします。プロログスクリプトがすべてのノードで実行されていることを確認し、ジョブを再起動します。

IMEX チャネルデバイスが見つかりません  
プロログスクリプトが IMEX チャネルデバイスの作成に失敗した場合、NVIDIA ドライバーがインストールされ、 `/proc/devices`が含まれていることを確認します`nvidia-caps-imex-channels`。

Prolog スクリプトが実行されていない  
`Prolog` および `PrologFlags`設定がクラスターで設定されていることを確認します。スクリプトファイルがコンピューティングノードに存在し、実行アクセス許可 () があることを確認します`chmod 0755`。