Featured image of post Use Environment Module to Manage Software Packages and Environment Variables in Linux

Use Environment Module to Manage Software Packages and Environment Variables in Linux

Usage of Environment Modules in Linux with an example of installing Intel compiler

缘起

在使用学校的计算集群时,可以很方便地使用module load命令来加载一些如Intel编译器、Python Anaconda之类的软件包,在不需要它们时也可以直接丢掉,这样可以很方便地选用和启用某些环境变量,防止某些环境变量污染其他软件的编译环境。 在自己的电脑上,为了安装和编译各种程序有时会下载安装很多编译器和软件包,这样在编译或运行某些程序时,由于环境变量的影响,编译器或程序经常会报错,于是我打算在自己的电脑上也安装module来管理这些软件包和环境变量。

module工具的安装与工作方式

安装module

对于Debian系系统如Ubuntu,可直接用apt安装:

1
sudo apt install environment-modules

一般会默认安装到/usr/share/modules下。该路径下的modulefiles文件夹会存放一些默认的module文件:

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

用户使用module avail命令可以查看它们。

如果发现module命令不能使用,是因为还没有进行初始化。在/usr/share/modules/init下有针对如bash、 ksh、 fish、 tcsh、 zsh等各种shell的初始化工具。例如我在zsh内使用module工具,那么就需要运行如下命令来完成初始化:

1
source /usr/share/modules/init/zsh

由于每次重新登录系统或zsh之后都需要重新输入上述命令,为了方便起见,可以把它加入~/.zshrc中。

module工具的工作方式

module工具通过识别modulefile的方式来罗列和加载用户指定的软件包和环境变量,一个典型的modulefile内容如下所示:

#%Module

proc ModulesHelp { } { puts stderr “This module adds solar to your path” }

module-whatis “This module adds solar to your path\n”

set basedir “/home/aturing/software/solar-1.2”
prepend-path PATH “${basedir}/bin”
prepend-path LD_LIBRARY_PATH “${basedir}/lib64”
module load intel/19.1/64/19.1.1.217
module load intel-mpi/intel/2019.7/64

在安装好module后,module会在默认的/usr/share/modules/modulefiles路径下寻找modulefiles。在用户使用module avail命令查看可用的module时,module工具会把/usr/share/modules/modulefiles路径下的modulefiles展示出来。安装完module工具后默认的module一般如下所示:

——- /usr/share/modules/modulefiles ——–
dot module-git module-info modules null use.own

如果用户使用module load use.own命令来加载use.own,那么module工具会在用户根目录下创建privatemodules文件夹,用户可以把自定义的modulefiles放在此文件夹下。之后位于~/privatemodules目录下的modulefiles也会被module工具检测到。

安装软件包并用module工具管理

安装Intel的C++编译器icc

Intel为Intel芯片使用者免费提供自家的C++编译器icc和Fortran编译器ifort,用户可以在Intel的官网上下载安装。Intel提供多种安装方式,既有集成了多种Intel编译器与工具的oneAPI,也有这些编译器和工具的独立版本。完整版的oneAPI工具包很大,由于我目前只需要iccifort两个编译器,因此我只下载安装这两个独立版的编译器。

  1. 下载安装包

    可以在Intel官网上下载独立版的icc编译器安装包,网址如下:https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html#dpcpp-cpp。对于Linux/Windows/macOS各个系统,都有在线版和离线版两种安装包可选。可以选择在线版的安装包,例如我下载的安装包名称是l_dpcpp-cpp-compiler_p_2022.1.0.137.sh

    也可以使用命令行下载:

    1
    
    wget https://registrationcenter-download.intel.com/akdlm/irc_nas/18717/l_dpcpp-cpp-compiler_p_2022.1.0.137.sh
    
  2. 运行安装包

    下载完成后进入存放安装包的目录,使用如下命令安装:

    1
    
    sudo sh ./l_dpcpp-cpp-compiler_p_2022.1.0.137.sh -a -s --eula accept
    

    其中-a表示使用命令行参数;-s表示静默(silence)安装,即不弹出安装窗口;--eula accept表示同意用户协议。详情可见Intel的安装指导.

    编译器默认安装在/opt/intel/oneapi目录下。

  3. 配置modulefiles

    Intel在安装包内集成了可自动生成modulefiles的脚本,用户只需运行该脚本,就可以将安装的编译器或工具包自动编写成module工具可以使用的modulefiles。

    配置脚本是位于安装目录/opt/intel/oneapi下的modulefiles-setup.sh文件。用户在运行此脚本时可指定放置生成的modulefiles的文件夹,这里我选择将生成的modulefiles放在~/privatemodules目录下:

    1
    
    /opt/intel/oneapi/modulefiles-setup.sh --output-dir=$HOME/privatemodules
    
  4. 查看和加载编译器

    完成上述步骤后就可以使用module avail命令来查看刚才安装的icc编译器了,在运行module avail命令后会看到类似下面所示的输出:

    1
    2
    3
    4
    5
    6
    7
    8
    
    ------------------------------------------------ /usr/share/modules/modulefiles ------------------------------------------------  
    dot  module-git  module-info  modules  null  use.own    
    
    ------------------------------------------------- /home/lijin/privatemodules ---------------------------------------------------  
    compiler-rt/2022.1.0    compiler/2022.1.0    debugger/2021.6.0       icc/2022.1.0    init_opencl/2022.1.0  tbb/2021.6.0    
    compiler-rt/latest      compiler/latest      debugger/latest         icc/latest      init_opencl/latest    tbb/latest      
    compiler-rt32/2022.1.0  compiler32/2022.1.0  dev-utilities/2021.6.0  icc32/2022.1.0  oclfpga/2022.1.0      tbb32/2021.6.0  
    compiler-rt32/latest    compiler32/latest    dev-utilities/latest    icc32/latest    oclfpga/latest        tbb32/latest    
    

    由于我还安装了一些其他工具,所以除了icc,还显示了其他的module。

    然后使用module load icc/latest就可以加载安装的最新版本的icc编译器啦!

安装Intel的Fortran编译器ifort

安装ifort编译器的步骤与上述步骤类似,这里不再赘述。ifort编译器默认安装目录也是/opt/intel/oneapi,安装完成后再次运行

1
/opt/intel/oneapi/modulefiles-setup.sh --output-dir=$HOME/privatemodules

即可更新~/privatemodules目录下的modulefiles。

comments powered by Disqus