软件包管理器Spack / Environment Modules

Spack - 自动化安装管理器 https: blog csdn net thesre article details 118197759 htt

 

Spack - 自动化安装管理器

https://blog.csdn.net/thesre/article/details/118197759

 

https://re-ra.xyz/Spack-%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/

 

为什么要写本文

事实上,本文的所有内容,几乎都可以在 spack 官方文档3中找到,写这篇内容倒不是仅仅做文档翻译这样没技术含量的事,实在是官方文档写的不太好。虽然说关键的内容文档里其实都讲到了,但文档的逻辑组织实在不敢恭维,详略失当,前后失当,把重点混在细节里讲解,很难把握主线,甚至我最早看了很长时间文档,也没搞懂 spack install 到底是下载的 binary 还是 source。因此我决定把 spack 使用的主线重新整理出来,方便查看和快速上手。

原理

上手之前,简单了解一下 spack 的工作原理还是有必要的。spack 由 python 语言实现,但并不需要任何如 pip 之类的安装过程,可直接将 github 源 pull 下来开箱即用。spack install <package> 时,spack 会在本地自己安装的目录寻找对应 <package> 名字的脚本,该 python 脚本则通过 spack python 库提供的 API 描述了如何编译安装该软件的细节。这主要包括,软件的多个版本号和对应的源代码下载地址,configure 的参数,依赖的其他动态库,可能会存在冲突的库,在 spack install 命令中提供的额外参数的处理等等。spack 通过该脚本的 instruction,就可以完成软件的源码下载。通过每个软件脚本中的依赖定义,对于每个软件,spack 就会生成一个依赖的 DAG 进行分析。从而从最基本的依赖开始满足,未满足的依赖则依次重复 spack install 过程,最终编译完成的指定软件,而编译的 binary 则会存于 spack 本地安装目录的 opt 文件夹中,因此这些软件默认是无法调用的,除非通过和 spack 紧密结合的 module 工具进行加载,其实质上就相当于完成了各种环境变量的修改,只不过从 module 文件生成到环境变量添加,spack 都自动完成了。

有了以上这个最粗糙的框架,我们就已经能理清不少问题了。首先,和其他包管理器不同,spack 没有中心的 repository 服务器,这是因为每个具体软件的 url 都指向了对应软件的官网,因此 spack 本身并不需要维护一个服务器。spack 中所谓的 repo 概念,也不过是在 spack 本地文件夹特定位置的一组软件安装 python 脚本而已。其次,可以看到 spack 项目的代码基本由两大部分构成,第一部分是 spack 的框架部分,这一部分提供了一些 API,定义了一些描述安装编译时的行为和函数,这一部分又可细分为 make 需要的 API, cmake 需要的 API,python package 需要的 API 等等,不同的 build system 可以参考文档对应部分。另一部分,则是大量的对应不同软件的 python 脚本,这些脚本利用了 spack 提供的 API,描述式的给出了对应软件的编译过程,而由于这一部分的脚本可以自己自由的修改和添加,因此 spack 可以管理的软件不限于官方的列表,事实上所有的软件都可以通过 spack 编译安装,只要自己去写对应的脚本。而 spack github 库贡献最活跃的部分,就是这些不同软件安装脚本的修改和添加。这种软件编译脚本的编写,被 spack 称作打包 (packaging)。spack 代码的这两部分的开发,分别对应文档的 developer guide 和 packaging guide.

 

dnf install -y environment-modules

dnf install -y lmod

spack install environment-modules

spack install lmod

 

常用的 module 软件有 enviroment modules 和 lmod,本文使用 lmod。注意,如果通过 spack bootstrap 来完成初始的 module 软件的下载和配置的话,其对应的是 enviroment modules。安装 lmod 也很简单,直接通过 spack 完成,spack install lmod。安装完成后,同样的, lmod 无法直接调用。但其本身就是模块系统,因此无法通过模块加载调用,这就有点像 bootstrap,因此需要 . $(spack location -i lmod)/lmod/lmod/init/bash 单独将 lmod 的相应变量加入系统环境变量和路径。此时可以通过 module -v 来查看 lmod 的版本,验证 lmod 已安装并添加到系统路径。如果希望每次登陆都可以默认使用 module,可以将 . $(spack location -i lmod)/lmod/lmod/init/bash 添加到 bash 的 profile 文件。

现在我们就完成了 spack module 系统的安装,可以开始使用之前 spack 安装的 tar 了,只需要 spack load tar 即可加载 spack 安装的 tar 软件,此时 which tar 地址已指向了 spack 中 tar 的安装路径。

事实上,spack load/unload 命令是对于 module load/unload 命令的 wrapper。这是因为 module load 的参数只严格接受 module 文件名,这通常形如 tar-1.30-gcc-7.4.0-ch 这并不方便记忆。而 spack load/unload 则可和其他命令一样根据不完整的 package syntax 智能识别所对应的安装版本,并且再去调用 module 实现加载。

对于系统已安装的软件 module,可以通过 module avail 查看,而对于已经 load 的 module,可以通过 module list 查看。而 module 文件的具体内容,既可以到对应路径下查看文件,也可以直接 module show <module-name> 的方式来查看。更改 module 的配置文件或模版后,可以通过 spack module tcl refresh --delete-tree 来刷新所有的 module 文件内容。

 

 

 

https://github.com/TACC/Lmod

 

 

 

 

 


我们有什么问题?
在日常支持中,我们可能需要安装Python、GCC等工具。通常步骤是

找到官网,下载需要的包
传到目的服务器
解压
./configure && make && make install
一圈下来,耗时不少。

Spack是什么?
它是一个自动化包管理器,支持管理Linux、MacOS上的包。

Spack能做什么?
Spack能使得上述步骤自动化,并自动生成modulefile(Environment Modules或Lmod的,都可以生成)——无论是对于广泛使用的开源包,还是有知识产权保护的有限范围分发包,还是处于研发阶段的内部包,它都能轻松搞定。

 

Spack:超算上最好的包管理器

Spack 是一个跨平台的包管理器,可以用来安装和编译不同版本的软件,使得他们不与系统环境冲突并且多个版本可以共存。

Spackenv 可根据筛选条件为部分面向最终用户的软件生成 Environment Moduleshttps://zhuanlan.zhihu.com/p/426743137

https://spack-tutorial.readthedocs.io/en/latest/tutorial_environments.html

 

https://github.com/SJTU-HPC/spackenv

 

 

https://hpc.pku.edu.cn/_book/guide/soft_env/spack.html

 

 

Python包管理之poetry

https://python-poetry.org/

Poetry 是 一个 Python 依赖管理和打包工具。 它允许您声明项目所依赖的库,并将为您管理(安装/更新)它们。

 

 

 

 

https://hpc.pku.edu.cn/_book/guide/soft/module.html

https://help.aliyun.com/document_detail/251476.html

使用Environment Modules管理软件包

更新时间:2022-08-19 11:31

本文介绍如何使用Environment Modules编译成软件中模块对应的环境配置,使其可以在E-HPC环境中直接加载使用。

背景信息

在使用E-HPC集群过程中,经常要安装不同的编译器和库文件,如常用的编译器有GCC和ifort,常用的 MPI并行库有OpenMPI、MPICH2等。在使用某个软件时,通常采用不同的编译设置得到不同版本的可执行程序和链接库,或者需要修改、切换不同版本的环境变量。由于程序在编译时会调用不同类型编译器或第三方库,程序之间还存在着依赖关系。导致当执行某个特定版本的程序时,修改环境变量变得十分复杂。

Environment Modules是一个简化Shell初始化的软件包,您可以在使用modulefiles模块与E-HPC进行会话期间修改模块对应的运行环境。每个模块文件都包含应用程序配置所需的信息。集群用户可共享系统上的模块文件,并且用户可以拥有自己的集合来补充或替换共享模块文件。

Environment Modules相关命令

E-HPC集群中已默认安装Environment Modules软件来管理不同运行环境。

当使用module命令时,可用的模块在modulepath=/opt/ehpcmodulefiles目录下,modulefile文件通常被命名为某个软件版本号,如openmpi/3.0.0。

常用的module命令如下:

  • module avail:显示可以使用的模块

  • module load:加载模块

  • module unload:卸载模块

  • module list:显示已经加载的模块

操作步骤

以下通过Environment Modules软件卸载openmpi/3.0.0,然后加载openmpi/3.0.1版本示例来介绍如何设置modulefile:

  1. 登录弹性高性能计算控制台

  2. 在顶部菜单栏左上角处,选择地域。

  3. 在左侧导航栏,单击集群。

  4. 集群页面,找到要登录的集群,单击远程连接。

  5. 远程连接页面,输入root用户、登录密码和端口,单击ssh连接。

  6. 执行cd /opt/ehpcmodulefiles命令,切换到ehpcmodulefiles目录下。

  7. 执行module list命令,显示已经加载的模块。

    如图所示,表示已加载openmpi/3.0.0模块。module list

  8. 执行module unload openmpi/3.0.0命令,卸载openmpi/3.0.0模块。

  9. 执行module load openmpi/3.0.1命令,加载openmpi/3.0.1模块。

    您可以根据业务需求修改openmpi/3.0.1中的配置信息。具体配置项说明如下:

    • PATH:可执行文件路径。

    • LIBRARY_PATH:程序编译期间,查找动态链接库时指定查找共享库的路径。

    • LD_LIBRARY_PATH:程序加载运行期间,查找动态链接库时指定除了系统默认路径之外的其他路径。

    • installpath:软件安装目录。

       
      #%Module1.0#####################################################################
      ##
      ## modulefiles/openmpi-3.0.1  Generated by EHS 1.0.0
      ##
      proc ModulesHelp { } {
        puts stderr "\tmodules - loads the modules software & application environment"
        puts stderr "\n\tThis loads environment of openmpi-3.0.1"
      }
      
      module-whatis   "loads the openmpi-3.0.1 environment"
      prepend-path PATH  ${installpath}/bin  
      prepend-path LD_LIBRARY_PATH  ${installpath}/lib
      prepend-path LIBRARY_PATH  ${installpath}/lib