0. 概要
複数の計算ノードを クラスタ・ネットワーク でノード間接続するHPCクラスタは、その計算ノードに クラスタ・ネットワーク 接続用のドライバーソフトウェアやユーティリティーソフトウェアがインストールされている必要があるため、これらが事前にインストールされている クラスタネットワーキングイメージ を使用することが一般的です(※1)が、このベースとなるOSの Oracle Linux のバージョンは、 プラットフォーム・イメージ として提供される Oracle Linux の最新バージョンより古くなります。(※2)
※1)この詳細は、 OCI HPCテクニカルTips集 の クラスタネットワーキングイメージを使ったクラスタ・ネットワーク接続方法 を参照してください。
※2)2025年3月時点の最新の クラスタネットワーキングイメージ がそのベースOSに Oracle Linux 8.10を使用しているのに対し、 プラットフォーム・イメージ の最新は Oracle Linux 9.5 です。
ここで実行するワークロードが単一ノードに収まる場合は、 クラスタ・ネットワーク に接続する必要がなくなり、 プラットフォーム・イメージ から提供される最新のOSを使用することが可能になりますが、現在利用可能な単一ノードで最も高性能なシェイプ(2025年5月時点)は、以下のスペックを持つ BM.Standard.E6.256 で、このスペックからも単一ノードで十分大規模なHPCワークロードを実行することが可能と考えられます。
- CPU: AMD EPYC 9755ベース x 2(256コア)
- メモリ: DDR5 3.072 TB
- 理論性能: 11.0592 TFLOPS(ベース動作周波数2.7 GHz時)
- メモリ帯域: 1,228.8 GB/s
以上を踏まえて本テクニカルTipsは、単一ノードでHPCワークロードを実行することを念頭に、 プラットフォーム・イメージ で提供される最新の Oracle Linux上に AMD Optimizing C/C++ and Fortran Compilers (以降 AOCC と呼称します。)、 OpenMPI 、及び Slurm をインストールし、 BM.Standard.E6.256 のような高価なリソースをバッチジョブで有効利用するためのHPCワークロード実行環境を構築する手順を解説します。
なお本テクニカルTipsは、 OCI HPCテクニカルTips集 の Slurmによるリソース管理・ジョブ管理システム構築方法 の手順に従い予め Slurm 環境が構築されていることを前提に、単一ノードのHPCワークロードを実行するインスタンス(以降”計算ノード”と呼称します。)をこの Slurm 環境に組み込みます。
本テクニカルTipsは、以下のソフトウェアバージョンを前提とします。
- 計算ノードOS: プラットフォーム・イメージ Oracle-Linux-9.5-2025.04.16-0
- コンパイラ: AOCC 5.0
- MPI: OpenMPI 5.0.6
- ジョブスケジューラ: Slurm 24.11.0
1. 環境構築
1-0. 概要
本章は、計算ノードの環境を以下の手順に沿って構築します。
- インスタンス作成
- AOCC インストール
- OpenMPI 前提ソフトウェア・RPMパッケージインストール
- OpenMPI インストール・セットアップ
- Intel MPI Benchmarks インストール(※3)
- munge インストール・セットアップ(※4)
- Slurm RPMパッケージ作成
- Slurm RPMパッケージインストール・セットアップ
- Slurm 設定ファイル修正
- Slurm サービス起動
※3)計算ノードのMPI通信性能の検証と構築した環境の稼働確認に使用します。
※4) Slurm のプロセス間通信の認証に使用します。
1-1. インスタンス作成
計算ノード用のインスタンスの作成は、 OCIチュートリアル の その3 - インスタンスを作成する の手順に従い実施します。
本テクニカルTipsでは、以下属性のインスタンスを使用します。
- イメージ: プラットフォーム・イメージ Oracle-Linux-9.5-2025.04.16-0
- シェイプ: BM.Standard.E6.256
1-2. AOCCインストール
以下のサイトから AOCC のtarアーカイブ aocc-compiler-5.0.0.tar をダウンロードし、これを計算ノードの /tmp ディレクトリにコピーします。
https://www.amd.com/en/developer/aocc.html#downloads
次に、以下コマンドを計算ノードのopcユーザで実行し、 AOCC を /opt/aocc にインストールします。
$ sudo mkdir /opt/aocc
$ cd /opt/aocc && sudo tar --no-same-owner -xvf /tmp/aocc-compiler-5.0.0.tar
$ cd aocc-compiler-5.0.0 && sudo ./install.sh
1-3. OpenMPI前提ソフトウェア・RPMパッケージインストール
1-3-0. 概要
本章は、 OpenMPI の前提となるRPMパッケージ・ソフトウェアをインストールします。
1-3-1. 前提RPMパッケージインストール
以下コマンドを計算ノードのopcユーザで実行し、前提RPMパッケージをインストールします。
$ sudo dnf install -y ncurses-devel openssl-devel gcc-c++ gcc-gfortran git automake autoconf libtool numactl
1-3-2. libeventインストール
以下コマンドを計算ノードのopcユーザで実行し、 libevent を /opt ディレクトリにインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。
$ mkdir ~/`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 256 && sudo make install
1-3-3. hwlocインストール
以下コマンドを計算ノードのopcユーザで実行し、 hwloc を /opt ディレクトリにインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。
$ cd .. && wget https://download.open-mpi.org/release/hwloc/v2.11/hwloc-2.11.2.tar.gz
$ tar -xvf ./hwloc-2.11.2.tar.gz
$ cd hwloc-2.11.2 && ./configure --prefix=/opt/hwloc
$ make -j 256 && sudo make install
1-3-4. OpenPMIxインストール
以下コマンドを計算ノードのopcユーザで実行し、 OpenPMIx (※5)を /opt ディレクトリにインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。
※5) Slurm がMPIアプリケーションを起動する際に使用します。
$ cd .. && wget https://github.com/openpmix/openpmix/releases/download/v5.0.4/pmix-5.0.4.tar.gz
$ tar -xvf ./pmix-5.0.4.tar.gz
$ cd pmix-5.0.4 && ./configure --prefix=/opt/pmix --with-libevent=/opt/libevent --with-hwloc=/opt/hwloc
$ make -j 256 && sudo make install
1-3-5. XPMEM・KNEMインストール
以下コマンドを計算ノードのopcユーザで実行し、 XPMEM (※6)と KNEM (※6)を /opt ディレクトリにインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。
※6) OpenMPI がノード内MPI通信の際のメモリコピーに使用することが出来る、シングルコピーメカニズムです。
$ cd .. && git clone https://github.com/hpc/xpmem.git
$ cd xpmem && ./autogen.sh && ./configure --prefix=/opt/xpmem
$ make -j 256 && sudo make install
$ sudo install -D -m 644 ./kernel/xpmem.ko /lib/modules/`uname -r`/extra/xpmem/xpmem.ko
$ echo "xpmem" | sudo tee /lib/modules-load.d/xpmem.conf
$ cd .. && git clone https://gitlab.inria.fr/knem/knem.git
$ cd knem && ./autogen.sh && ./configure --prefix=/opt/knem
$ make -j 256 && sudo make install
$ sudo cp -p /opt/knem/etc/10-knem.rules /opt/knem/etc/10-knem.rules_org
$ grep "^#KERNEL" /opt/knem/etc/10-knem.rules_org | sed 's/^#KERNEL/KERNEL/g' | sudo tee /opt/knem/etc/10-knem.rules
$ echo "knem" | sudo tee /lib/modules-load.d/knem.conf
$ sudo /opt/knem/sbin/knem_local_install
$ sudo systemctl restart systemd-modules-load.service
次に、以下コマンドを計算ノードのopcユーザで実行し、 XPMEM と KNEM がカーネルモジュールとして組み込まれていることを確認します。
$ lsmod | grep -i -e xpmem -e knem
xpmem 57344 0
knem 65536 0
$
1-3-6. OpenUCXインストール
以下コマンドを計算ノードのopcユーザで実行し、 OpenUCX を /opt ディレクトリにインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。
$ cd .. && wget https://github.com/openucx/ucx/releases/download/v1.17.0/ucx-1.17.0.tar.gz
$ tar -xvf ./ucx-1.17.0.tar.gz
$ cd ucx-1.17.0 && ./contrib/configure-release --prefix=/opt/ucx
$ make -j 256 && sudo make install
1-3-7. Unified Collective Communicationインストール
以下コマンドを計算ノードのopcユーザで実行し、 Unified Collective Communication (UCC) を /opt ディレクトリにインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。
$ cd .. && wget https://github.com/openucx/ucc/archive/refs/tags/v1.3.0.tar.gz
$ tar -xvf ./v1.3.0.tar.gz
$ cd ./ucc-1.3.0/ && ./autogen.sh && ./configure --prefix=/opt/ucc --with-ucx=/opt/ucx
$ make -j 256 && sudo make install
1-4. OpenMPIインストール・セットアップ
以下コマンドを計算ノードのopcユーザで実行し、 OpenMPI を /opt ディレクトリにインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。
$ cd .. && wget https://download.open-mpi.org/release/open-mpi/v5.0/openmpi-5.0.6.tar.gz
$ tar -xvf ./openmpi-5.0.6.tar.gz
$ cd openmpi-5.0.6 && ./configure --prefix=/opt/openmpi --with-libevent=/opt/libevent --with-hwloc=/opt/hwloc --with-pmix=/opt/pmix --with-knem=/opt/knem --with-xpmem=/opt/xpmem --with-ucx=/opt/ucx --with-ucc=/opt/ucc --with-slurm
$ make -j 256 all && sudo make install
ここでは、 KNEM 、 XPMEM 、及び UCC を OpenMPI から利用出来るよう、また Slurm から OpenPMIx を利用して OpenMPI のアプリケーションを実行できるようにビルドしています。
次に、以下コマンドを計算ノードの OpenMPI を利用するユーザで実行し、MPIプログラムのコンパイル・実行に必要な環境変数を設定します。
$ echo "export PATH=/opt/openmpi/bin:/opt/ucx/bin:\$PATH" | tee -a ~/.bashrc
1-5. Intel MPI Benchmarksインストール
以下コマンドを計算ノードのopcユーザで実行し、 Intel MPI Benchmarks をインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。
$ cd .. && wget https://github.com/intel/mpi-benchmarks/archive/refs/tags/IMB-v2021.7.tar.gz
$ tar -xvf ./IMB-v2021.7.tar.gz
$ export CC=/opt/openmpi/bin/mpicc; export CXX=/opt/openmpi/bin/mpicxx; cd mpi-benchmarks-IMB-v2021.7 && make -j 256 all
$ sudo mkdir -p /opt/openmpi/tests/imb && sudo cp ./IMB* /opt/openmpi/tests/imb/
1-6. munge インストール・セットアップ
以下コマンドを計算ノードのopcユーザで実行し、 munge プロセス起動ユーザを作成します。
$ sudo useradd -m -d /var/lib/munge -s /sbin/nologin -u 5001 munge
次に、以下コマンドを計算ノードのopcユーザで実行し、 munge をインストールします。
$ sudo yum-config-manager --enable ol9_codeready_builder
$ sudo dnf install -y munge munge-libs munge-devel
次に、Slurmマネージャの munge キーファイル(/etc/munge/munge.key)を同一パス・ファイル名でコピーします。
この際、ファイルのオーナーとパーミッションがSlurmマネージャのキーファイルと同じとなるよう配慮します。
次に、以下コマンドを計算ノードのopcユーザで実行し、 munge サービスを起動します。
$ sudo systemctl enable --now munge.service
次に、以下コマンドを計算ノードのopcユーザで実行し、 munge が正常に動作していることを確認します。
$ munge -n | unmunge | grep STATUS
STATUS: Success (0)
$
1-7. Slurm RPMパッケージ作成
以下コマンドを計算ノードのopcユーザで実行し、 Slurm の前提RPMパッケージをインストールします。
$ sudo dnf install -y rpm-build pam-devel perl readline-devel mariadb-devel dbus-glib-devel
次に、以下コマンドを計算ノードのopcユーザで実行し、 Oracle Linux 9.5用の Slurm RPMパッケージを作成します。
$ cd ~/`hostname` && wget https://download.schedmd.com/slurm/slurm-24.11.0.tar.bz2
$ rpmbuild --define '_prefix /opt/slurm' --define '_slurm_sysconfdir /opt/slurm/etc' --define '_with_pmix --with-pmix=/opt/pmix' -ta ./slurm-24.11.0.tar.bz2
作成されたパッケージは、以下のディレクトリに配置されます。
$ ls -1 ~/rpmbuild/RPMS/x86_64/
slurm-24.11.0-1.el9.x86_64.rpm
slurm-contribs-24.11.0-1.el9.x86_64.rpm
slurm-devel-24.11.0-1.el9.x86_64.rpm
slurm-example-configs-24.11.0-1.el9.x86_64.rpm
slurm-libpmi-24.11.0-1.el9.x86_64.rpm
slurm-openlava-24.11.0-1.el9.x86_64.rpm
slurm-pam_slurm-24.11.0-1.el9.x86_64.rpm
slurm-perlapi-24.11.0-1.el9.x86_64.rpm
slurm-sackd-24.11.0-1.el9.x86_64.rpm
slurm-slurmctld-24.11.0-1.el9.x86_64.rpm
slurm-slurmd-24.11.0-1.el9.x86_64.rpm
slurm-slurmdbd-24.11.0-1.el9.x86_64.rpm
slurm-torque-24.11.0-1.el9.x86_64.rpm
$
1-8. Slurm RPMパッケージインストール・セットアップ
以下コマンドを計算ノードのopcユーザで実行し、 Slurm RPMパッケージのインストール・セットアップを行います。
$ cd ~/rpmbuild/RPMS/x86_64/ && sudo rpm -ivh ./slurm-24.11.0-1.el9.x86_64.rpm ./slurm-slurmd-24.11.0-1.el9.x86_64.rpm ./slurm-perlapi-24.11.0-1.el9.x86_64.rpm
$ sudo useradd -m -d /var/lib/slurm -s /bin/bash -u 5000 slurm
$ sudo mkdir /var/spool/slurmd && sudo chown slurm:slurm /var/spool/slurmd
$ sudo mkdir /var/log/slurm && sudo chown slurm:slurm /var/log/slurm
$ sudo mkdir /opt/slurm/etc && sudo chown slurm:slurm /opt/slurm/etc
1-9. Slurm設定ファイル修正
既存の Slurm 環境の slurm.conf に対して、計算ノードを追加するための以下3行を追加します。
SlurmdParameters=l3cache_as_socket
NodeName=inst-e6 Sockets=32 CoresPerSocket=8 ThreadsPerCore=1 RealMemory=3000000 TmpDisk=10000 State=UNKNOWN
PartitionName=e6 Nodes=inst-e5 Default=YES MaxTime=INFINITE State=UP
ここでは、本テクニカルTipsで使用する BM.Standard.E6.256 に搭載する2個の第5世代 AMD EPYC プロセッサが32個の Core Complex Die (以降 CCD と呼称します。)毎にL3キャッシュを搭載することを考慮し、 CCD を Slurm 上 NUMA ノードとして扱い SMT を無効(※6)としたホスト名が inst-e6 の BM.Standard.E6.256 1ノードを、パーティション名 e6 に割り当てています。
※6) SMT の設定方法は、 OCI HPCパフォーマンス関連情報 の パフォーマンスに関連するベアメタルインスタンスのBIOS設定方法 を参照してください。
次に、この slurm.conf を計算ノード、Slurmマネージャ、及びSlurmクライアントの /opt/slurm/etc に配置します。
1-10. Slurmサービス起動
以下コマンドを計算ノードのopcユーザで実行し、 slurmd を起動します。
$ sudo systemctl enable --now slurmd
次に、以下コマンドをSlurmマネージャのopcユーザで実行し、計算ノードの追加を反映します。
$ sudo su - slurm -c "scontrol reconfigure"
次に、以下コマンドをSlurmマネージャのopcユーザで実行し、計算ノードの追加が反映されていることを確認します。
$ sudo su - slurm -c "sinfo"
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
sltest* up infinite 3 idle inst-aaaaa-x9,inst-bbbbb-x9,inst-e5
e5 up infinite 1 idle inst-e5
$
2. 稼働確認
2-0. 概要
本章は、インストールした AOCC 、 OpenMPI 、及び Slurm を稼働確認します。
なお OpenMPI と Slurm の稼働確認は、 Slurm に OpenMPI を利用する Intel MPI Benchmarks のMPI通信性能検証用ジョブを投入することで行います。
2-1. AOCC稼働確認
以下コマンドを計算ノードの AOCC を利用するユーザで実行し、メモリ性能を計測するベンチマークプログラムの STREAM をコンパイル・実行することで、 AOCC の稼働確認を行います。
なおこの STREAM の実行は、 BM.Standard.E5.192 を想定した設定になっています。
$ cd ~/`hostname` && mkdir ./stream && cd ./stream && wget http://www.cs.virginia.edu/stream/FTP/Code/stream.c
$ source /opt/aocc/setenv_AOCC.sh
$ clang -DSTREAM_TYPE=double -DSTREAM_ARRAY_SIZE=430080000 -O3 -mcmodel=large -fopenmp -fnt-store ./stream.c
$ OMP_NUM_THREADS=128 KMP_AFFINITY="explicit,proclist=[`seq -s, 0 2 255`]" ./a.out
BM.Standard.E6.256 上で実行する STREAM については、 OCI HPCパフォーマンス関連情報 の STREAM実行方法(BM.Standard.E6.256編) も合わせて参照してください。
2-2. OpenMPI・Slurm稼働確認
Slurm クライアントの OpenMPI と Slurm を利用するユーザで、以下のスクリプトをファイル名 imb_ata.sh で作成します。
なおこの Intel MPI Benchmarks の実行は、 BM.Standard.E5.192 を想定した設定になっています。
#!/bin/bash
#SBATCH -p e6
#SBATCH -n 256
#SBATCH -N 1
#SBATCH -J alltoall
#SBATCH -o alltoall.%J
#SBATCH -e stderr.%J
srun --cpu-bind=map_cpu:`seq -s, 0 255 | tr -d '\n'` /opt/openmpi/tests/imb/IMB-MPI1 -msglog 0:20 -mem 4G -off_cache 384,64 -npmin $SLURM_NTASKS alltoall
このジョブスクリプトは、256プロセスを使用するノード内並列のAlltoall所要時間をメッセージサイズ0Bから1 MiBまでで計測しています。
BM.Standard.E6.256 上で実行する Intel MPI Benchmarks のMPI集合通信性能については、 OCI HPCパフォーマンス関連情報 の OpenMPIのMPI集合通信チューニング方法(BM.Standard.E6.256編) も合わせて参照してください。
次に、以下コマンドをSlurmクライアントの OpenMPI と Slurm を利用するユーザで実行し、バッチジョブの投入とその結果確認を行います。
$ sbatch imb_ata.sh
Submitted batch job 23808
$ cat ./alltoall.23808
#----------------------------------------------------------------
# Intel(R) MPI Benchmarks 2021.7, MPI-1 part
#----------------------------------------------------------------
# Date : Fri May 2 01:52:03 2025
# Machine : x86_64
# System : Linux
# Release : 5.15.0-307.178.5.el9uek.x86_64
# Version : #2 SMP Wed Mar 19 13:03:40 PDT 2025
# MPI Version : 3.1
# MPI Thread Environment:
# Calling sequence was:
# /opt/openmpi/tests/imb/IMB-MPI1 -msglog 0:20 -mem 4G -off_cache 384,64 -npmin 256 alltoall
# Minimum message length in bytes: 0
# Maximum message length in bytes: 1048576
#
# MPI_Datatype : MPI_BYTE
# MPI_Datatype for reductions : MPI_FLOAT
# MPI_Op : MPI_SUM
#
#
# List of Benchmarks to run:
# Alltoall
#----------------------------------------------------------------
# Benchmarking Alltoall
# #processes = 256
#----------------------------------------------------------------
#bytes #repetitions t_min[usec] t_max[usec] t_avg[usec]
0 1000 0.03 0.04 0.04
1 1000 16.66 2207.34 285.88
2 1000 16.12 18.13 17.15
4 1000 20.11 25.80 22.51
8 1000 21.66 28.74 24.81
16 1000 27.95 36.66 32.27
32 1000 57.32 68.34 62.60
64 1000 77.43 101.58 92.33
128 1000 138.02 184.22 167.63
256 1000 268.97 382.26 337.74
512 1000 509.41 721.89 635.87
1024 1000 670.70 703.63 685.22
2048 1000 1167.30 1211.05 1189.51
4096 1000 1373.49 1491.54 1439.74
8192 1000 2235.34 2346.79 2290.37
16384 1000 6442.20 9157.06 8251.17
32768 933 9177.00 9221.44 9199.22
65536 552 23948.78 25861.85 25719.17
131072 242 32903.76 33008.57 32958.71
262144 146 97061.92 97470.83 97300.95
524288 72 129280.17 129802.43 129576.16
1048576 39 491764.64 492944.55 492384.98
# All processes entering MPI_Finalize
$