Environment Modules 简明教程
Environment Modules 简明教程
1. Modules 简介
在 Linux 超算平台上,通常会安装有不同版本的多种编译器和其他软件等,如常用的编译器有 intel 和 gnu,常用的 MPI 并行库包括 intel mpi,openmpi,mpich2 等,而且对于同一软件,还包含不同的版本或采用不同编译设置得到的可执行程序和链接库等。在使用这些程序时,经常需要对环境变量进行修改。并且由于程序编译时会调用不同类型编译器或第三库,这时程序之间还存在着依赖关系。这使得当执行某个特定版本的程序时,环境变量的修改变得十分复杂。
Environment Modules 包是一个简化 shell 初始化的工具,它允许用户在使用 modulefiles 进行会话期间轻松修改其环境。每个模块文件都包含为应用程序配置 shell 所需的信息。模块文件可以由系统上的许多用户共享,并且用户可以拥有自己的集合来补充或替换共享模块文件。
2. Modules 安装
Modules 可直接采用源码安装方式,在 Modules 官网下载最新4.2.1版本的源代码。在 Terminal 中输入如下命令安装 Modules 软件
# modules 安装目录
INSTALL_PATH=${HOME}/opt/modules-4.2.1/
tar -xvf modules-4.2.1.tar
# 进入 modules 目录
cd modules-4.2.1
# 安装 modules 软件
./configure --prefix=${INSTALL_PATH}
make
make install
在安装完毕后我们将 modules 设置脚本添加入环境变量中。注意,modules 中包含多种 shell 设置脚本,可以根据不同情况设置。这里由于我们用的是 zsh,输入如下命令即可
echo "souce ${HOME}/opt/modules-4.2.1/init/zsh" >> ~/.zshrc
souce ~/.zshrc
输入如下命令,查看当前包含的模块并加载用户模块
➜ ~ module avail
------------------------------------------ /usr/share/Modules/modulefiles ------------------------------------------
dot module-git module-info modules null use.own
➜ ~ module load use.own
➜ ~ module list
Currently Loaded Modulefiles:
1) use.own
此时,用户目录下会出现 privatemodules
文件夹,用户可以直接在此文件夹中添加自定义模块文件添加环境变量。
3. Modules 使用
Modules 使用包括 shell 命令和 modulefile 文件定义两部分内容,下面将分别进行介绍。
3.1. Modules 指令
module 安装好后,即可调用 module [command] 来查看或加载模块,主要指令如下
➜ ~ module avail # 列出当前 module path 中的所有可用模块文件
------------------------------------------ /usr/share/Modules/modulefiles ------------------------------------------
dot module-git module-info modules null use.own
----------------------------------------- /home/lilongxiang/privatemodules -----------------------------------------
cmake/3.8.0
➜ ~ module load cmake/3.8.0 # 加载模块文件/类
➜ ~ module list # 显示已经加载的模块
Currently Loaded Modulefiles:
1) use.own 2) cmake/3.8.0
➜ ~ module unload cmake # 卸载模块文件/类
➜ ~ module list # 显示已经加载的模块
Currently Loaded Modulefiles:
1) use.own
3.2. Modules 脚本内容
采用 module load 命令时,可用的模块其实都是安装在 module path 目录下的 modulefile 文件。一个基本 modulefile 内容如下
#%Module -*- tcl -*-
## This is a module to access something
# 显示 module help 主要内容
proc ModulesHelp { } {
puts stderr "This module sets up access to something"
}
# 显示 module whatis 显示主要内容
module-whatis "sets up access to something"
# module 加载前需要模块类
prereq module_flag
# module 加载冲突模块类
conflict another_module_flag
# 加载其他模块
module load gcc
# 设置环境变量
setenv SOMEVERION 0.95
# 添加环境变量
append-path PATH /home/[user]/[somedir]/bin
append-path MANPATH /home/[user]/[somedir]/man
append-path LD_LIBRARY_PATH /home/[user]/[somedir]/lib
其中包含的设置关键字有以下几个
prereq
指示加载此脚本需要预先加载的模块名,当这些模块没有预先加载时,module load 此模块会报错;conflict
指示与此模块冲突的其他模块类,注意这里不仅可以添加 modulefile 文件名称,也可添加 modulefile 所在路径文件名,此时代表模块和文件内所有模块类都会产生冲突;module load
指示加载此模块同时自动加载的模块,注意其和prereq
命令的不同;setenv
设定环境变量;append-path
添加环境变量;
3.3. Modules 脚本配置
modulefile 文件可以按照相关功能添加到不同目录中,下面显示了 privatemodules 文件夹内所有 modulefile 文件
.
├── cmake
│ └── 3.8.0
├── compiler
│ └── intel
│ └── 2018.1.163
└── mpi
├── gnu
│ ├── mpich2
│ │ └── 3.2.1
│ └── openmpi
│ └── 3.1.3
├── intel
│ ├── intel_mpi
│ │ └── 2018.1.163
│ ├── mpich2
│ └── openmpi
│ └── 3.1.3
└── mpich2
调用 module avail 命令,对应显示内容如下
➜ ~ module avail
------------------------------------------ /usr/share/Modules/modulefiles ------------------------------------------
dot module-git module-info modules null use.own
----------------------------------------- /home/lilongxiang/privatemodules -----------------------------------------
cmake/3.8.0 mpi/gnu/mpich2/3.2.1 mpi/intel/intel_mpi/2018.1.163
compiler/intel/2018.1.163 mpi/gnu/openmpi/3.1.3 mpi/intel/openmpi/3.1.3
在此用户配置文件中,所有与 mpi 库相关的 modulefile 文件都放在了目录 privatemodules/mpi 内,并且根据编译时所调用的编译器种类分为 gnu 和 intel 两个文件夹。
按照这种设置方法可以方便的对 modulefile 文件进行配置,在每个 modulefile 文件内添加 conflict mpi
,即可避免用户加载不同的 mpi 配置文件,当加载多个时 module 程序会直接报错
➜ ~ module load mpi/intel/openmpi/3.1.3
Loading mpi/intel/openmpi/3.1.3
Loading requirement: compiler/intel/2018.1.163
➜ ~ module load mpi/gnu/openmpi/3.1.3
Loading mpi/gnu/openmpi/3.1.3
ERROR: mpi/gnu/openmpi/3.1.3 cannot be loaded due to a conflict.
HINT: Might try "module unload mpi/intel/openmpi/3.1.3" first.
4. Modules 示例
4.1. Intel 编译器环境变量设置
intel 编译器安装后提供了 compilervars.sh 脚本文件自动为用户添加环境变量设置,但是这种方法不适用于 module 脚本,因为 modulefile 实际为 tcl 脚本文件,因此无法运行 shell 命令。
为了获取 intel 脚本内 设定的环境变量,可以采用 env2 脚本来方便的直接获取。下载 env2 脚本,运行
perl ./env2 -from bash -to modulecmd "<path to intel shell script> intel64" >> intell_module_file.log
即可在 intell_module_file.log 中查看 compilervars.sh 总定义的所有环境变量。将 intell_module_file.log 文件放置到 ~/privatemodules/compiler/intel/
路径下,文件名用具体版本号 2018.1.163
替代,随后便可用
module load compiler/intel/2018.1.163
命令添加 intel 编译器环境变量。
4.2. openmpi 环境变量设置
在设置好 intel 编译器环境后,编译 openmpi 库并安装到 ${HOME}/opt/openmpi-3.1.3-intel
目录下。
在 privatemodules/mpi/intel/openmpi/3.1.3
文件内添加
#%Module -*- tcl -*-
## This is a module to access cmake-3.8.0-rc1
proc ModulesHelp { } {
puts stderr "This module sets up access to openmpi-3.1.3 built with intel compiler"
}
module-whatis "sets up access to openmpi-3.1.3 with intel compiler"
#prereq intel_2018
conflict mpi
module load compiler/intel/2018.1.163
setenv SOMEVERION 3.1.3
append-path PATH ${HOME}/opt/openmpi-3.1.3-intel/bin
append-path LD_LIBRARY_PATH ${HOME}/opt/openmpi-3.1.3-intel/lib
即可通过命令 module load mpi/intel/openmpi/3.1.3
来加载编译后的 openmpi 环境。