#author("2022-01-10T18:15:28+00:00","default:sysosa","sysosa")
#author("2022-12-17T17:14:00+00:00","default:sysosa","sysosa")
本家様 [[http://modules.sourceforge.net/>+http://modules.sourceforge.net/]]

&size(10){[[EnvironmentModules/sample]]  [[EnvironmentModules/os]]};
&size(10){[[EnvironmentModules/sample]]  [[EnvironmentModules/package]]};

relion向けに作ったopenmpiを用意したいのだが、eman2.22に同封のopenmpiと被る....
パス環境変数や、aliasを使って回避してきたが pyenv が参戦して来て混乱が増した... なので modules で統制を試みる。

一見するとkernel module関連?っと思ってしまうが別物です

***インストール [#g5fe16b0]
パッケージ「environment-modules」をインストールします

#code(nonumber){{
(CentOS7/CentOS8)
[root@c ~]# yum install environment-modules

(ubuntu18.04)
apt-get install environment-modules tcl
}}
関連して必須パッケージらが同時にインストールされます

&color(white,blue){留意};
インストールすると、/etc/profile.dに下記が追加されます
#code(nonumber){{
/etc/profile.d/modules.csh
/etc/profile.d/modules.sh
}}


***設計 [#g71af788]

パス環境変数らを定義する&color(magenta){modulefile};の配置場所は&color(crimson){''/usr/share/Modules/init/.modulespath''};で定義されてます。
その中身は
-CentOS7(environment-modules-3.2.10がインストールされる)
#code(nonumber){{
#
#  @(#)$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
}}
-CentOS8(environment-modules-4.1.4がインストールされる)
#code(nonumber){{
# 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
}}

クラスター計算機での運用を想定するなら、ログインノード、計算ノードで&color(magenta){modulefile};が共有されているのが望ましい。
なのでここでは &color(orangered){''/home/Common/modules/''}; をそれにします。

っで&color(crimson){/usr/share/Modules/init/.modulespath};を下記のように修正します。
-CentOS7
#code(nonumber){{
/usr/share/Modules/modulefiles
/etc/modulefiles
/home/Common/modules
}}
-CentOS8
#code(diff,nonumber){{
/usr/share/Modules/modulefiles:/etc/modulefiles:/usr/share/modulefiles:/home/Common/modules
}}

&color(red){*};&size(10){なのでヘッドノード、計算機全てにenvironment-modulesをインストールする必要あり};

***modulefileの用意 [#t2668c5a]

ここでは &color(orangered){''/home/Common/modules''}; を &color(magenta){modulefile}; の設置場所にしました。
&color(orangered){/home/Common/modules};の直下に &color(magenta){modulefile}; を設置してもいいのだが、
アプリケーション毎に中間ディレクトリを配置して管理したいと思う。
例えばRelionにて下記のように2種のバージョンを用意したなら
-gccでコンパイルされたバージョン
#code(nonumber){{
[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
}}
-iccでコンパイルされたバージョン
#code(nonumber){{
[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
}}

とする。
&color(red){*};&size(10){「[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で利用可能な&color(orangered){''/home/Common/modules''};を探して、
#code(nonumber){{
[saber@c ~]$ module avail

----------------------- /home/Common/modules ------------------------
relion/3.0-beta-2
relion/3.0-beta-2.icc
[saber@c ~]$
}}

「module load」コマンドで取り込む
#code(nonumber){{
[saber@c ~]$ module load relion/3.0-beta-2
}}

今現在取り込んでいるmoduleを調べるには「module list」で調べる。
#code(nonumber){{
[saber@c ~]$ module list
Currently Loaded Modulefiles:
  1) relion/3.0-beta-2
[saber@c ~]$
}}

既に既定で常に使う&color(magenta){modulefile}; があるのなら、そのディレクトリに .version ファイルを設置します。
中身は、&color(magenta){modulefile};の「3.0-beta-2」を常に採用するなら
#code(nonumber){{
[root@c ~]# vi /home/Common/modules/relion/.version
#%Module1.0
set ModulesVersion "3.0-beta-2"
}}
とする。すると
#code(nonumber){{
[saber@c ~]$ module avail

--------------------- /home/Common/modules ---------------------
relion/3.0-beta-2(default)
relion/3.0-beta-2.icc
[saber@c ~]$
}}
と表記される。


PATH環境変数が、「module load」の前と後で比較して確認しましょう。
#code(nonumber){{
/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環境変数の変化を見てみます。
#code(nonumber){{
[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 ~]$
}}
と元に環境変数が戻ります。

[[めも>EnvironmentModules/run]]

***ログインと共に有効となるmodulesの設定 [#ma8f9985]
単純に ~/.bashrc や ~/.tcshrc に記載する
#code(nonumber){{
[illya@c ~]$ cat .bashrc
 :
 :
module load relion
}}



あるいは別途 /home/Common/modules.load なるファイルを用意して
#code(nonumber){{
[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 の末尾に
#code(nonumber){{
 :
 :
source /home/Common/modules.load
}}
と入れる。これで modules.load の修正でアプリ追加や最新版の提供が可能となる


***モジュールの非表示 [#ge1f601d]
CentOS7.9にしらたenvironment-modulesが 4.7.1 になっている.
そこで環境設定ファイル(例: /etc/modulefiles/relion/3.1.3)に入れ子で「module load mpi/openmpi-x86_64」とかを入れると
#code(nonumber){{
Loading relion/3.1.3
  Loading requirement: mpi/openmpi-x86_64
}}
と表示される.
回避方法としては
#code(nonumber){{
module --silent relion/3.1.3
}}
と「--silent」(あるいは単に「-s」)を入れてロードさせる.

あるいはこのmpiを非表示に変更させる。具体的には
#code(nonumber){{
[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>+https://modules.readthedocs.io/en/latest/design/hide-or-forbid-modulefile.html]]

この場合は「module list」あるいは「ml」としても「mpi」は表示されないです。
表示するには「module list -a」あるいは「ml -a」と実行すれば表示されます


***メモ [#pd531386]
ubuntuなら「apt install environment-modules」でいいのだが、これを実行後、コンソールで「module」と実行しても
#code(nonumber){{
saber@ubuntu:~$ module
module: command not found
saber@ubuntu:~$
}}
と言われる.
だけど、リモートからのアクセス経由、あるいはコンソールでも「a.sh」とかなスクリプトを作ってその中でmoduleコマンドを
実行してもエラーにはならない.

コンソール上でもmoduleコマンドを実行するには「~/.bashrc」の末尾に
#code(nonumber){{
if [ -f /etc/profile.d/modules.sh ]; then
  . /etc/profile.d/modules.sh
fi
}}
を入れる.

***メモその2 [#b6140bae]
Rockyのenvironment-modulesは4.5.2
「/apps/em.sh」に
#code(nonumber){{
module -s load relion
module -s load chimera
 :
}}
と記載して $HOME/.bashrc に「. /apps/em.sh」と定義するとリモートアクセスでは問題ないのだが、
ローカルアクセスでは「set-alias」を使ったmodule fileが正しく定義できないみたい
&color(red){*};&size(10){prepend-pathとかは問題なけど. あとこれは version 5.0.x で解消されている};
っで回避策は
「load」の代わりに「swap」あるいは「switch」を使うといいみたい
1

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS