Slurm環境での利用を前提とするUCX通信フレームワークベースのOpenMPI構築方法
Slurm 環境で OpenMPI のアプリケーションを実行する場合、計算リソース確保、MPIプロセス起動、及びMPIプロセス間通信初期化をそれぞれ誰が行うか、ノード間リモート実行と起動コマンドに何を使用するかにより、以下3種類の動作モードが存在します。
| No. | 計算リソース 確保 |
MPIプロセス 起動 |
MPIプロセス間 通信初期化 |
ノード間 リモート実行 |
起動コマンド |
|---|---|---|---|---|---|
| 1. | Slurm | Slurm | PMIx | Slurm | srun |
| 2. | Slurm | Slurm | PMIx | Slurm | mpirun (※1) |
| 3. | Slurm | PRRTE | PMIx | SSH (※2) |
mpirun |
※1)本テクニカルTipsの手順に従い、 Slurm と連携するよう OpenMPI がビルドされている必要があります。
※2)パスフレーズ無しで計算ノード間をSSHアクセス出来るよう設定する必要があります。
ここで No. 1. の動作モードは、その他の動作モードに対して以下の利点があります。
- 高並列アプリケーションを高速に起動することが可能(※3)
- プロセスバインディングや終了処理等のプロセス管理を Slurm に統合することが可能
- 精度の高いアカウンティング情報を Slurm に提供することが可能
- Slurm クラスタ内のパスフレーズ無しSSHアクセス設定が不要
※3)この詳細は、OCI HPCテクニカルTips集 の Slurmによるリソース管理・ジョブ管理システム構築方法 の 0. 概要 を参照してください。
また UCX は、HPCでの利用を念頭に開発されているオープンソースの通信フレームワークで、 OpenMPI から利用可能な以下のノード内・ノード間通信手段を提供します。
-
ノード内
- POSIX共有メモリ
- SYSTEM V共有メモリ
- Cross Memory Attach (CMA)
- XPMEM
- GDRCopy (GPUノードの場合のみ使用します。)
-
ノード間
- InfiniBandトランスポート
- Unreliable Datagram (UD)
- Reliable Connected (RC)
- Dynamically Connected (DC)
- TCP
- InfiniBandトランスポート
特に UCX を使用するノード間通信は、 クラスタ・ネットワーク を介してInfiniBandトランスポートを使用したRDMA通信を行うことで、高帯域・低遅延のMPIプロセス間通信を実現します。
また Unified Collective Communication (以降 UCC と呼称します。) は、HPC/機械学習ワークロードでの利用を念頭に開発されている高性能・スケーラブルな集合通信ライブラリで、 OpenMPI の Modular Component Architecture (以降 MCA と呼称)に組み込まれたコンポーネントとして OpenMPI が提供する集合通信ライブラリを置き換えて利用することで、集合通信を多用するアプリケーションの高速化が期待できます。
以上の利点を享受するべく本テクニカルTipsは、 Slurm 環境でMPIアプリケーションを No. 1. の動作モードで実行すること、通信フレームワークに UCX を使用すること、及び UCC を MCA のコンポーネントとして利用することを想定し、このための OpenMPI の構築方法をCPUワークロード向け計算ノードでの手順とGPUワークロード向けGPUノードでの手順を解説、構築した OpenMPI の稼働確認として以下のアプリケーションを実行します。
本テクニカルTipsは、以下の環境を前提とし、
- 計算ノード
- シェイプ: BM.Optimized3.36
- ノード数: 少なくとも2ノード
- イメージ: Oracle Linux 8.10 / 9.05ベースのHPC クラスタネットワーキングイメージ (※4)
- GPUノード
- シェイプ: BM.GPU4.8/BM.GPU.A100-v2.8
- ノード数: 少なくとも2ノード
- イメージ: Oracle Linux 9.05ベースのGPU クラスタネットワーキングイメージ (※5)
- ノード間接続インターコネクト
- クラスタ・ネットワーク
- リンク速度: 100 Gbps
- OpenMPI : 5.0.8
- PMIx : OpenPMIx 5.0.8
- UCX : OpenUCX 1.19.0
- UCC : 1.5.0
※4)OCI HPCテクニカルTips集 の クラスタネットワーキングイメージの選び方 の 1. クラスタネットワーキングイメージ一覧 のイメージ No.12 / No.13 です。
※5)OCI HPCテクニカルTips集 の クラスタネットワーキングイメージの選び方 の 1. クラスタネットワーキングイメージ一覧 のイメージ No.15 です。
Oracle Linux のバージョンと計算ノードかGPUノードかで手順の異なる箇所は、都度記載の注釈でどの手順を実行するかを判断します。
なお、ここで構築する OpenMPI と連携する Slurm 環境の構築方法は、 OCI HPCテクニカルTips集 の Slurmによるリソース管理・ジョブ管理システム構築方法 を参照してください。
本章は、本テクニカルTipsで OpenMPI をインストールするHPC/GPUクラスタを構築します。
この構築は、 OCI HPCチュートリアル集 の HPCクラスタを構築する(基礎インフラ手動構築編) / GPUクラスタを構築する(基礎インフラ自動構築編) の手順に従い実施します。
この際、計算ノード/GPUノードを以下のように構成します。
- 計算ノード
- シェイプ : BM.Optimized3.36
- ノード数: 少なくとも2ノード
- イメージ: Oracle Linux 8.10 / 9.05ベースのHPC クラスタネットワーキングイメージ (※6)
- GPUノード
- シェイプ: BM.GPU4.8/BM.GPU.A100-v2.8
- ノード数: 少なくとも2ノード
- イメージ: Oracle Linux 9.05ベースのGPU クラスタネットワーキングイメージ (※7)
※6)OCI HPCテクニカルTips集 の クラスタネットワーキングイメージの選び方 の 1. クラスタネットワーキングイメージ一覧 のイメージ No.12 / No.13 です。
※7)OCI HPCテクニカルTips集 の クラスタネットワーキングイメージの選び方 の 1. クラスタネットワーキングイメージ一覧 のイメージ No.15 です。
本章は、 OpenMPI のインストールを以下の順に全ての計算/GPUノードに実施します。
以下コマンドをopcユーザで実行し、 libevent を /opt/libevent ディレクトリにインストールします。
$ mkdir -p ~/`hostname` && cd ~/`hostname` && wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
$ tar -xvf ./libevent-2.1.12-stable.tar.gz
$ cd libevent-2.1.12-stable && ./configure --prefix=/opt/libevent
$ make -j && sudo make install; echo $?
次に、以下コマンドをopcユーザで実行し、 hwloc を /opt/hwloc ディレクトリにインストールします。
なお、インストール対象のイメージがHPC / GPU クラスタネットワーキングイメージ のどちらかにより実行するコマンドが異なる点に留意します。
$ cd ~/`hostname` && wget https://download.open-mpi.org/release/hwloc/v2.12/hwloc-2.12.2.tar.gz
$ tar -xvf ./hwloc-2.12.2.tar.gz
$ cd hwloc-2.12.2 && ./configure --prefix=/opt/hwloc # For HPC
$ cd hwloc-2.12.2 && ./configure --prefix=/opt/hwloc --with-cuda=/usr/local/cuda # For GPU
$ make -j && sudo make install; echo $?
次に、以下コマンドをopcユーザで実行し、 OpenPMIx を /opt/pmix ディレクトリにインストールします。
$ cd ~/`hostname` && wget https://github.com/openpmix/openpmix/releases/download/v5.0.8/pmix-5.0.8.tar.gz
$ tar -xvf ./pmix-5.0.8.tar.gz
$ cd pmix-5.0.8 && ./configure --prefix=/opt/pmix --with-libevent=/opt/libevent --with-hwloc=/opt/hwloc
$ make -j && sudo make install; echo $?
次に、以下コマンドをopcユーザで実行し、 XPMEM を /opt/xpmem ディレクトリにインストールします。
この手順は、 Oracle Linux 8.10の場合のみ実施します。
$ cd ~/`hostname` && git clone https://github.com/hpc/xpmem.git
$ cd xpmem && ./autogen.sh && ./configure --prefix=/opt/xpmem
$ make -j && sudo make install; echo $?
次に、以下コマンドをopcユーザで実行し、 XPMEM をカーネルモジュールとしてインストールします。
この手順は、 Oracle Linux 8.10の場合のみ実施します。
$ sudo modprobe -r xpmem
$ sudo install -D -m 644 /opt/xpmem/lib/modules/`uname -r`/kernel/xpmem/xpmem.ko /lib/modules/`uname -r`/extra/xpmem/xpmem.ko
$ sudo depmod -a
$ sudo modprobe xpmem
次に、以下コマンドをopcユーザで実行し、 GDRCopy を /opt/gdrcopy ディレクトリにインストールします。
この手順は、GPU クラスタネットワーキングイメージ の場合のみ実施します。
$ cd ~/`hostname` && wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.5.1.tar.gz
$ tar -xvf ./v2.5.1.tar.gz
$ cd gdrcopy-2.5.1 && make -j 64 CUDA=/usr/local/cuda all && sudo make prefix=/opt/gdrcopy install; echo $?
$ sed 's/src\/gdrdrv/\/lib\/modules\/`uname -r`\/extra/g' ./insmod.sh | sudo tee /opt/gdrcopy/bin/insmod.sh && sudo chmod 755 /opt/gdrcopy/bin/insmod.sh
次に、以下のファイルを /etc/systemd/system/gdrcopy.service として作成します。
この手順は、GPU クラスタネットワーキングイメージ の場合のみ実施します。
[Unit]
Description=Start GDRCopy
[Service]
ExecStart=/opt/gdrcopy/bin/insmod.sh
Restart=no
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
次に、以下コマンドをopcユーザで実行し、 GDRCopy をカーネルモジュールとしてインストールします。
この手順は、GPU クラスタネットワーキングイメージ の場合のみ実施します。
$ sudo install -D -m 644 ./src/gdrdrv/gdrdrv.ko /lib/modules/`uname -r`/extra/gdrdrv.ko
$ sudo depmod -a
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now gdrcopy
以下コマンドをopcユーザで実行し、 OpenUCX を /opt/ucx ディレクトリにインストールします。
なお、インストール対象のイメージが Oracle Linux 8.10 / 9.05ベースのHPC / GPU クラスタネットワーキングイメージ のうちどれかにより実行するコマンドが異なる点に留意します。
$ cd ~/`hostname` && wget https://github.com/openucx/ucx/releases/download/v1.19.0/ucx-1.19.0.tar.gz
$ tar -xvf ./ucx-1.19.0.tar.gz
$ cd ucx-1.19.0 && ./contrib/configure-release --prefix=/opt/ucx --with-xpmem=/opt/xpmem # For Oracle Linux 8 HPC
$ cd ucx-1.19.0 && ./contrib/configure-release --prefix=/opt/ucx # For Oracle Linux 9 HPC
$ cd ucx-1.19.0 && ./contrib/configure-release --prefix=/opt/ucx --with-cuda=/usr/local/cuda -with-gdrcopy=/opt/gdrcopy # For Oracle Linux 9 GPU
$ make -j && sudo make install; echo $?
以下コマンドをopcユーザで実行し、 UCC を /opt/ucc ディレクトリにインストールします。
なお、インストール対象のイメージがHPC / GPU クラスタネットワーキングイメージ のどちらかにより実行するコマンドが異なる点に留意します。
$ cd ~/`hostname` && wget https://github.com/openucx/ucc/archive/refs/tags/v1.5.0.tar.gz
$ tar -xvf ./v1.5.0.tar.gz
$ cd ./ucc-1.5.0/ && ./autogen.sh && ./configure --prefix=/opt/ucc --with-ucx=/opt/ucx # For HPC
$ cd ./ucc-1.5.0/ && ./autogen.sh && ./configure --prefix=/opt/ucc --with-ucx=/opt/ucx --with-cuda=/usr/local/cuda --with-nccl # For GPU
$ make -j && sudo make install; echo $?
以下コマンドをopcユーザで実行し、 OpenMPI を /opt/openmpi ディレクトリにインストールします。
なお、インストール対象のイメージがHPC / GPU クラスタネットワーキングイメージ のどちらかにより実行するコマンドが異なる点に留意します。
$ cd ~/`hostname` && wget https://download.open-mpi.org/release/open-mpi/v5.0/openmpi-5.0.8.tar.gz
$ tar -xvf ./openmpi-5.0.8.tar.gz
$ cd openmpi-5.0.8 && ./configure --prefix=/opt/openmpi --with-libevent=/opt/libevent --with-hwloc=/opt/hwloc --with-pmix=/opt/pmix --with-ucx=/opt/ucx --with-ucc=/opt/ucc --with-slurm # For HPC
$ cd openmpi-5.0.8 && ./configure --prefix=/opt/openmpi --with-libevent=/opt/libevent --with-hwloc=/opt/hwloc --with-pmix=/opt/pmix --with-ucx=/opt/ucx --with-ucc=/opt/ucc --with-slurm --with-cuda=/usr/local/cuda # For GPU
$ make -j all && sudo make install; echo $?
次に、以下のファイルを /usr/share/Modules/modulefiles/openmpi で作成します。
このファイルは、 Environment Modules にモジュール名 openmpi を登録し、これをロードすることで OpenMPI 利用環境の設定を可能にします。
なお、インストール対象のイメージがHPC / GPU クラスタネットワーキングイメージ のどちらかにより作成するファイルが異なる点に留意します。
#%Module1.0
##
## OpenMPI for GNU compiler on HPC image
proc ModulesHelp { } {
puts stderr "OpenMPI 5.0.8 for GNU compiler on HPC image\n"
}
module-whatis "OpenMPI 5.0.8 for GNU compiler on HPC image"
set pkg_root /opt/openmpi
set ver 5.0.8
setenv MPI_ROOT $pkg_root
setenv MPICC mpicc
setenv MPICXX mpicxx
setenv MPIFC mpif90
prepend-path PATH $pkg_root/bin:/opt/ucx/bin
prepend-path LD_LIBRARY_PATH $pkg_root/lib
prepend-path LIBRARY_PATH $pkg_root/lib
prepend-path CPATH $pkg_root/include
prepend-path C_INCLUDE_PATH $pkg_root/include
prepend-path CPLUS_INCLUDE_PATH $pkg_root/include
prepend-path MANPATH $pkg_root/share/man
#%Module1.0
##
## OpenMPI for GNU compiler on GPU image
proc ModulesHelp { } {
puts stderr "OpenMPI 5.0.8 for GNU compiler on GPU image\n"
}
module-whatis "OpenMPI 5.0.8 for GNU compiler on GPU image"
set pkg_root /opt/openmpi
set ver 5.0.8
setenv MPI_ROOT $pkg_root
setenv MPICC mpicc
setenv MPICXX mpicxx
setenv MPIFC mpif90
prepend-path PATH $pkg_root/bin:/opt/ucx/bin
prepend-path LD_LIBRARY_PATH $pkg_root/lib:/opt/gdrcopy/lib
prepend-path LIBRARY_PATH $pkg_root/lib:/opt/gdrcopy/lib
prepend-path CPATH $pkg_root/include
prepend-path C_INCLUDE_PATH $pkg_root/include
prepend-path CPLUS_INCLUDE_PATH $pkg_root/include
prepend-path MANPATH $pkg_root/share/man
本章は、インストールした OpenMPI を実行するための事前準備を行い、 OSU Micro-Benchmarks と NAS Parallel Benchmarks で稼働確認を行います。
OCI HPCテクニカルTips集 の 計算/GPUノードのホスト名リスト作成方法 の手順に従い、MPIプログラムを実行する全てのホスト名を記載したホストリストファイルを OpenMPI 利用ユーザのホームディレクトリ直下に hostlist.txt として作成します。
なお、ここで作成するホストリストファイルは、 OpenMPI 単独で稼働確認を行うために作成しますが、 Slurm 環境では必要ありません。
次に、OpenMPI 利用ユーザのホームディレクトリがノード間で共有されていることを前提に、以下コマンドを何れか1ノードで OpenMPI を利用するユーザで実行し、MPIプログラムを実行する全てのノード間でパスフレーズ無しでSSHアクセス出来るように設定します。
このユーザのホームディレクトリが共有されていない場合は、1ノードで以下の手順を実行し、作成した id_rsa 、 authorized_keys 、 及び known_hosts の3個のファイルをパーミッションを維持して OpenMPI を実行する全てのノードの同じディレクトリに配置します。
なお、ここで実施するパスフレーズ無しのSSHアクセスのための手順は、 OpenMPI 単独で稼働確認を行うために実施しますが、 PMIx を使用する Slurm 環境では必要ありません。
$ cd ~ && mkdir .ssh && chmod 700 .ssh
$ ssh-keygen -t rsa -N "" -f .ssh/id_rsa
$ cd .ssh && cat ./id_rsa.pub >> ./authorized_keys && chmod 600 ./authorized_keys
$ for hname in `cat ~/hostlist.txt`; do echo $hname; ssh -oStrictHostKeyChecking=accept-new $hname :; done
OCI HPCパフォーマンス関連情報 の OSU Micro-Benchmarks実行方法(BM.Optimized3.36編) / OSU Micro-Benchmarks実行方法(BM.GPU4.8/BM.GPU.A100-v2.8編) の手順に従い、 OSU Micro-Benchmarks を実行してその結果が想定される性能となっていることを確認します。
OpenMPI 利用ユーザのホームディレクトリがノード間で共有されていることを前提に、以下コマンドを何れか1ノードで OpenMPI を利用するユーザで実行し、 NAS Parallel Benchmarks をインストールします。
$ mkdir -p ~/`hostname` && cd ~/`hostname` && wget https://www.nas.nasa.gov/assets/npb/NPB3.4.3-MZ.tar.gz
$ tar -xvf ./NPB3.4.3-MZ.tar.gz
$ cd NPB3.4.3-MZ/NPB3.4-MZ-MPI
$ cp config/make.def.template config/make.def
$ module load openmpi
$ make bt-mz CLASS=C
次に、以下コマンドを何れか1ノードで OpenMPI を利用するユーザで実行し、 NAS Parallel Benchmarks を実行、その結果を確認します。
なお、実行対象が計算/GPUノードのどちらかにより実行するコマンドが異なる点に留意します。またこのコマンドは、2ノード実行の場合です。
$ mpirun -n 36 -N 18 --hostfile ~/hostlist.txt -x OMP_NUM_THREADS=2 -x UCX_NET_DEVICES=mlx5_2:1 --bind-to none ./bin/bt-mz.C.x # For compute x 2 nodes
$ mpirun -n 64 -N 32 --hostfile ~/hostlist.txt -x OMP_NUM_THREADS=2 -x UCX_NET_DEVICES=mlx5_6:1 --bind-to none ./bin/bt-mz.C.x # For GPU x 2 nodes
以下は、計算ノード2ノードで実行した場合の出力です。
[inst-xsyjo-x9-ol905:253761] SET OMP_NUM_THREADS=2
[inst-xsyjo-x9-ol905:253761] SET UCX_NET_DEVICES=mlx5_2:1
NAS Parallel Benchmarks (NPB3.4-MZ MPI+OpenMP) - BT-MZ Benchmark
Number of zones: 16 x 16
Total mesh size: 480 x 320 x 28
Iterations: 200 dt: 0.000100
Number of active processes: 36
Use the default load factors
Total number of threads: 72 ( 2.0 threads/process)
Calculated speedup = 70.51
Time step 1
Time step 20
Time step 40
Time step 60
Time step 80
Time step 100
Time step 120
Time step 140
Time step 160
Time step 180
Time step 200
Verification being performed for class C
accuracy setting for epsilon = 0.1000000000000E-07
Comparison of RMS-norms of residual
1 0.3457703287806E+07 0.3457703287806E+07 0.1089509278487E-12
2 0.3213621375929E+06 0.3213621375929E+06 0.1320422658492E-12
3 0.7002579656870E+06 0.7002579656870E+06 0.1512841667693E-13
4 0.4517459627471E+06 0.4517459627471E+06 0.2280652586031E-13
5 0.2818715870791E+07 0.2818715870791E+07 0.1486830094937E-14
Comparison of RMS-norms of solution error
1 0.2059106993570E+06 0.2059106993570E+06 0.1540627820550E-12
2 0.1680761129461E+05 0.1680761129461E+05 0.2136344671269E-12
3 0.4080731640795E+05 0.4080731640795E+05 0.3102425585186E-13
4 0.2836541076778E+05 0.2836541076778E+05 0.1026032398931E-12
5 0.2136807610771E+06 0.2136807610771E+06 0.2333146948798E-12
Verification Successful
BT-MZ Benchmark Completed.
Class = C
Size = 480x 320x 28
Iterations = 200
Time in seconds = 7.67
Total processes = 36
Total threads = 72
Mop/s total = 316523.02
Mop/s/thread = 4396.15
Operation type = floating point
Verification = SUCCESSFUL
Version = 3.4.3
Compile date = 04 Sep 2025
Compile options:
FC = mpif90
FLINK = $(FC)
F_LIB = (none)
F_INC = (none)
FFLAGS = -O3 -fopenmp
FLINKFLAGS = $(FFLAGS)
RAND = (none)
Please send all errors/feedbacks to:
NPB Development Team
npb@nas.nasa.gov
$