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. Servlet学习一(Servlet的使用流程)

    一.servlet运行流程 运行流程:浏览器发送请求到服务器,服务器根据url地址在webapps中寻找对应的项目文件夹然后再web.xml中检索对应的servlet,并进行调用二.servlet类写 ...

  2. Exynos4412 中断处理流程详解

    Linux 中,当外设触发中断后,大体处理流程如下: a -- 具体CPU architecture相关的模块会进行现场保护,然后调用machine driver对应的中断处理handler; b - ...

  3. 用python检查矩阵的计算

    鉴于最近复习线性代数计算量较大,且1800答案常常忽略一些逆阵.行列式的计算答案,故用Python写出矩阵的简单计算程序,便于检查出错的步骤. 1.行列式 可自行更改阶数 from numpy imp ...

  4. Java并发:重入锁 ReentrantLock(二)

    一.理解锁的实现原理 1. 用wait()去实现一个lock方法,wait()要和synchronized同步关键字一起去使用的,直接使用wait方法会直接报IllegalMonitorStateEx ...

  5. hdu 3047 Zjnu Stadium(并查集)

    题意: 300个座位构成一个圈. 有N个人要入座. 共有M个说明 :A B X ,代表B坐在A顺时针方向第X个座位上.如果这个说明和之前的起冲突,则它是无效的. 问总共有多少个无效的. 思路: 并查集 ...

  6. namaspace之pid namespace

    认识Namespace namespace 是 Linux 内核用来隔离内核资源的方式.通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的 ...

  7. 『学了就忘』Linux基础命令 — 34、配置网络相关命令

    目录 1.配置网络常用命令 2.ifconfig命令 3.ping命令 4.netstat 命令 使用1:查看本机开启的端口 使用2:查看本机有哪些程序开启的端口 使用3:查看所有连接 使用4:查看网 ...

  8. [啃书] 第1篇 - 输入输出/变量类型/math函数

    啃书部分已单独做成Gitbook了,后续不再更新.详情访问个人网站ccoding.cn或ccbyte.github.io 说在前面 一直想刷算法找不到很适合的书,后来发现考PAT很多推荐<算法笔 ...

  9. 25.A Famous Music Composer

    描述 Mr. B is a famous music composer. One of his most famous work was his set of preludes. These 24 p ...

  10. Java 多线程 - 总结概述

    概述 菜鸟教程: Java 给多线程编程提供了内置的支持. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 多线程是多任务的一种特别的形式,但多线程 ...