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年3月時点)は、以下のスペックを持つ BM.Standard.E5.192 で、このスペックからも単一ノードで十分大規模なHPCワークロードを実行することが可能と考えられます。

  • CPU: AMD EPYC 9654ベース x 2(192コア)
  • メモリ: DDR5 2.3 TB
  • 理論性能: 7.3728 TFLOPS(ベース動作周波数2.4 GHz時)
  • メモリ帯域: 921.6 GB/s

以上を踏まえて本テクニカルTipsは、単一ノードでHPCワークロードを実行することを念頭に、 プラットフォーム・イメージ で提供される最新の Oracle Linux上に AMD Optimizing C/C++ and Fortran Compilers (以降 AOCC と呼称します。)、 OpenMPI 、及び Slurm をインストールし、 BM.Standard.E5.192 のような高価なリソースをバッチジョブで有効利用するためのHPCワークロード実行環境を構築する手順を解説します。

なお本テクニカルTipsは、 OCI HPCテクニカルTips集Slurmによるリソース管理・ジョブ管理システム構築方法 の手順に従い予め Slurm 環境が構築されていることを前提に、単一ノードのHPCワークロードを実行するインスタンス(以降”計算ノード”と呼称します。)をこの Slurm 環境に組み込みます。

本テクニカルTipsは、以下のソフトウェアバージョンを前提とします。

  • 計算ノードOS: プラットフォーム・イメージ Oracle-Linux-9.5-2025.02.28-0
  • コンパイラ: AOCC 5.0
  • MPI: OpenMPI 5.0.6
  • ジョブスケジューラ: Slurm 24.11.0

1. 環境構築

1-0. 概要

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

  1. インスタンス作成
  2. AOCC インストール
  3. OpenMPI 前提ソフトウェア・rpmパッケージインストール
  4. OpenPMIx インストール(※3)
  5. OpenUCX インストール(※4)
  6. OpenMPI インストール・セットアップ
  7. Intel MPI Benchmarks インストール(※5)
  8. munge インストール・セットアップ(※6)
  9. Slurm rpmパッケージ作成
  10. Slurm rpmパッケージインストール・セットアップ
  11. Slurm 設定ファイル修正
  12. Slurm サービス起動
  13. Slurm 利用に必要な環境変数設定

※3) Slurm がMPIアプリケーションを起動する際に使用します。
※4) OpenMPI がプロセス間通信に使用する通信フレームワークとして使用します。
※5)計算ノードのMPI通信性能の検証と構築した環境の稼働確認に使用します。
※6) Slurm のプロセス間通信の認証に使用します。

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

OCIチュートリアル インスタンスを作成する の手順に従い、以下属性の計算ノードを作成します。

  • イメージ: Oracle Linux 9.5(Oracle-Linux-9.5-2025.02.28-0)
  • シェイプ: BM.Standard.E5.192

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パッケージインストール

以下コマンドを計算ノードのopcユーザで実行し、OpenMPIの前提rpmパッケージのインストールと前提ソフトウェアである libeventhwlocXPMEMKNEM/opt ディレクトリへのインストールを実施します。
なお、makeコマンドの並列数は当該ノードのコア数に合わせて調整します。

$ sudo dnf install -y ncurses-devel openssl-devel gcc-c++ gcc-gfortran git automake autoconf libtool
$ cd ~ && 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 192 && sudo make install
$ 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 192 && sudo make install
$ cd ~ && git clone https://github.com/hpc/xpmem.git
$ cd xpmem && ./autogen.sh && ./configure --prefix=/opt/xpmem
$ make -j 192 && sudo make install
$ cd ~ && git clone https://gitlab.inria.fr/knem/knem.git
$ cd knem && ./autogen.sh && ./configure --prefix=/opt/knem
$ make -j 192 && sudo make install

1-4. OpenPMIxインストール

以下コマンドを計算ノードのopcユーザで実行し、 OpenPMIx/opt ディレクトリにインストールします。
なお、makeコマンドの並列数は当該ノードのコア数に合わせて調整します。

$ 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 192 && sudo make install

1-5. 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 --with-knem=/opt/knem --with-xpmem=/opt/xpmem
$ make -j 192 && sudo make install

ここでは、 KNEMXPMEMOpenUCX から利用出来るようにビルドしています。

1-6. 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-ucx=/opt/ucx --with-slurm
$ make -j 192 all && sudo make install

ここでは、先にインストールした OpenUCXOpenMPI から利用出来るよう、また Slurm から OpenPMIx を使用して OpenMPI のアプリケーションを実行できるようにビルドしています。

次に、以下コマンドを OpenMPI を利用するユーザで実行し、MPIプログラムのコンパイル・実行に必要な環境変数を設定します。

$ echo "export PATH=/opt/openmpi/bin:/opt/ucx/bin:\$PATH" | tee -a ~/.bashrc
$ source ~/.bashrc

1-7. 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 CXX=/opt/openmpi/bin/mpicxx
$ export CC=/opt/openmpi/bin/mpicc
$ cd mpi-benchmarks-IMB-v2021.7 && make -j 192 all
$ sudo mkdir -p /opt/openmpi/tests/imb
$ sudo cp ./IMB* /opt/openmpi/tests/imb/

1-8. 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-9. Slurm rpmパッケージ作成

以下コマンドを計算ノードのopcユーザで実行し、 Slurm の前提rpmパッケージをインストールします。

$ sudo dnf install -y rpm-build pam-devel perl readline-devel mariadb-devel dbus-glib-devel

次に、以下コマンドをSlurmマネージャのopcユーザで実行し、 Slurm rpmパッケージを作成します。

$ cd ~ && 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' --define '_with_ucx --with-ucx=/opt/ucx' -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-10. 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-11. Slurm設定ファイル修正

既存の Slurm 環境の slurm.conf に対して、計算ノードを追加するために以下のように修正します。

NodeName=inst-e5 CPUs=192 Boards=1 SocketsPerBoard=8 CoresPerSocket=24 ThreadsPerCore=1 RealMemory=2300000 TmpDisk=10000 State=UNKNOWN
PartitionName=e5 Nodes=inst-e5 Default=YES MaxTime=INFINITE State=UP

ここでは、 NPS4SMT を無効(※7)としたホスト名が inst-e5BM.Standard.E5.192 1ノードを、パーティション名 e5 に割り当てています。

※7) NPSSMT の設定方法は、 OCI HPCパフォーマンス関連情報パフォーマンスに関連するベアメタルインスタンスのBIOS設定方法 を参照してください。

次に、この slurm.conf を計算ノードの /opt/slurm/etc に配置します。

1-12. 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 を想定した設定になっています。

$ 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=96 KMP_AFFINITY="explicit,proclist=[`seq -s, 0 2 191`]" ./a.out

BM.Standard.E5.192 上で実行する STREAM については、 OCI HPCパフォーマンス関連情報STREAM実行方法(BM.Standard.E5.192編) も合わせて参照してください。

2-1. OpenMPI・Slurm稼働確認

Slurm クライアントの OpenMPISlurm を利用するユーザで、以下のスクリプトをファイル名 imb_ata.sh で作成します。
なおこの Intel MPI Benchmarks の実行は、 BM.Standard.E5.192 を想定した設定になっています。

#!/bin/bash
#SBATCH -p e5
#SBATCH -n 192
#SBATCH -N 1
#SBATCH -J alltoall
#SBATCH -o alltoall.%J
#SBATCH -e stderr.%J
srun IMB-MPI1 -msglog 0:23 -mem 4G -off_cache 384,64 -npmin $SLURM_NTASKS alltoall

このジョブスクリプトは、192プロセスを使用するノード内並列のAlltoall所要時間をメッセージサイズ0Bから32 MiBまでで計測しています。
BM.Standard.E5.192 上で実行する Intel MPI Benchmarks のMPI集合通信性能については、 OCI HPCパフォーマンス関連情報OpenMPIのMPI集合通信チューニング方法(BM.Standard.E5.192編) も合わせて参照してください。

次に、以下コマンドをSlurmクライアントの OpenMPISlurm を利用するユーザで実行し、バッチジョブの投入とその結果確認を行います。

$ sbatch imb_ata.sh 
Submitted batch job 23808
$ cat ./alltoall.23808
#----------------------------------------------------------------
#    Intel(R) MPI Benchmarks 2021.7, MPI-1 part
#----------------------------------------------------------------
# Date                  : Wed Mar 12 23:40:30 2025
# Machine               : x86_64
# System                : Linux
# Release               : 5.15.0-305.176.4.el9uek.x86_64
# Version               : #2 SMP Tue Jan 28 20:15:04 PST 2025
# MPI Version           : 3.1
# MPI Thread Environment: 


# Calling sequence was: 

# /opt/openmpi/tests/imb/IMB-MPI1 -msglog 0:23 -mem 4G -off_cache 384,64 -npmin 192 alltoall 

# Minimum message length in bytes:   0
# Maximum message length in bytes:   8388608
#
# MPI_Datatype                   :   MPI_BYTE 
# MPI_Datatype for reductions    :   MPI_FLOAT 
# MPI_Op                         :   MPI_SUM  
# 
# 

# List of Benchmarks to run:

# Alltoall

#----------------------------------------------------------------
# Benchmarking Alltoall 
# #processes = 192 
#----------------------------------------------------------------
       #bytes #repetitions  t_min[usec]  t_max[usec]  t_avg[usec]
            0         1000         0.04         0.09         0.05
            1         1000        14.94        15.95        15.48
            2         1000        15.17        16.37        15.70
            4         1000        17.09        19.61        18.21
            8         1000        20.74        23.41        21.84
           16         1000        28.71        32.03        30.04
           32         1000        37.98        42.64        40.24
           64         1000        72.73        80.65        76.27
          128         1000       108.05       124.39       116.52
          256         1000       202.50       236.85       220.65
          512         1000       387.72       434.45       410.11
         1024         1000       368.04       416.56       394.76
         2048         1000      1211.46      1447.02      1397.23
         4096         1000      1240.52      2854.89      1845.46
         8192         1000      1665.85      1856.75      1791.55
        16384         1000      3050.95      3240.93      3145.84
        32768         1000      5523.64      5920.35      5767.86
        65536          640     10935.51     12686.47     12025.69
       131072          320     20632.47     22223.99     21683.88
       262144          160     45287.95     45514.84     45430.74
       524288           80    101029.68    101507.84    101329.73
      1048576           40    178558.11    179596.61    179215.53
      2097152           20    386123.34    391777.75    388960.96
      4194304           10    708980.56    714099.31    712053.41
      8388608            5   1419275.74   1430883.33   1426296.45


# All processes entering MPI_Finalize

$

更新日時: