#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」を使うといいみたい