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 环境。

Environment Modules 简明教程的更多相关文章

  1. appium简明教程

    appium简明教程 什么是appium? 下面这段介绍来自于appium的官网. Appium is an open-source tool you can use to automate mobi ...

  2. SaltStack简明教程

    第1章 SaltStack简明教程 1.1 SaltStack简介 SaltStack是基于Python开发的一套C/S架构配置管理工具(功能不仅仅是配置管理,如使用salt-cloud配置AWS E ...

  3. React-Router 中文简明教程(上)

    概述 说起 前端路由,如果你用过前端 MV* 框架构建 SPA 应用(单页面应用),对此一定不陌生. 传统开发中的 路由,是由服务端根据不同的用户请求地址 URL,返回不同内容的页面,而前端路由则将这 ...

  4. 2013 duilib入门简明教程 -- 第一个程序 Hello World(3)

    小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #i ...

  5. 2013 duilib入门简明教程 -- 部分bug (11)

     一.WindowImplBase的bug     在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题,     1.最大化按钮的样式 ...

  6. 2013 duilib入门简明教程 -- 部分bug 2 (14)

        上一个教程中提到了ActiveX的Bug,即如果主窗口直接用变量生成,则关闭窗口时会产生崩溃            如果用new的方式生成,则不会崩溃,所以给出一个临时的快速解决方案,即主窗口 ...

  7. 2013 duilib入门简明教程 -- 自绘控件 (15)

        在[2013 duilib入门简明教程 -- 复杂控件介绍 (13)]中虽然介绍了界面设计器上的所有控件,但是还有一些控件并没有被放到界面设计器上,还有一些常用控件duilib并没有提供(比如 ...

  8. 2013 duilib入门简明教程 -- 事件处理和消息响应 (17)

        界面的显示方面就都讲完啦,下面来介绍下控件的响应.     前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理.其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEG ...

  9. 2013 duilib入门简明教程 -- FAQ (19)

        虽然前面的教程几乎把所有的知识点都罗列了,但是有很多问题经常在群里出现,所以这里再次整理一下.     需要注意的是,在下面的问题中,除了加上XML属性外,主窗口必须继承自WindowImpl ...

随机推荐

  1. 【c++ Prime 学习笔记】目录索引

    第1章 开始 第Ⅰ部分 C++基础 第2章 变量和基本类型 第3章 字符串.向量和数组 第4章 表达式 第5章 语句 第6章 函数 第7章 类 第 Ⅱ 部分 C++标准库 第8章 IO库 第9章 顺序 ...

  2. NodeJs安装与环境配置

    https://blog.csdn.net/qq_43285335/article/details/90696126 https://www.cnblogs.com/liuqiyun/p/813390 ...

  3. [no_code]OCR表格处理——功能规格说明书

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 功能规格说明书 我们在这个课程的目标是 远程协同工作,采用最新技术开发软件 这个作业在哪个具体方面 ...

  4. 2020BUAA软工个人博客作业-软件案例分析

    2020BUAA软工个人博客作业-软件案例分析 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分 ...

  5. seata代码控制回滚和临时挂起分布式事物

    seata代码控制回滚和临时挂起分布式事物 一.说明 二.功能实现 1.手动回滚分布式事物 2.临时挂起分布式事物 三.完整代码 四 参考链接 一.说明 此处只是简单的记录一下,使用了 Seata后, ...

  6. rabbitmq死信队列和延时队列的使用

    死信队列&死信交换器:DLX 全称(Dead-Letter-Exchange),称之为死信交换器,当消息变成一个死信之后,如果这个消息所在的队列存在x-dead-letter-exchange ...

  7. noip模拟11

    T1 math 就挺水一小破题目,第一眼看好像不可做,看着看着突然发现假设x和y的最大公约数是gcd,那么kx%y一定是gcd的倍数, 然后想到可以把所有数字与k的gcd求出来,打一个完全背包,可是仔 ...

  8. USB_ID OTG

    谁知道USB_ID pin 脚的功能意义?是干什么用的?USB 中不就有 VDD,GND,USB+,USB- 并没有USB_ID 的信息呀?检测ID脚状态高低,从而判断为主设备或从设备,otg的时候用 ...

  9. 计算机网络之IPv4(IPv4分组、IPv4地址、NAT、子网划分与子网掩码、CIDR、ARP协议、DHCP、ICMP)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105138313 学习课程:<2019王道考研计算机网络> 学习目的 ...

  10. CSP-S 2021 退役记

    写的比较草率,但的确是真实感受. 10.23 回寝室前敲了一个 dinic 板子,觉得不会考... 10.24 8:00 起床,还好今天宿管不在,可以起的晚一点. 吃了早饭来机房颓废. 10:00 似 ...