はじめに
使っている計算機クラスタにも、いよいよGPUマシンが加わりました。すると、コンパイラの切り替えも面倒になってきたので、スパコン環境などでよく見るEnvironment modulesを入れてみようかと思います。
今回のポイントは、Intelコンパイラなど複数のmoduleがセットになっている環境で、それらを一括でloadできる親modulefileの設定です。
環境
Rocky Linux 8.8
事前準備
/etc/profile.d/
などにIntel Compilerなどのログイン時読み込みシェルを配置していた場合は、それをよけておくこと。
install
公式を参考に、ソースからインストール
curl -LJO https://github.com/envmodules/modules/releases/download/v5.5.0/modules-5.5.0.tar.gz
tar xfz modules-5.5.0.tar.gz
./configure
make
make install
デフォルトのインストールパスは/usr/local/Modules/
になる。
moduleコマンドの有効化
まず、ログイン時にユーザーがmoduleコマンドを使えるようにする。
ln -s /etc/profile.d/module.sh /usr/local/Modules/init/profile.sh
ln -s /etc/profile.d/module.csh /usr/local/Modules/init/profile.csh
シンボリックリンクを作る。クラスタシステムの場合は、計算ノードにもこの設定を行う。
コンパイル環境の設定
ここではIntel OneAPIとNvidiaのCuda tool setの環境を設定。各環境ごとに、modulefileを作成する。作成場所は、/usr/local/Modules/modulefiles/
下となる。version管理などを考えて、次のように、intel
ディレクトリとnvidia
ディレクトリを作成し、その直下にversionをファイル名としたmodulefile(テキスト形式)を作る。
/usr/local/Modules/modulefiles/
|-- /intel/
|-- 2024.2 #これがモジュールファイル
|-- /nvidia
|-- 23.9 #これもモジュールファイル
モジュールファイルの中身
最近のコンパイラは、コンパイラのインストール時にmodulefileも用意してくれることが多い。
Intel OneAPIの場合
コンパイラをインストールした場所が/opt/intel/oneapi/
とすると、その直下にmodulefiles-setup.sh
というスクリプトがあるので、これを実行するとmodulefileを生成してくれる。
次に、modulefileである/usr/local/Modules/modulefiles/intel/2024.2
の中身を次のように編集した。この辺りは見様見真似なので、各自で改良されたし。
#%Module1.0
proc ModulesHelp { } {
puts stderr "Intel oneAPI 2024.2: compiler, MKL, MPI"
}
module-whatis "Intel oneAPI 2024.2: compiler, MKL, MPI"
prepend-path MODULEPATH /opt/intel/oneapi/2024.2/etc/modulefiles
if { ![ is-loaded compiler/2024.2.1 ] } {
module load compiler/2024.2.1
}
if { ![ is-loaded mkl/2024.2 ] } {
module load mkl/2024.2
}
if { ![ is-loaded mpi/2021.13 ] } {
module load mpi/2021.13
}
ここでは、prepend-path MODULEPATH
の部分が重要で、ここに先ほど生成したIntel OneAPI用のmoodulefileが収まっているディレクトリを指定。その上で、後半の行においてそこからの相対パスで実際に読み込みたいmodulefileを指定する。つまり、ここで編集しているintel/2024.2
というmodulefileは「親ファイル」であり、この親ファイルを読み込むと、中に記述された一連の子ファイルを読み込むようになる。
modulefileには、Intel MPIの環境変数などもsetenv
で追加できそうです。
今回は通常のコンパイラとMKLとMPIしか必要ないのでこれだけだが、別途vtuneなどが必要なら追加されたし。何があるかは、/opt/intel/oneapi/2024.2/etc/modulefiles
の中身を見て欲しい。
Nvidia Cuda toolkitの場合
インストールパスが/opt/nvidia/hpc_sdk/
であるとする。この時、modulefileが/opt/nvidia/hpc_sdk/modulefiles
に作られている。いくつかの種類が作られているので環境に合わせてしている。私の環境ではkitに含まれていたMPIが上手く動かなかったので、別途installしたopenmpiを使えるように、以下のようにした。きっともっとうまくやる方法があるのであくまで参考程度に。
結局、Nvidia環境用のmodulefileである/usr/local/Modules/modulefiles/nvidia/23.9
の中身は次のようにした。
#%Module1.0
proc ModulesHelp { } {
puts stderr "NVidia CUDA 23.9: compiler, MPI"
}
module-whatis "NVidia CUDA 23.9: compiler, MPI"
prepend-path MODULEPATH /opt/nvidia/hpc_sdk/modulefiles
#if { ![ is-loaded nvhpc-hpcx-cuda12/23.9 ] } {
# module load nvhpc-hpcx-cuda12/23.9
#}
if { ![ is-loaded nvhpc-nompi/23.9 ] } {
module load nvhpc-nompi/23.9
}
prepend-path PATH /usr/local/bin
#prepend-path PATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.9/compilers/bin
prepend-path LD_LIBRARY_PATH /usr/local/lib
prepend-path LD_LIBRARY_PATH /usr/lib64
#prepend-path LD_LIBRARY_PATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.9/compilers/lib
#prepend-path LD_LIBRARY_PATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.9/cuda/lib64
#prepend-path MANPATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.9/compilers/man/
#if { ![ is-loaded nvhpc/23.9 ] } {
# module load nvhpc/23.9
#}
おわりに
便利になりました(初心者ユーザーにとって便利かどうかは分かりませんが、、、)。
Slurmの実行スクリプトの中にもmodule loadを書くことを忘れずに。