View a markdown version of this page

設定 UltraServer 執行個體 - AWS PCS

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

設定 UltraServer 執行個體

NVIDIA UltraServer 執行個體使用 NVLink 跨執行個體連接多個 GPUs。透過 NVLink 的 GPU-to-GPU 通訊需要使用任務中所有運算節點的 IP 地址來設定 NVIDIA IMEX 服務。此頁面說明如何建立 Slurm prolog 指令碼,以自動為每個任務設定 IMEX,以及如何在 AWS PCS 叢集中部署它。

先決條件

  • 具有 Slurm 25.05 或更新版本的 AWS PCS 叢集。

  • 使用 UltraServer 執行個體搭配容量區塊的運算節點群組。如需詳細資訊,請參閱設定 AWS PCS 運算節點群組以使用容量區塊。

  • 已安裝 NVIDIA 驅動程式、CUDA 和 IMEX 套件的 AMI。必須在 AMI 上啟用 IMEX 服務 (nvidia-imex)。

  • Prolog 指令碼必須在叢集 Slurm Prolog設定中設定的路徑的所有運算節點上可用。您可以使用共用檔案系統,或在自訂 AMI 中包含指令碼。

自動拓撲選擇

當您使用 UltraServer 運算節點群組建立 AWS PCS 叢集時,系統會檢查容量區塊、識別 UltraServer 類型,並使用適當的拓撲外掛程式設定 Slurm。此程序會自動執行,不需要任何組態。

AWS PCS 透過動態產生的topology.yaml檔案來管理拓撲。隨著叢集隨著運算節點群組的新增或移除而演進, AWS PCS 會持續協調拓撲組態,以反映目前的叢集狀態。

封鎖拓撲模型統一、高頻寬通訊網域,其中所有 GPUs 都參與單一高速 NVLink 網域,且延遲接近一致。topology/block 外掛程式會根據定義的網路拓撲配置節點,確保任務放置在相同的 UltraServer 中,而且 GPU-to-GPU通訊使用 NVLink,而不是返回 EFA 網路。

使用拓撲/區塊外掛程式

提交至 UltraServer 佇列的任務會自動由 Slurm 排程器放置在相同的區塊 (UltraServer) 內。區塊中的所有節點都會先配置給任務,再使用下一個區塊。任務必須使用 --exclusive旗標,因為 IMEX 需要每個任務的專用 IMEX 網域,重新啟動 IMEX 服務會中斷相同節點上任何其他執行中的任務。如需拓撲/區塊外掛程式的詳細資訊,請參閱 Slurm 文件中的拓撲指南和拓撲.yaml 參考。

提交任務時,您可以使用 --segment=N引數搭配 sbatch和 srun命令,指定要在相同區塊內分組的節點數量。區段的大小必須小於或等於規劃區塊大小。使用 --segment 不保證區段會放置在不同的區塊上。

以下是使用 18 節點 UltraServers 在佇列上配置區塊的範例案例 (例如,具有 18 個p6e-gb200.36xlarge執行個體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 拓撲的最佳實務

若要在 AWS PCS 中使用 UltraServer 架構獲得最佳效能:

  • 使用區段以獲得更好的可用性:使用值小於完整區塊大小的 --segment選項,以允許在具有一些耗盡或不可用節點的區塊上排程任務。這會交易絕對 NVLink 地區性,以加快任務排程時間。如需詳細資訊,請參閱使用拓撲/區塊外掛程式進一步控制節點排程。

  • 考慮任務大小和區塊大小:如果為 BlockSizes=18,則具有最多 18 個執行個體的任務一律會在單一 UltraServer 上執行。請求超過 18 個節點的任務跨越多個 UltraServers,每個區塊內都有 NVLink 連線,且區塊之間有 EFA 聯網。

  • 區段權衡:使用 會--segment停用高階區塊大小排程。如果沒有 --segment,則會在使用下一個區塊之前填入完整區塊。使用 --segment,區段可以放置在具有足夠可用節點的任何區塊上。

限制

  • AWS PCS 要求 UltraServer 運算節點群組放置在專用佇列中,與非 UltraServer 運算節點群組分開。

  • 每個運算節點群組只能與一個 UltraServer 容量區塊建立關聯。

  • 當佇列包含多個 UltraServer 運算節點群組時,每個運算節點群組的執行個體計數必須在它們之間具有 2 的功率比率 (例如 9 和 18,或 2 和 8)。

  • UltraServer 佇列上的任務必須使用 --exclusive旗標,以確保每個任務都有專用的 IMEX 網域。

  • 由 prolog 指令碼建立的 IMEX 網域僅包含配置給任務的節點。由於 AWS PCS 會將節點動態配置給任務,因此無法預先建立 IMEX 網域,且必須在任務開始時間進行設定。跨越多個 UltraServers 的任務在不同的 UltraServers 中的節點之間不會有 NVLink 連線,因為 IMEX 網域是以 IP 地址為基礎,且無法橋接不同的 NVLink 結構。

  • 服務執行時,nodes_config.cfg無法修改 IMEX。如果組態變更,IMEX 會永久封鎖與不相符節點的通訊。唯一的復原是停止所有節點上的 IMEX,並使用一致的組態重新啟動。

建立 IMEX prolog 指令碼

下列91_nvidia_imex_prolog.sh指令碼會在 Slurm 任務啟動時,在運算節點上設定 NVIDIA IMEX。指令碼名稱會遵循 SchedMD 的命名慣例,使用字91首進行 Prolog 執行排序。

該指令碼會執行下列動作:

  1. 檢查任務是否專屬。IMEX 組態需要獨佔任務,以防止中斷相同節點上的其他執行中任務。

  2. 檢查執行個體類型是否為支援的 UltraServer 類型 (p6e-gb200 或 p6e-gb300)。

  3. 檢查 IMEX 服務是否已啟用。

  4. 建立不存在的 IMEX 預設頻道裝置。

  5. 將所有任務節點的私有 IP 地址寫入 /etc/nvidia-imex/nodes_config.cfg。

  6. 重新啟動 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 指令碼

若要部署 prolog 指令碼,請在叢集上設定 Slurm Prolog和PrologFlags自訂設定。您可以在建立叢集或更新現有叢集時設定這些項目。

如需設定自訂 Slurm 設定的詳細資訊,請參閱 AWS PCS 叢集的自訂 Slurm 設定。如需更新叢集的程序,請參閱 更新 AWS PCS 叢集。

在叢集上設定下列自訂 Slurm 設定:

  • Prolog - 將 設定為可在運算節點上使用 prolog 指令碼的路徑,例如 /shared/scripts/prolog.d/91_nvidia_imex_prolog.sh。

  • PrologFlags - 設定為 Alloc,NoHold。Alloc 旗標會在首次配置給任務時,在每個節點上執行 Prolog。NoHold 旗標可防止在 Prolog 失敗時保留任務。

範例使用 CLI 使用 Prolog 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 設定

提交 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 組態會在連線資料表和 中顯示READY狀態為 C(已連線) 的所有節點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

疑難排解

節點組態映射不相符

如果您在!M!連線資料表或 IMEX 日誌Node configuration mapping mismatch中看到 ,則nodes_config.cfg檔案在所有節點之間都不一致。IMEX 會永久封鎖與不相符節點的通訊。驗證 prolog 指令碼是否在所有節點上執行,並重新啟動任務。

找不到 IMEX 頻道裝置

如果 prolog 指令碼無法建立 IMEX 通道裝置,請確認已安裝 NVIDIA 驅動程式且/proc/devices包含 nvidia-caps-imex-channels。

Prolog 指令碼未執行

確認已在叢集上設定 Prolog和 PrologFlags設定。檢查指令碼檔案是否存在於運算節點上,並具有執行許可 (chmod 0755)。