本家様 http://modules.sourceforge.net/
EnvironmentModules/sample EnvironmentModules/package
relion向けに作ったopenmpiを用意したいのだが、eman2.22に同封のopenmpiと被る....
パス環境変数や、aliasを使って回避してきたが pyenv が参戦して来て混乱が増した... なので modules で統制を試みる。
一見するとkernel module関連?っと思ってしまうが別物です
パッケージ「environment-modules」をインストールします
(CentOS7/CentOS8)
[root@c ~]# yum install environment-modules
(ubuntu18.04)
apt-get install environment-modules tcl
関連して必須パッケージらが同時にインストールされます
留意
インストールすると、/etc/profile.dに下記が追加されます
/etc/profile.d/modules.csh
/etc/profile.d/modules.sh
パス環境変数らを定義するmodulefileの配置場所は/usr/share/Modules/init/.modulespathで定義されてます。
その中身は
#
# @(#)$Id: 38aa24cc33a5f54a93781d63005a084f74418022 $
# Module version 3.2.10
# init/.modulespath. Generated from .modulespath.in by configure.
#
# 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.
#
# # location of version files
#/usr/share/Modules/$MODULE_VERSION/modulefiles # Module pkg modulefiles (if versioning)
/usr/share/Modules/modulefiles # Module pkg modulefiles (if no versioning)
/etc/modulefiles # General module files
#/usr/share/Modules/your_contribs # Edit for your requirements
# This file defines the initial setup for the modulefiles search path
# Each line containing one or multiple paths delimited by ':' will be
# added to the MODULEPATH environment variable.
/usr/share/Modules/modulefiles:/etc/modulefiles:/usr/share/modulefiles
クラスター計算機での運用を想定するなら、ログインノード、計算ノードでmodulefileが共有されているのが望ましい。
なのでここでは /home/Common/modules/ をそれにします。
っで/usr/share/Modules/init/.modulespathを下記のように修正します。
/usr/share/Modules/modulefiles
/etc/modulefiles
/home/Common/modules
|
*なのでヘッドノード、計算機全てにenvironment-modulesをインストールする必要あり
ここでは /home/Common/modules を modulefile の設置場所にしました。
/home/Common/modulesの直下に modulefile を設置してもいいのだが、
アプリケーション毎に中間ディレクトリを配置して管理したいと思う。
例えばRelionにて下記のように2種のバージョンを用意したなら
[root@c ~]# mkdir -p /home/Common/modules/relion
[root@c ~]# vi /home/Common/modules/relion/3.0-beta-2
#%Module1.0
set RELION /Appl/relion-3.0-beta-2
prepend-path PATH $RELION/bin
setenv RELION_QSUB_TEMPLATE $RELION/bin/qsub.sh
setenv RELION_QUEUE_NAME s3
setenv RELION_QUEUE_USE false
setenv RELION_CTFFIND_EXECUTABLE /Appl/ctf/ctffind4.exe
setenv RELION_MOTIONCOR2_EXECUTABLE /Appl/local/bin/MotionCor2
setenv RELION_GCTF_EXECUTABLE /Appl/Gctf/bin/gctf
setenv RELION_RESMAP_EXECUTABLE /Appl/local/bin/ResMap
[root@c ~]# vi /home/Common/modules/relion/3.0-beta-2.icc
#%Module1.0
set RELION /Appl/relion-3.0-beta-2.icc
set mpi /Appl/local/openmpi-1.10.7_intel-18.0.2
set intel /opt/intel/compilers_and_libraries_2018.2.199/linux
prepend-path PATH $RELION/bin:$mpi/bin
prepend-path LD_LIBRARY_PATH $RELION/lib:$mpi/lib
prepend-path LD_LIBRARY_PATH $intel/compiler/lib/intel64:$intel/mkl/lib/intel64
setenv RELION_QSUB_TEMPLATE $RELION/bin/qsub.sh
setenv RELION_QUEUE_NAME s3
setenv RELION_QUEUE_USE false
setenv RELION_CTFFIND_EXECUTABLE /Appl/ctf/ctffind4.exe
setenv RELION_MOTIONCOR2_EXECUTABLE /Appl/local/bin/MotionCor2
setenv RELION_GCTF_EXECUTABLE /Appl/Gctf/bin/gctf
setenv RELION_RESMAP_EXECUTABLE /Appl/local/bin/ResMap
とする。
*「[module-info shell]」から使っているshellを判定して「/opt/intel/bin/compilervars.sh intel64」を動かそうと思ったが、それだと「module unload」でintel ccのPATH/LD_LIBRARY_PATHが消えないので却下
上記はコンパイル別であるが、relionのリリースバージョン毎で用意されるのが普通でしょうか。ver2.0とv2.1、v3.0b1とか。
実際に使用するには、module availで利用可能な/home/Common/modulesを探して、
[saber@c ~]$ module avail
----------------------- /home/Common/modules ------------------------
relion/3.0-beta-2
relion/3.0-beta-2.icc
[saber@c ~]$
「module load」コマンドで取り込む
[saber@c ~]$ module load relion/3.0-beta-2
今現在取り込んでいるmoduleを調べるには「module list」で調べる。
[saber@c ~]$ module list
Currently Loaded Modulefiles:
1) relion/3.0-beta-2
[saber@c ~]$
既に既定で常に使うmodulefile があるのなら、そのディレクトリに .version ファイルを設置します。
中身は、modulefileの「3.0-beta-2」を常に採用するなら
[root@c ~]# vi /home/Common/modules/relion/.version
#%Module1.0
set ModulesVersion "3.0-beta-2"
とする。すると
[saber@c ~]$ module avail
--------------------- /home/Common/modules ---------------------
relion/3.0-beta-2(default)
relion/3.0-beta-2.icc
[saber@c ~]$
と表記される。
PATH環境変数が、「module load」の前と後で比較して確認しましょう。
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/saber/.local/bin:/home/saber/bin
から
/usr/lib64/openmpi/bin:/Appl/relion-3.0-beta-2/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/saber/.local/bin:/home/saber/bin
へ
その後、「module unload」で取り込んだmoduleを削除して、再度PATH環境変数の変化を見てみます。
[saber@c ~]$ module unload relion/3.0-beta-2
[saber@c ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/saber/.local/bin:/home/saber/bin
[saber@c ~]$
と元に環境変数が戻ります。
単純に ~/.bashrc や ~/.tcshrc に記載する
[illya@c ~]$ cat .bashrc
:
:
module load relion
あるいは別途 /home/Common/modules.load なるファイルを用意して
[root@c ~]# cat /home/Common/modules.load
module load em
module load relion
module load eman2/2.12
module load chimera/1.3.1
このファイルをユーザの ~/.bashrc もしくは ~/.cshrc、~/.tcshrc の末尾に
:
:
source /home/Common/modules.load
と入れる。これで modules.load の修正でアプリ追加や最新版の提供が可能となる
CentOS7.9にしらたenvironment-modulesが 4.7.1 になっている.
そこで環境設定ファイル(例: /etc/modulefiles/relion/3.1.3)に入れ子で「module load mpi/openmpi-x86_64」とかを入れると
Loading relion/3.1.3
Loading requirement: mpi/openmpi-x86_64
と表示される.
回避方法としては
module --silent relion/3.1.3
と「--silent」(あるいは単に「-s」)を入れてロードさせる.
あるいはこのmpiを非表示に変更させる。具体的には
[root@c ~]# vi /etc/modulefiles/mpi/.modulerc
#%Module4.7
module-hide --soft --hidden-loaded mpi
[root@c ~]#
https://modules.readthedocs.io/en/latest/design/hide-or-forbid-modulefile.html
この場合は「module list」あるいは「ml」としても「mpi」は表示されないです。
表示するには「module list -a」あるいは「ml -a」と実行すれば表示されます
ubuntuなら「apt install environment-modules」でいいのだが、これを実行後、コンソールで「module」と実行しても
saber@ubuntu:~$ module
module: command not found
saber@ubuntu:~$
と言われる.
だけど、リモートからのアクセス経由、あるいはコンソールでも「a.sh」とかなスクリプトを作ってその中でmoduleコマンドを
実行してもエラーにはならない.
コンソール上でもmoduleコマンドを実行するには「~/.bashrc」の末尾に
if [ -f /etc/profile.d/modules.sh ]; then
. /etc/profile.d/modules.sh
fi
を入れる.
Rockyのenvironment-modulesは4.5.2
「/apps/em.sh」に
module -s load relion
module -s load chimera
:
と記載して $HOME/.bashrc に「. /apps/em.sh」と定義するとリモートアクセスでは問題ないのだが、
ローカルアクセスでは「set-alias」を使ったmodule fileが正しく定義できないみたい
*prepend-pathとかは問題なけど. あとこれは version 5.0.x で解消されている
っで回避策は
「load」の代わりに「swap」あるいは「switch」を使うといいみたい