Linux environment modules

前言

在 Linux 超算平台上,通常会安装有不同版本的多种编译器和其他软件等,如常用的编译器有 intel 和 gnu,常用的 MPI 并行库包括 intel mpi,openmpi,mpich2 等,而且对于同一软件,还包含不同的版本或采用不同编译设置得到的可执行程序和链接库等。在使用这些程序时,经常需要对环境变量进行修改。并且由于程序编译时会调用不同类型编译器或第三库,这时程序之间还存在着依赖关系。这使得当执行某个特定版本的程序时,环境变量的修改变得十分复杂。

Environment Modules 包是一个简化 shell 初始化的工具,它允许用户在使用 modulefiles 进行会话期间轻松修改其环境。每个模块文件都包含为应用程序配置 shell 所需的信息。模块文件可以由系统上的许多用户共享,并且用户可以拥有自己的集合来补充或替换共享模块文件。

安装

#centos
sudo yum install -y environment-modules
#ubuntu
sudo apt-get install environment-modules 

生效

modules 中包含多种 shell 设置脚本,centos默认在/usr/share/Modules/init下,可以根据不同情况设置。这里由于我们用的是 zsh,输入如下命令即可

export modulePath=/usr/share/Modules/init
echo "source ${modulePath}/zsh" >> ~/.zshrc
source ~/.zshrc

命令

module avail     # 可用 module
module load xx   # 装载某个module
module add xx    # 和load功能类似,可在 slurm、python脚本使用
module list      # 列出加载的module

制作软件包module

编写modulefile 文件,其名字自行定义,以python3为例。centos默认放在 /usr/share/Modules/modulefiles 下

#%Module1.0
##
## modules modulefile
##
## modulefiles/modules.  Generated from modules.in by configure.
## puts 类比print
proc ModulesHelp { } {
                global version prefix
                puts stderr "\tAdds python3.6.6 to your environment variables."
                puts stderr "\n\tThis adds $prefix/* to several of the"
                puts stderr "\tenvironment variables."
                puts stderr "\n\tVersion $version\n"
}
module-whatis   "python/3.6.6"
# set 设置环境变量,类比export
set     version          python/3.6.6
set     prefix           /usr
#set    exec_prefix      ${prefix}
#set    datarootdir      ${prefix}/share
#set    INSTALL_DIR      ${prefix}
conflict                 python
# prepend-path 意思是将该变量值放在 PATH前面,让其最先匹配
prepend-path             PATH    $prefix/bin/python3.6
#prepend-path            LD_LIBRARY_PATH $prefix/lib64
prepend-path             MANPATH $prefix/share/man

使用

以slurm脚本为例

#!/bin/bash
#SBATCH -J test              # 作业名是 test
#SBATCH -p cpu               # 提交到 cpu 分区
#SBATCH -N 1                 # 使用一个节点
#SBATCH --cpus-per-task=1    # 每个进程占用一个 cpu 核心
#SBATCH -t 5:00              # 任务最大运行时间是 5 分钟
#SBATCH -o test.out          # 将屏幕的输出结果保存到当前文件夹的 test.out

module add docker            # 加载module,类似于初始化一个环境
docker version

# do your work               # 执行我的 ./hello 程序

备注:在slurm的某个机器上,只需安装 environment-modules,可在脚本里使用module add 指定机器上有的module,sbatch提交slurm任务后,能执行出相应的结果。这样的机器可以用于专门的代码开发机,指定一批有环境的机器做执行机

参考文献

http://www.sidaojun.com/post/environment-modules/
https://zhuanlan.zhihu.com/p/50725572
https://www.jianshu.com/p/fed0af3c7ff5
http://morty.tech/posts/slurm-running-matlab/

 

你可能感兴趣的:(Linux)