Featured image of post Linux下使用module管理软件包和环境变量

Linux下使用module管理软件包和环境变量

Linux下module以及Intel编译器的安装与配置

缘起

在使用学校的计算集群时,可以很方便地使用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