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. 概要

本章は、計算ノードの環境を以下の手順に沿って構築します。

  1. インスタンス作成
  2. AOCC インストール
  3. OpenMPI 前提ソフトウェア・RPMパッケージインストール
  4. OpenMPI インストール・セットアップ
  5. Intel MPI Benchmarks インストール(※3)
  6. munge インストール・セットアップ(※4)
  7. Slurm RPMパッケージ作成
  8. Slurm RPMパッケージインストール・セットアップ
  9. Slurm 設定ファイル修正
  10. Slurm サービス起動

※3)計算ノードのMPI通信性能の検証と構築した環境の稼働確認に使用します。
※4) Slurm のプロセス間通信の認証に使用します。

1-1. インスタンス作成

計算ノード用のインスタンスの作成は、 OCIチュートリアルその3 - インスタンスを作成する の手順に従い実施します。
本テクニカルTipsでは、以下属性のインスタンスを使用します。

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ユーザで実行し、 XPMEMKNEM がカーネルモジュールとして組み込まれていることを確認します。

$ 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

ここでは、 KNEMXPMEM 、及び UCCOpenMPI から利用出来るよう、また 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キャッシュを搭載することを考慮し、 CCDSlurmNUMA ノードとして扱い SMT を無効(※6)としたホスト名が inst-e6BM.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. 概要

本章は、インストールした AOCCOpenMPI 、及び Slurm を稼働確認します。
なお OpenMPISlurm の稼働確認は、 SlurmOpenMPI を利用する 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 クライアントの OpenMPISlurm を利用するユーザで、以下のスクリプトをファイル名 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クライアントの OpenMPISlurm を利用するユーザで実行し、バッチジョブの投入とその結果確認を行います。

$ 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

$

更新日時: