在E-HPC集群上,通常安装了多种软件(编译器、MPI库、Python发行版等),同一个软件也可能存在多个版本。如果手动通过修改 .bashrc 或设置环境变量来切换,不仅容易出错,还可能导致不同软件之间的冲突。
Environment Modules就是为解决这个问题而设计的工具。它通过“模块文件”(modulefile封装了每个软件所需的环境变量设置(如PATH、LD_LIBRARY_PATH 等),用户只需一条module load命令,就能在几秒钟内切换或启用某个软件环境,无需手动编辑任何配置文件。
核心命令速览
命令 | 作用 |
|---|---|
module avail | 列出当前可用的模块 |
module spider <名称> | 搜索模块(含隐藏模块) |
module load <模块名> | 加载一个模块 |
module unload <模块名> | 卸载一个模块 |
module list | 查看当前已加载的模块 |
module purge | 卸载所有已加载的模块 |
module swap <旧> <新> | 替换模块(卸载旧版本,加载新版本) |
| module show <模块名> | 查看某个模块会修改哪些环境变量 |
| module save <名称> | 保存当前模块组合 |
| module restore <名称> | 恢复之前保存的模块组合 |
说明:部分系统支持快捷命令ml,它是module的简写形式,例如ml avail等同于module avail。
常用操作详解
查看模块可用
执行以下命令,查看当前可用的模块:
module avail输出会按类别或路径分组展示。如果列表太长,可以用关键字过滤:
module avail python # 只看名称中包含 python 的模块注意:module avail只能看到当前层级下“可见”的模块。如果集群采用层级式设计(如先加载编译器,才能看到该编译器对应的 MPI 模块),部分模块不会直接显示。此时应使用module spider。
搜索模块(推荐方式)
当无法定位所需软件时,推荐使用 module spider 命令搜索:
module spider fftw # 搜索名称或描述中包含 fftw 的模块
module spider fftw/3.3.10 # 查看指定版本的详细信息若目标模块依赖其他模块,module spider会明确提示需先加载的模块列表。
加载模块
执行以下命令,加载所需模块:
module load gcc/12.3.0 # 加载指定版本
module load python3 # 省略版本号时加载默认版本
module load gcc/12.3.0 openmpi/4.1.6 # 一次加载多个模块加载完成后,可通过 which 命令验证:
module load gcc/12.3.0
which gcc # 应显示集群上的 gcc 路径,而非 /usr/bin/gcc查看已加载的模块
执行以下命令,查看当前已加载的模块:
module list说明: 排查环境问题时,建议首先执行该命令,确认当前已加载的模块信息。
卸载模块
根据实际需求,选择以下方式卸载模块:
module unload openmpi/4.1.6 # 卸载指定模块
module purge # 卸载全部模块,恢复至干净环境切换模块版本
切换软件版本时,建议使用swap命令,而非依次执行unload和load:
module swap gcc/11.2.0 gcc/12.3.0说明:swap命令可自动完成旧版本卸载与新版本加载的全过程,比手动两步操作更加可靠。
查看模块的具体内容
执行以下命令,查看模块设置的环境变量:
module show python3执行后可查看该模块设置的环境变量(如 PATH、LD_LIBRARY_PATH 等),便于了解模块加载后的具体变化。
在作业见本中使用模块
注意: 通过 sbatch 提交的作业脚本运行在非登录 Shell 中,可能无法直接使用 module 命令。
推荐做法:在脚本开头先执行 purge,再加载所需模块。脚本示例:
#!/bin/bash
#SBATCH -J my_job
#SBATCH -N 1
#SBATCH -n 32
module purge
module load gcc/12.3.0
module load openmpi/4.1.6
module load python3/3.11.5
python3 my_script.pymodule purge 的作用是清除登录节点可能残留的模块环境,确保作业在干净、可复现的环境中运行。如果你的脚本报错 module: command not found,说明 Shell 没有以登录模式运行,可以在 #!/bin/bash 后加上 -l,或在脚本中手动 source 模块初始化脚本。
保存和恢复模块组合
对于常用的模块组合(如某类计算所需的固定工具链),可保存为集合,后续一键恢复。对于常用的模块组合(如某类计算所需的固定工具链),可保存为集合,后续一键恢复。
module load gcc/12.3.0 openmpi/4.1.6 python3/3.11.5
module save mylab # 保存为名为 mylab 的集合
# 下次登录后
module restore mylab # 一键恢复不带名称的module save会保存为默认组合,module restore不带名称时会恢复该默认组合。
常见问题
Q:加载模块后,命令还是指向系统自带版本?
先检查 module list 确认模块是否真的加载成功,再用 which <命令> 查看实际路径。如果路径不对,尝试 module purge 后重新按顺序加载。
Q:两个软件冲突,加载时报错?
同一个软件的不同版本通常不能同时加载。使用 module swap 切换版本,或先 module unload 再 module load。如果冲突不明显,执行 module purge 后从零开始加载。
Q:提交作业时报 module: command not found?
这是作业脚本运行在非登录 Shell 中的典型表现。在脚本开头加上 #!/bin/bash -l,或在第一个 module 命令之前 source 系统的 Lmod 初始化脚本(路径通常为 /etc/profile.d/z00_lmod.sh 或 /usr/share/lmod/lmod/init/bash)。