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. BUAA SE 个人项目作业

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 我在这个课程的目标是 通过个人项目实践熟悉个人开发流程 一.在文章开头给出教学班级和 ...

  2. 一文读懂Android进程及TCP动态心跳保活

    一直以来,APP进程保活都是 各软件提供商 和 个人开发者 头疼的问题.毕竟一切的商业模式都建立在用户对APP的使用上,因此保证APP进程的唤醒,提升用户的使用时间,便是软件提供商和个人开发者的永恒追 ...

  3. 单片机stm32的5个时钟源的详细分析

    众所周知STM32有5个时钟源HSI.HSE.LSI.LSE.PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的. 其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低 ...

  4. 关于axios 的responseType类型的设置

    responseType值的类型可为如下 axios请求下载导出一个文件,请求成功时返回的是一个流形式的文件,需要设置responseType: 'arraybuffer',但是请求失败的需要返回的是 ...

  5. 力扣 - 剑指 Offer 67. 把字符串转换成整数

    题目 剑指 Offer 67. 把字符串转换成整数 思路1 根据题意,要解决这题,首先要判断的条件有: 不包括首位空格 第一位必须为:+.-.数字三者其一,否则不合法 数字必须连续的,如果遇到非数字, ...

  6. Vue 基础自查——条件渲染和列表渲染

    v-if和v-show的区别是什么? v-if和v-for为什么不能一起用? v-for中的key有什么作用? 1 v-if 和 v-show 1.1 作用 都用来控制元素的显示和隐藏 1.2 控制元 ...

  7. Linux基本命令学习-文件基本操作1

    关机重启 shutdown -h now #立即关机 shutdown -h 5 # 5秒后关机 #重启 shutdown -r now #立即重启 reboot halt #重启 文件相关 系统目录 ...

  8. python微服务

    https://realpython.com/python-microservices-grpc/ https://github.com/saqibbutt/python-flask-microser ...

  9. Django笔记&教程 4-1 模型(Models)介绍

    Django 自学笔记兼学习教程第4章第1节--模型(Models)介绍 点击查看教程总目录 参考:https://docs.djangoproject.com/en/2.2/topics/db/mo ...

  10. HTTPS-自己生成数字证书

    一.获取证书的途径 自签名证书,适用于开发者测试HTTPS,最快速的途径就是生成自签名证书,非常方便. Let's Encrypt证书,可以使用免费CA机构签发的证书. 使用收费CA机构签发的证书,如 ...