0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Environment modulesの設定(親modulefile)

Last updated at Posted at 2025-06-30

はじめに

使っている計算機クラスタにも、いよいよ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を書くことを忘れずに。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?