p6e-gb200 インスタンスでの NVIDIA-Imex のサポート - AWS ParallelCluster

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

p6e-gb200 インスタンスでの NVIDIA-Imex のサポート

このチュートリアルでは、P6e-GB200 AWS ParallelCluster で を開始し、AI トレーニングと推論に最高の GPU パフォーマンスを活用する方法を示します。p6e-gb200.36xlarge インスタンスは、 が Ultraserver サイズで、 が Ultraserver を形成する InstanceType である P6e-GB200 UltraServers を介してのみ使用できますu-p6e-gb200x72 p6e-gb200.36xlarge InstanceType Ultraserver を購入するu-p6e-gb200x72と、18 個のp6e-gb200.36xlargeインスタンスを持つ ML の EC2 キャパシティブロックを通じて利用できるようになります。詳細については、「P6e-GB200」を参照してください。

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 Block トポロジプラグインを設定します (バージョン 3.14.0 のリリースノートとドキュメント履歴エントリを参照)。

ただし、NVLink 経由の GPU-to-GPU通信には追加の設定が必要です。特に、ParallelCluster が自動的に生成しない IMEX ドメイン内のコンピューティングノードの IP アドレスを含むnodes_config.cfgファイルが必要です。このファイルを生成するために、コンピューティングノードIPs を自動的に検出し、nodes_config.cfg以下の NVIDIA IMEX Slurm ジョブスケジューラ統合の推奨事項を設定するプロログスクリプトが用意されています。このチュートリアルでは、プロログスクリプトを作成し、HeadNode カスタムアクションを使用してデプロイし、IMEX セットアップを検証する方法について説明します。

注記

P6e-GB200 は、Amazon Linux AWS ParallelCluster 2023、Ubuntu 22.04、および Ubuntu 24.04 で v3.14.0 以降でサポートされています。サポートされているディストリビューションの詳細なソフトウェアバージョンと更新されたリストについては、AWS ParallelCluster 変更ログを参照してください。

NVIDIA-Imex を管理する Prolog スクリプトを作成する

制限:

  • このプロログスクリプトは、排他的ジョブの送信時に実行されます。これは、IMEX 再起動によって、IMEX ドメインに属する p6e-Gb200 ノードで実行中のジョブが中断されないようにするためです。

以下は、Slurm でプロログとして設定する必要がある91_nvidia_imex_prolog.shスクリプトです。これは、コンピューティングノードの nvidia-imex 設定を自動的に更新するために使用されます。スクリプトの名前には、SchedMD の命名規則に準拠91するためのプレフィックス があります。これにより、シーケンス内の他のプロログスクリプトより先に実行されます。このスクリプトは、ジョブの開始時に 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 カスタムアクションスクリプトを作成する

コンピューティングノードによってアクセス/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}"

クラスターを作成する

P6e-GB200 インスタンスを含むクラスターを作成します。以下は、Ultraserver タイプ の SlurmQueues を含む設定例ですu-p6e-gb200x72

P6e-GB200 は現在、ローカルゾーンでのみ使用できます。一部のローカルゾーンは NAT ゲートウェイをサポートしていないため、ParallelCluster が AWS サービスに接続制限された環境のセキュリティグループの設定する必要があるため、ローカルゾーンの接続オプションに従ってください。Ultraserver はキャパシティブロックとしてのみ使用できるため、 キャパシティブロック (CB) を使用してインスタンスを起動する (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 セットアップの検証

91_nvidia_imex_prolog.sh プロログは、Slurm ジョブを送信すると実行されます。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