Module 工具介绍

Module 是一个专门管理环境变量的工具,全称为 module environment,通常应用于需要管理多个版本的软件或运行库,能够分别配置这些环境变量。其官网为:Module 官网

通常,对于多版本的软件包,我们可以通过修改 ~/.bashrc 文件,手动修改 PATHLD_LIBRARY_PATH 等全局环境变量来配置。但当软件包数量增多时,用户往往不清楚软件包的安装路径和可用的版本,这就使得软件版本的切换变得非常麻烦。module 工具则能够有效解决这一问题。

安装 Module 工具

Module 工具可以通过二进制编译安装(过程比较复杂,参考:Installing Modules on Unix),也可以通过包管理工具快速安装。

1. 使用 yum 安装(适用于 RedHat/CentOS 等):

sudo yum install environment-modules

2. 使用 apt-get 安装(适用于 Ubuntu 等):

sudo apt-get install environment-modules

安装路径通常为 /usr/share/modules。如果使用源码安装,则可以通过 ./configure --prefix=/usr/local/tools/modules 指定安装路径。

初始化 Module 工具

安装完 module 工具后,需要对其进行初始化。根据不同的 shell,初始化的文件位置可能不同。通常,在 /usr/share/modules/init/ 目录下可以找到相应的初始化脚本。以 Bash 为例:

source /usr/share/modules/init/bash

为了避免每次打开终端时都需要手动执行此命令,可以将其添加到 /etc/profile 文件中:

sudo vim /etc/profile

在文件末尾加入以下语句:

if [ -f /usr/share/modules/init/bash ]; then
    source /usr/share/modules/init/bash
fi

配置 Module 工具

Module 工具依赖 MODULEPATH 环境变量来查找配置文件目录。安装完 module 后,通常会自动配置好该环境变量。可以使用以下命令查看 MODULEPATH 的值:

echo $MODULEPATH

通常返回的结果如下:

/etc/environment-modules/modules:/usr/share/modules/versions:/usr/share/modules/$MODULE_VERSION/modulefiles:/usr/share/modules/modulefiles

编写 Modulefile 文件

要让一个软件包通过 module 调用,安装完该软件包后,需要在 /usr/share/modules/modulefiles 目录下增加相应的 Modulefile 文件。以下是一个 Modulefile 示例:

示例:查看 /usr/share/modules/modulefiles 目录下的文件

cd /usr/share/modules/modulefiles
ls

返回结果:

dot  module-git  module-info  modules  null  use.own

查看 modules 文件内容

cd /usr/share/modules/modulefiles
vim modules

示例内容:

#%Module1.0#####################################################################
##
## modules modulefile
##

proc ModulesHelp { } {
    global version prefix
    puts stderr "\tmodules - loads the modules software & application environment"
    puts stderr "\n\tThis adds $prefix/* to several of the"
    puts stderr "\tenvironment variables."
    puts stderr "\n\tVersion $version\n"
}

module-whatis   "loads the modules environment"  # for Tcl script use only
set     version         4.4.1
set     prefix          /usr/share/modules
setenv          MODULESHOME     $prefix
prepend-path    PATH            /usr/bin
prepend-path    MANPATH         /usr/share/man

# enable module versioning
modulepath
#module use /usr/share/modules/versions

解释常用命令:

  • %Module1.0: 标识文件为 modulefile,没有该语句文件不会被识别。
  • prepend-path: 将工具路径添加到环境变量的前面。
  • setenv: 配置所需的环境变量。

可以参考 Modulefile 文档 了解更多命令。

多版本软件的配置

如果一个软件有多个版本,我们可以在 /usr/share/modules/modulefiles 目录下为该软件创建一个子目录,然后在该子目录下为每个版本创建 Modulefile 文件。例如,如果有两个版本的 cuda,安装路径分别为 /usr/local/cuda-11.6/usr/local/cuda-12.0,配置过程如下:

1. 创建 cuda 目录:

cd /usr/share/modules/modulefiles
sudo mkdir cuda
cd cuda

2. 为不同版本的 CUDA 创建 Modulefile 文件:

  • 对于 cuda-11.6
sudo vim 11.6

添加以下内容并保存:

#%Module1.0#####################################################################
setenv CUDA_HOME /usr/local/cuda-11.6
prepend-path PATH /usr/local/cuda-11.6/bin
prepend-path LD_LIBRARY_PATH /usr/local/cuda-11.6/lib64
  • 对于 cuda-12.0
sudo vim 12.0

添加以下内容并保存:

#%Module1.0#####################################################################
setenv CUDA_HOME /usr/local/cuda-12.0
prepend-path PATH /usr/local/cuda-12.0/bin
prepend-path LD_LIBRARY_PATH /usr/local/cuda-12.0/lib64

3. 刷新 module 模块并查看可用模块:

source /usr/share/modules/init/bash
module avail

返回结果:

---------------------------------------- /usr/share/modules/modulefiles -----------------------------------------
cuda/11.6  cuda/12.0  dot  module-git  module-info  modules  null  use.own

4. 切换 CUDA 版本

切换到 cuda-11.6

module load cuda/11.6
module list

返回结果:

Currently Loaded Modulefiles:
  1) cuda/11.6

验证是否生效:

nvcc -V

返回结果:

nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2022 NVIDIA Corporation
Built on Tue_Mar__8_18:18:20_PST_2022
Cuda compilation tools, release 11.6, V11.6.124

切换到 cuda-12.0

module unload cuda/11.6
module load cuda/12.0
module list

返回结果:

Currently Loaded Modulefiles:
  1) cuda/12.0

验证是否生效:

nvcc -V

返回结果:

nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2023 NVIDIA Corporation
Built on Fri_Jan__6_16:45:21_PST_2023
Cuda compilation tools, release 12.0, V12.0.140

常用 Module 命令

  • 显示可用模块:

    module avail
  • 加载模块:

    module load [模块名称]
  • 卸载模块:

    module unload [模块名称]
  • 显示当前已加载的模块:

    module list

module 具体版本文件下有 .verison文件 可以修改默认版本