Environment Modulesを導入しよう

目次

Environment Modulesとは

スパコンとかでよく使われているツールです。HPCのようなさまざまなアプリケーションがインストールされている環境では、実行時に使用するアプリケーションに適した環境変数を設定しないといけません。特に、機械学習系のTensorFlowやPyTorch、CUDAなどはバージョン依存が強いため、多人数が利用するサーバ環境において柔軟なバージョン切り替えが要求されることがあります。

また、HPCに限らず、複数のGCCのバージョンを用途に応じてスイッチするなどの単純な使い方もできますので、単独サーバでも有用な選択肢となります。

Apptainerなどのコンテナ技術も活発に使用されてきていますが、Environment Modulesは根強い人気があるように思います。

Environment Modulesのインストール方法

Environment Modulesはパッケージマネージャでインストール可能です。主要OSにおいてのインストール方法は下記のとおりです。

  • Debian系

apt install environment-modules
  • RHEL系

dnf install environment-modules

インストール後、Environment Modulesを使用するには新しいシェルを開く必要があります。これは、moduleコマンドを使用するために必要な環境設定がシェルの起動時に読み込まれるためです。

一度ログアウトして再ログインするか、新しいターミナルを起動した後、下記コマンドでインストールができたかどうかを確認します。


module --version
Modules Release 4.4.1 (2020-01-03)

module avail
---------------------------------------------- /usr/share/modules/modulefiles -----------------------------------------------
dot  module-git  module-info  modules  null  use.own

Environment Modulesの使い方

Environment Modules には、モジュールを管理するための一連のコマンドがあります。一般的に使用されるコマンドは次の通りです。

  • module avail:利用可能なモジュールを一覧表示します。
  • module load <モジュール名>:指定したモジュールをロードし、そのソフトウェアを使えるようにします。
  • module unload <モジュール名>:指定したモジュールをアンロードし、そのソフトウェアを無効にします。
  • module list:現在ロードされているモジュールを一覧表示します。
  • module purge:すべてのロード済みモジュールをアンロードします。
  • module show <モジュール名>:モジュールが設定する環境変数を表示します。

例題として、GCCのバージョン切り替えを行います。

管理者向けの使い方ガイド(環境設定など)

次のような手順で、Environment Modulesの設定を行います。

  1. modulefileの格納パスの設定
  2. GCCのインストール
  3. modulefileの作成

1. modulefileの格納パスの設定

modulefileのデフォルト格納パスは/usr/share/modules/modulefilesですが、参照するmodulefileのパスを変更することが可能です。クラスタなどの共有ディレクトリを参照パスにするとすべてのマシンから参照可能になります。

/usr/share/modules/init/.modulespathにmodulefileの格納パスの設定を記述することができます。次のように、/path/to/your/modulefilesをmodulefileの格納パスに追加します。

/usr/share/modules/init/.modulespath


#  Modulepath initial setup
#  ========================
#
#  This file defines the initial setup for the module files search path.
#  Comments may be added anywhere, which begin on # and continue until the
#     end of the line
#  Each line containing a single path will be added to the MODULEPATH
#     environment variable. You may add as many as you want - just
#     limited by the maximum variable size of your shell.
#
/etc/environment-modules/modules
/usr/share/modules/versions                             # location of version files
/usr/share/modules/$MODULE_VERSION/modulefiles  # Module pkg modulefiles (if versioning)
/usr/share/modules/modulefiles                          # General module files
+ /path/to/your/modulefiles

2. GCCのインストール

バージョンを切り替えるために、ライブラリ依存を低減するためにソースからインストールする方法を推奨します。

GCCをソースからインストールする方法は下記の記事を参照ください。

3. modulefileの作成

modulefile は、ソフトウェアの環境変数(例:PATHLD_LIBRARY_PATH)を動的に設定・管理するための設定ファイルです。これにより、異なるバージョンのソフトウェアを簡単に切り替えられます。

例として、GCC 9.1.0と12.2.0を切り替えるためにmodulefile用意します。

  • GCC 9.1.0用のmodulefile

/path/to/modulefiles/gcc/9.1.0


#%Module1.0
##
## gcc/9.1.0 modulefile
##

proc ModulesHelp { } {
    puts stderr "This module loads GCC 9.1.0 environment."
}

module-whatis "Loads GCC 9.1.0"

# Set the path to GCC (replace with actual installation path)
set gcc_root /path/to/gcc/9.1.0

# Add the necessary environment variables
prepend-path    PATH            $gcc_root/bin
prepend-path    LD_LIBRARY_PATH $gcc_root/lib64
prepend-path    LD_LIBRARY_PATH $gcc_root/lib
prepend-path    MANPATH         $gcc_root/share/man

# Optionally, set other environment variables
setenv          GCC_VERSION     9.1.0
setenv          GCC_HOME        $gcc_root

  • GCC 12.2.0用のmodulefile

/path/to/modulefiles/gcc/12.2.0


#%Module1.0
##
## gcc/12.2.0 modulefile
##

proc ModulesHelp { } {
    puts stderr "This module loads GCC 12.2.0 environment."
}

module-whatis "Loads GCC 12.2.0"

# Set the path to GCC (replace with actual installation path)
set gcc_root /path/to/gcc/12.2.0

# Add the necessary environment variables
prepend-path    PATH            $gcc_root/bin
prepend-path    LD_LIBRARY_PATH $gcc_root/lib64
prepend-path    LD_LIBRARY_PATH $gcc_root/lib
prepend-path    MANPATH         $gcc_root/share/man

# Optionally, set other environment variables
setenv          GCC_VERSION     12.2.0
setenv          GCC_HOME        $gcc_root

上記それぞれmodulefileを作成し、module availを実行すると下記のようにgcc/9.1.0とgcc/12.2.0が表示されるようになります。


module avail
------------------------------------ /path/to/modulefiles -------------------------------------
gcc/12.2.0       gcc/9.1.0

ここまでで管理者としてのmodulefileの設定は完了です。

一般ユーザ向けの使い方ガイド

1. 利用可能なモジュールの確認

まず、システムで利用可能なモジュールを確認します。


module avail
------------------------------------ /path/to/modulefiles -------------------------------------
gcc/12.2.0       gcc/9.1.0

また、モジュールの詳細情報は次のようなコマンドで確認できます。


module show gcc/12.2.0
-------------------------------------------------------------------
/path/to/modulefiles/gcc/12.2.0:

module-whatis    Loads GCC 12.2.0
prepend-path     PATH /path/to/gcc/12.2.0/bin
prepend-path     LD_LIBRARY_PATH /path/to/gcc/12.2.0/lib64
prepend-path     LD_LIBRARY_PATH /path/to/gcc/12.2.0/lib
prepend-path     MANPATH /path/to/gcc/12.2.0/share/man
setenv           GCC_VERSION 12.2.0
setenv           GCC_HOME /path/to/gcc/12.2.0

2. モジュールのロード

特定のバージョンのGCCを使用するには、以下のようにモジュールをロードします:


module load gcc/12.2.0
gcc --version
gcc (GCC) 12.2.0

3. 現在ロードされているモジュールの確認


module list
Currently Loaded Modulefiles:
 1) gcc/12.2.0

4. モジュールの切り替え

異なるバージョンのGCCに切り替える場合は次のような使い方が可能です。

  • 方法1

module unload gcc/12.2.0
module load gcc/9.1.0
  • 方法2

module switch gcc/12.2.0 gcc/9.1.0

6. すべてのモジュールのアンロード


module purge

これは現在のシェルセッション内で手動ですべてのモジュールをアンロードするコマンドです。なお、シェルセッションを終了(ログアウトやターミナルを閉じる)すると、ロードされていたすべてのモジュールは自動的にアンロードされます。次回ログイン時は新しいセッションとなるため、必要なモジュールを改めてロードする必要があります。

まとめ

この記事では、HPCやサーバー環境でよく使用されるEnvironment Modulesについて、インストール方法から管理者向けの環境設定、一般ユーザー向けの基本的な使い方まで説明しました。

GCCを例に、複数バージョンのソフトウェアを柔軟に切り替える方法を示しました。

Environment Modulesを使用することで、環境変数の管理を自動化し、複数ユーザーが異なるバージョンのソフトウェアを効率的に利用できるようになります。

よかったらシェアしてね!
目次