时间 | 版本 | 修改人 | 描述 |
---|---|---|---|
2023年10月16日10:46:53 | V0.1 | 宋全恒 | 新建文档 |
2023年10月20日15:01:52 | V1.0 | 宋全恒 | 了解2016 EasyBuild在JURECA系统上的实践 |
EasyBuild: in a structured way 管理大量的科学软件包
第一段说的是HPC软件管理现状,系统管理员很累。
第二段写的手动
任务,软件包数量越多,团队规模越大,但是人力资源有限,有许多的辅助软件包:
这种方式不仅使集群节点的OS镜像臃肿,而且将缺失软件的安装限制在指定的维护窗口内。
This approach not only bloats the OS images of the cluster nodes, but also restricts the installation of missing software to a designated maintenance window.
第三段已安装软件被暴露给用户的方式。传统的"flat"的模型试图导致无结构和混淆的module视图。层级方式
无论如何,手工创建一致的模块文件并进行维护是繁琐且容易出错的。
In any case, creating consistent module files and maintaining them manually is tedious and error-prone.
出现了许多的工具来帮助系统管理员管理科学软件栈。
但是,这些软件还缺少一些特征,因此必须金华适应新的环境和约束。
我们提出来一种方式即 EasyBuild + LMod。
论文组织结构。
第二部分,概览被JURECA系统以及我们的用户社区的施加的要求。
第三部分,如何向用户呈现软件,为什么选择LMod
第四部分,为什么选择Easybuild,如何实现需要的功能的。
第五部分,详细介绍了JURECA上的当前状态、用户视图以及与上游的分歧。生命周期策略。
第六部分,如何重用软件管理方法在其他的内部集群系统。
第七部分,展示计划的未来改进。
第八部分,结论
第一段描述JURECA集群的细节。描述了计算节点的配置,内存层级,GPU设备,和网络结构(fat-tree).
第二段描述系统的异构性也需要复杂的软件环境。
X86 CPU设备需要Intel和GCC编译器。
GPU加速器需要CUDA和PGI编译器。
编译器-Compilers
平台支持多种MPI。
To ensure a consistent software stack and to avoid subtle, hard-to-diagnose errors, one can define toolchains consisting of a particular compiler coupled with a specific MPI implementation, and require that each software package is available within each toolchain.
为了保证软件栈的一致性,避免细微的、难以诊断的错误,可以定义由特定编译器和特定MPI实现组成的工具链,并要求每个软件包在每个工具链中可用。
One can easily see how this quickly leads to a very large number of environment modules which gets increasingly cluttered as new versions of software packages become available
人们可以很容易地看到,随着新版本的软件包的出现,这会导致大量的环境模块变得越来越杂乱无章。
为我们提供的科学软件的最终用户提供一个直观的视角是我们的主要目标
模块层级
Through the use of a module hierarchy one can restrict the user view to purely the consistent stack
通过使用模块层次结构,可以将用户视图限制为纯粹的一致堆栈,这是选择LMod的原因。
一个模块层次结构,用户必须首先选择一个编译器,然后选择一个MPI实现,以便使用此编译器/ MPI组合构建的所有软件在其可用的环境模块视图中可见
相对于传统的module的扁平组织的好处如下:
提供MPI功能的软件和不提供MPI功能的软件之间存在明显的分离;这些信息可以用来确定软件在什么情况下可以使用。
第一段-Tcl-based modules
缺少重要的特征
第二段-Lmod
选择使用Lmod的原因
(--show-hidden) to the module avail
这些特性为Lmod提供了对模块层次结构的良好支持;事实上,它是从基础上发展起来的,在头脑中具有模块层次结构。
These features give Lmod excellent support for module hierarchies; in fact, it was developed from the ground up with module hierarchies in mind.
HPC系统上安装科学软件的工具出现。
These features give Lmod excellent support for module hierarchies; in fact, it was developed from the ground up with module hierarchies in mind.
这些目的是减轻系统管理员和支持团队的负担,维护一个符合用户需求和期望的科学软件栈。
EasyBuild能够
各种各样的软件
选择EasyBuild的原因
EasyBuild is intended exactly for our use case, i.e., efficiently maintaining a software stack for end users on a modern HPC system.EasyBuild正是针对我们的用例,即在现代HPC系统上为最终用户高效地维护一个软件栈。
In contrast, Spack for example is more targeted towards developers of large scientific software applications, as illustrated by several of its main features including a very flexible and powerful way of dealing with dependencies.
相比之下,Spack更多的是针对大型科学软件应用程序的开发人员,它的几个主要特点包括非常灵活和强大的处理依赖关系的方式。
从2012年就用于生产环境。
EasyBuild可以根据站点策略进行灵活的配置,包括软件安装前缀,到module命名方案。
EasyBuild包括对Lmod和模块层次结构的广泛支持,包括以Lua语法生成模块文件,而不是其他工具。
EasyBuild得到了积极的维护,并得到了支持和欢迎的社区的支持。
EasyBuild包含了超过1000个不同软件包的食谱( “易配置文件”),明显多于其他任何一个工具。
上述的方面组成了令人心腹的结论。
JURECA复杂的用例和庞大的社区快速地要求数百个软件包安装上每一个所使用的工具链,许多问题变得显而易见:
这些问题导致了许多的要求,为了维持一致的用户试图,这些试图被限制到相关的科学和开发包。
通过EasyBuild维护模块层次结构的支持,使我们能够更好地组织模块堆栈,以一种完全自动化的方式
The support for maintaining a module hierarchy through EasyBuild allowed us to organize the module stack better than before, in a fully automated way
A hidden module essentially can be created by prefixing the module file name with a dot (‘.’), just like any other hidden file in a Unix-based operating system.
隐藏模块本质上可以像基于Unix的操作系统中的任何其他隐藏文件一样,通过在模块文件名前加上点( ')来创建。
指定隐藏模块的四种方式:
第二个问题是,特别是可视化包需要有一个底层的GCC编译器,该编译器可以跨所有工具链构建和提供这些包。
GCCcore概念的发展。
This lead to the development of the GCCcore concept within EasyBuild, which essentially acts as a replacement for the system GCC compiler and also allows us to exercise control over which binutils installation is used for all software installations.
这导致了EasyBuild中GCCcore概念的发展,它本质上充当了系统GCC编译器的替代者,也允许我们对所有软件安装使用的binutils安装进行控制。
The dependency resolution mechanism implemented by EasyBuild was rather straightforward: usually, the toolchain that was employed to build and install a particular software package was simply inherited by the dependencies as well, even though they may not require some of the functionality that was provided by that toolchain (for example MPI support, BLAS/LAPACK libraries, etc.).
EasyBuild实现的依赖项解析机制非常简单:通常,用于构建和安装特定软件包的工具链也由依赖项简单继承,尽管它们可能不需要该工具链(例如MPI支持、BLAS / LAPACK库等。)提供的某些功能。
为了缓解这种情况,增强了依赖项解析机制,以同时考虑所谓的子工具链
的整个层次结构,其中,"完整"工具链(同时提供BLAS / LAPACK / FFTW功能)的仅编译器和仅编译器+ MPI的子集首先被认为是依赖项,而不是直接从"父"软件继承工具链。
最小化toolchains概念
This concept of
minimal toolchains
opens the door to a much more intuitivemodule hierarchy
: global tools and libraries can be moved to GCCcore, software that requires a specific compiler (typically for performance reasons, such as Python) can sit at the Compiler level of the hierarchy, with all other applications sitting at the MPI level of the hierarchy这个
最小工具链
的概念打开了一个更直观的模块层次
结构的大门:全局工具和库可以移动到GCCcore,需要特定编译器的软件(通常是出于性能的考虑,比如Python)可以位于层次结构的Compiler层,所有其他应用程序都位于层次结构的MPI层。
--minimal-toolchains
默认EasyBuild包含
--module-only: 允许对同一软件栈支持多个并行命名方案
With the introduction of the custom module naming scheme, there was also a realization that the installation directories of software should be unique and independent of the naming scheme employed
在某些情况下,当使用层次模块命名方案( HMNS )和具有复杂依赖树的软件包时,依赖解析所花费的时间为几分钟。造成这种放缓的原因有两方面:
解决了这两个问题,通过将ModulesTool实例的数量最小化为easyconfig文件的数量加1,并通过缓存模块显示和模块可用性的输出,获得了高达10倍的加速比
MPIC是最成功的MPI实现中的一个,有多个商业[Intel MPI, Cray MPI, IBM MPI]和免费开源(ParaStation MPI, MVAPICH)的派生物。
通常,基于Configuration & & make的软件使用$CFLAGS, $LDFLAGS和相关的环境变量来确定编译过程中使用的编译器和链接器标志位
“However, during the configuration step, MPICH takes these flags and transparently adds them to its MPI compiler wrappers
[21]. Since EasyBuild sets these variables, this is not the desired behavior at installation time, and forces a change in the internal behavior of EasyBuild to unset these flags and export another set of variables to achieve the intended behavior.” (Alvarez 等, 2016, p. 35)
然而,在配置步骤中,MPICH采用这些标志并透明地将它们添加到其MPI编译器包装器中[ 21 ]。由于EasyBuild设置了这些变量,这在安装时间并不是想要的行为,并迫使EasyBuild内部行为的改变来取消设置这些标志,并导出另一组变量来实现预定的行为。
In this section we describe how our current setup looks like, as a result of these requirements, capabilities, and improvements.
在这一部分中,我们描述了由于这些要求、能力和改进,我们目前的设置是如何看起来的。
15个toolchain定义
为了与OS包解耦,有两个隔离层:
不兼容,施加了一些限制在安装结构上:
可视模块主要有两类:( 1 )编译器;( 2 )安装在虚拟环境中的二进制工具
With the selection of compiler and MPI a user has all the software available for that part of the tree
通过编译器和MPI的选择,用户拥有该部分树的所有可用软件
这些隐藏包绝大多数是安装在GCCcore级别的帮助者库和工具。
一些流行的脚本语言是高度模块化的。
它们都有共同的思想,都有中央仓库,持有大量的包,这些包易于访问和安装。
有两个Python module在编译器级别,
在HPC中,numpy和scipy是非常常用的Python包。它们与matplotlib、iPython等软件包一起构成了所谓的SciPy堆栈
In HPC, numpy and scipy are Python packages which are very commonly used. Together with matplotlib, iPython and other packages, they conform the so-called SciPy stack
The use of a hierarchical module naming scheme, hidden modules and bundles sometimes causes false negatives, when an unfamiliar user tries to find software in JURECA
当一个不熟悉的用户试图在JURECA中查找软件时,使用分层的模块命名方案、隐藏模块和包有时会导致负面效应。
module avail.
--show-hidden 选项。
module spider 寻找module tree, 并展示三种不同信息:
module key
JURECA的预期寿命大致为5年。在这段时间内,人们可以期望每隔几个月对编译器进行更新,并随着最新标准的集成对MPI实现进行更新。这将意味着整个软件栈将需要频繁的升级。在这样的升级过程中,人们很自然地期望安装任何特定软件包的最新版本。
The project cycle for JURECA lasts 12 months with two cycles per year.
JURECA的项目周期为12个月,每年两个周期。
为了确保一致性和质量标准,在生产阶段只允许极少数人(通常为12人)使用专用账户安装软件。
修改权限,并且开发了一个定制的module正确设置必要的环境变量。分为两个阶段,development stage和production stage。
JURECA中使用的安装程序的部署并不简单,因为目前使用的大多数easyconfig文件都没有包括在上游。有两个原因:
虽然这是一项繁琐的任务,需要大量的人工检查,但事实是安装在JURECA中的easyconfigs与上游的easyconfigs之间的差异通常很小。
工具链的更改需要手动调整,因为确定最优包装位置( base、编译器、MPI或顶层)的启发式方法并不简单。
上游指的是EasyBuild的仓库。EasyConifg变化,和EasyBlock的变化。
本章描述当相同的设置移植到其他集群时出现的问题
处理器尽管都是x86_64,但是来自不同的代数。当使用AVX指令时,导致了二进制的不兼容性。操作系统在JURECA是Centos7.2, JUAMES和JUROPS3是Centos 6.7。
部分节点具有特殊的( JUROPA3拥有额外的至强融核节点和NVIDIA K20X GPU ,而JURECA拥有配备NVIDIA K80 GPU的节点)特性。
These issues required the creation of extra easyconfigs to supply the missing software, to adapt dependencies and/or to fix existing easyconfigs
这些问题需要创建额外的easyconfig来提供缺失的软件、调整依赖关系和/或修复现有的easyconfig
调整数百个easyconfig文件以更改某些依赖项的版本,或它们自己的版本,是一项容易出错且耗时的任务
未来,我们旨在自动处理这些任务,通过实现两个额外的特征:
使用动态连接库,$LD_LIBRARY_PATH会导致很长的字符串,并且可能回到意想不到的问题。
使用最小的工具链已经是朝着复用软件安装、消除冗余包和在工具链层次结构中正确安装软件的方向迈出了非常重要的一步
在第一步中,这将允许将多个工具链的easyconfig合并到单个easyconfig文件中。
仍然定制的努力需要来:
迁移的工作也是非长达的。
EasyBuild was created with support of Ghent University, the Flemish Supercomputer Centre (VSC), the Flemish Research Foundation (FWO) and the Department of Economy, Science and Innovation (EWI).
这个论文是2016年撰写的,是工程类的文章(笔者也想水一篇论文来着),HPC环境的管理是一个比较大的问题。这篇文章主要描述EasyBuild的实践,而且自己在工作中也实践了这个工具,在制药环境安装中,确实缓解了不少的问题。本文主题介绍了JURECA集群的要求,为设计用户视图而做出的实践和努力。作者写文章时写的很精彩,如果有机会能去国外待几年好了。
挺遗憾的是,自己现在也只是会使用EasyBuild来部署基本的环境,还不能深入的理解EasyBuild的设计思想,诸如toolchain,minimal toolchain,dependency resolution, module-naming-schema。还需要做更多的努力吧。
期待自己早日能写出第一篇水论文。
2023年10月20日15:01:31于之江实验室