配置服务器运行环境

使用 Environment Modules

为了满足同学们计算任务的需求,服务器中安装了各种版本的软件。大家可在同一软件的不同版本之间切换,也可以在同一功能的不同软件之间切换,以此来选择最合适的编程环境和运行环境。使用系统命令 module 可以快速地达到这一效果。

查看当前已经加载的 module 与可用的 module

在你使用某个软件之前,你必须通过 module 命令来配置此软件的运行环境,否则将无法使用此软件或者使用一个错误的版本。

例如,在没有载入任何 module 的情况下,输入 python 来尝试打开 python

$ python
Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

注意到此时 python 命令代表系统内置的 python,版本是 2.6.6。这是一个比较旧的版本,官方已经停止维护,里面少了很多功能,和最新的许多包都无法兼容。

此时我们用 module 命令载入较新的 anaconda2

$ module add anaconda/2
$ python
Python 2.7.12 |Anaconda custom (64-bit)| (default, Jul  2 2016, 17:42:40)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>>

注意到此时 python 的版本是 2.7.12,并且显示是 Anaconda 内部集成的版本,module 添加成功。

查看当前所载入的所有 module,可以使用如下命令

$ module list

Currently Loaded Modulefiles:
  1) anaconda/2

想要查看服务器中所有可用的 module,可以使用

$ module avail

------------------------------- /etc/modulefiles -------------------------------
anaconda/2(default)       gcc/5.3.0(default)        mvapich2-x86_64
anaconda/3                matlab/r2015b(default)    mvapich-psm-x86_64
compat-openmpi-psm-x86_64 matlab/r2016b             mvapich-x86_64
compat-openmpi-x86_64     mpich/3.2(default)        openmpi/2.0.0(default)
gcc/4.7.4                 mpich-x86_64              openmpi-x86_64
gcc/4.8.5                 mvapich2-psm-x86_64       python/3.5.1

执行完毕后可以从系统当前的所有 module 中选出你需要的进行添加。添加某些软件时需要指定版本,例如

$ module add gcc/4.8.5

如果不写版本,则服务器会添加后面标注有(default)的项。例如 module 名字只写 anaconda,服务器默认会添加 anaconda2

$ module add anaconda

删除与替换 module

如果要把某个模块从系统环境中删掉,需要使用

$ module remove <module name>

如果要删除全部的模块,可以直接使用

$ module purge

一个模块删除之后,你将无法直接使用与之相关的命令。对应软件的执行目录无法被直接访问,或者是还原成系统默认的版本。

有的时候,模块之间会有所冲突,你无法在同一时间同时加载两个模块。例如同一软件的不同版本,或者是接口相同的不同软件。当你载入其中一个后,再载入另一个就会出错。

# suppose we have anaconda/2 in our environment
# we try to add anaconda/3
$ module add anaconda/3
anaconda/3(3):ERROR:150: Module 'anaconda/3' conflicts with the currently loaded module(s) 'anaconda/2'
anaconda/3(3):ERROR:102: Tcl command execution failed: conflict anaconda

在 anaconda/2存在的情况下,无法继续加入 anaconda/3,这是因为两个 module 之间有冲突。因此需要切换软件的版本,你可以使用 module remove 命令将一个版本的 module 从环境中移除, 不过 module 提供了更方便的命令:

$ module swap anaconda/2 anaconda/3

这个命令的作用是交换两个 module,从当前环境中卸载 anaconda/2 并载入 anaconda/3。

在 SLURM 脚本中使用 module

module 命令仅作用在当前节点上,如果使用 SLURM 脚本提交任务,那么实际运行任务的 节点和当前节点是不同的,因此方便的做法是将 module 命令一并写在 SLURM 脚本中。

#!/bin/bash
#SBATCH -J test
#SBATCH -p cpu
#SBATCH -t 5:00

module add gcc/4.8.5
module add anaconda/3

# do your computation jobs...

定制你自己的默认载入 module

当你登录系统时,系统会默认载入一些 module。如果这些 module 不是你需要的,或者你 需要载入更多的 module,那么请直接在个人 HOME 目录下的 .bash_profile 文件的 最后添加

module add <module name>

即可。每个 module 的添加单独占一行。这样每次你登录系统之后系统就会自动加载你指定的 module。

更改 .bash_profile 文件的同时,在你运行 SLURM 任务时也会自动载入这些 module, 因此无需在 SLURM 脚本中再次添加 module 命令!