APP下载

使用Spack 软件包管理器构建高性能计算软件环境

2020-09-14韦建文文敏华王一超林新华

实验室研究与探索 2020年7期
关键词:编译器管理器高性能

韦建文, 王 杰, 文敏华, 王一超, 林新华

(上海交通大学网络信息中心,上海200240)

0 引 言

上海交通大学高性能计算平台的计算能力位居全国高校前列[1],自2013年上线以来,常年满负荷运行,已累计为校内300多个课题组提供超过5亿核小时的计算服务。为支持用户高效完成计算任务,除了稳定可靠的硬件环境,还需要灵活易用的软件环境。在每年2 000多人次技术咨询中,“如何安装软件”占了60%。为应对这种情况,中心配备了一名员工专职从事应用编译,在过去一年新增了71个计算软件库,进行了205次版本更新,可用软件包总数超过200个。

2019年9月上线的第二代校级高性能计算平台,计算能力提升了10倍,理论性能达到2PFlops。可以预期的是,用户必将对软件种类和易用性提出更高的要求。如何构建一个软件种类丰富、运行高效、调用方便的软件环境,是维护高性能计算平台的一个难题。本文将着重介绍构建高性能计算软件环境的主要挑战、软件包管理器的概念、如何使用Spack软件包管理器以及使用Spack构建上海交通大学的超算软件环境。

1 构建高性能计算软件环境的主要挑战

如图1所示,编译一个高性能计算软件需要准备好软件源代码以及依赖软件库,通过构建工具编译出可执行程序,整理出软件模块文件供用户调用。

图1 软件编译流程

构建一个面向高性能计算软件环境存在如下挑战:

(1)软件数量多。常用的高性能计算软件多达上百种,若算上软件在版本、编译器、优化选项上的变种,构建软件环境需要重复上千次准备源代码、编译、撰写模块的操作。

(2)编译流程差异大。常用的软件编译工具就有Autotools[12]、CMake[13]、Maven[14]、SCons[15]等10 余种,用法上差异较大,需要投入大量时间才能熟练掌握这些工具。

(3)维护环境模块工作量大。供最终用户使用的环境模块文件,必须与软件版本一一对应,手动维护模块文件难以保证内容的正确性。

(4)软件版本共存。出于性能、稳定性和结果一致性的考虑,高性能计算平台需要提供同一个软件的多个版本供用户使用,这需要在安装时设计好安装路径,避免路径冲突。

(5)软件管理角色不清晰。在现有方法中,系统管理员拥有特权可以部署全局可用的软件,普通用户因无特权而很难从基础库开始构建自定义的软件环境。

2 软件包管理器

为了应对构建软件环境的挑战,一类被称为软件包管理器(Software Package Manager)的工具应运而生。这类工具屏蔽了不同软件在获取、编译和加载过程中的差异,为用户提供了一个统一的软件包管理接口,在类UNIX操作系统上获得了广泛应用,例如Yum、Apt、BSD Ports等。一些针对高性能计算软件环境的包管理器在此基础上改进,如OpenHPC、Anaconda、EasyBuild、Spack 等。此外,Docker和Singularity等基于容器技术的软件部署方法,也获得了越来越多的关注。这些软件包管理器的主要特性见表1。

表1 软件包管理器对比

OpenHPC[6]是一个基于Yum的软件包管理工具,以预编译包提供x86和ARM平台的常用高性能计算库。OpenHPC需要使用管理员权限安装,系统中只能保留软件的一个版本。

Anaconda[7]是基于Pip的软件包管理器,用于管理Python扩展包和一般的科学计算软件包。Anaconda可以把软件安装在用户家目录,不需要管理员特权,并可以创建多个相互隔离的软件环境。

Docker[8]和Singularity[9]是基于容器技术的软件封装技术,他们将软件连同系统库一起打包,构建出一个共享宿主节点内核的运行环境。应用只需要打包一次就能在支持容器技术、同一指令集架构的操作系统上运行。

EasyBuild[10]和Spack[11]借鉴了BSD Ports,将软件编译过程中的关键步骤抽象成一系列函数,用户使用函数而非具体执行的命令描述编译过程,在实际执行时包管理器根据用户编写的流程完成下载源代码包、解压、编译、安装的流程。这两个工具都可以方便地以普通用户权限安装软件,且已支持超过1 000种科学计算软件。Spack安装简单,命令行提供了丰富的编译选项,评估试用后被选中用于构建上海交通大学高性能计算平台的软件环境。

3 使用Spack安装软件

3.1 安装Spack

Spack只需要Python和GCC编译器就能工作,安装过程非常简单,不需要管理员特权,只要将源代码克隆到本地即可使用。

$ git clone https://github.com/spack/spack.git

$ cd spack/bin

$ ./spack-v

3.2 使用Spack安装软件包

Spack使用install命令安装软件包,这个命令可指定软件版本、软件功能、优化选项、编译器、依赖软件包等编译参数。如图2所示,使用Spack安装aoflagger[12]2.10.0 版本,指定编译器优化参数(cflags)为“-O2”,使用符号“%”指定编译器为Intel编译器18.0.3,使用“^”符号指定依赖软件为casacore 2.4.1版本,并要求在casacore上开启对python的支持。

图2 Spack安装软件示例

3.3 Spack的工作流程

编译软件时,Spack根据命令行指定的选项,读取与软件包对应的package.py包文件,解析软件包下载地址、特性选项、依赖和冲突、编译方式,然后编译软件。aoflagger软件的包文件片段如图3所示。

图3 Aoflagger的package.py示例片段

其中,class指定软件包类型,以决定使用什么工具编译这个软件,Spack支持的软件包类型包括AutotoolsPackage、CMakePackage、MakePackage 以及一般的Package等;home和url分别用于指定软件主页和下载地址;version指定软件包的版本和校验和,确保用户下载的软件源码包是正确的;variant用于描述软件支持的特性,常见的如是否开启对openmp、mpi、python的支持等,使用者可以在spack install选项中通过“+”或“~”符号开启或关闭这些特性;depends_on和conflicts指令用于描述这个软件依赖的其他软件包,或是与之冲突的软件包、编译器等。

Spack将递归地构建出一个包含软件及其依赖包的有向无圈图(directed acyclic graph,DAG),以此指导编译过程。编译aoflagger的有向无圈图如图4所示,Spack将从下到上依次编译依赖包最后编译aoflagger。

图4 Aoflagger软件包依赖关系

3.4 调用Spack安装的软件

高性能计算系统普遍使用环境模块[13](Environment Module)调用软件,环境模块通过修改“PATH”“CPATH”“LD_LIBRARY_PATH”等环境变量动态地调用软件。为软件的每一个版本及其依赖库手工编写模块文件,其工作量很大,Spack通过RPATH和自动生成模块降低了软件调用的难度。Spack在编译时使用RPATH参数将依赖库的路径写入了编译出的二进制程序中而无须依赖环境模块提供的LD_LIBRARY_PATH。每一个安装的软件唯一地对应了一个有向无圈图,Spack在软件安装路径中添加了这个图的散列值,从而保证同一软件的不同编译版本或变种能唯一地确定,不会发生路径冲突。Spack根据软件的构建选项和安装路径,可自动生成环境模块供用户调用。下面的示例展示了通过module命令加载和使用软件的流程。

$module avail gromacs

gromacs/4.5.5-intel-19.0.4 groamcs/4.5.5-gcc-8.3.0

$ module load gromacs/4.5.5-intel-19.0.4

$ which mdrun_mpi

/lustre/spack/opt/sandybridge/intel-19.0.4/gromacs-4.5.5-f239hfe823gf/bin

3.5 Spack性能测试

使用软件编译时间与软件运行时间来考察Spack性能,与之对比的是手动编译和Docker编译。用于测试的程序是基因数据处理软件Samtools[14]和计算流体软件OpenFOAM[15],前者运行一个单机多线程算例,后者运行一个4节点MPI算例。

编译耗时如图5所示。Samtools编译耗时差异很小,Docker因为需要下载镜像,最耗时。OpenFOAM编译耗时差异大,Docker可以直接使用操作系统预编译的OpenMPI库因而最快;Spack可以自动解决依赖包,可在无人值守状态下完成编译,也比手工方式快。

图5 编译时间

运行耗时如图6所示。单节点Samtools运行耗时差异很小,Docker多了首次启动需要的15 s时间。4节点OpenFOAM运行耗时差异大,手动编译和Spack安装的版本基本持平,分别需要603 s和598 s完成计算;而Docker版需要1 028 s,慢了41%。经检查发现,Docker版本使用的操作系统自带OpenMPI库没有加入对Infiniband网络的支持,运行过程中使用了低速的千兆网导致多节点运行效率降低。

图6 运行时间

综上,手动编译和Spack编译都能发挥出了高性能计算平台的应有性能。而Docker为保证兼容性优先选择了操作系统预编译的软件包,这在配备了Infiniband等特殊硬件的高性能计算平台上并不是最优方案。使用Spack作为构建Docker镜像工具,以解决Docker应用在高性能计算平台上多节点运行效率低的问题,是一个可行的方向。

4 上海交通大学高性能计算中心的Spack实践

上海交大高性能计算中心摸索出了一套使用Spack构建高性能计算软件环境的方法,在国内率先使用Spack安装生产环境上的软件,构建流程如图7所示。

图7 基于Spack按角色分工的高性能计算软件环境构建方法

首先,Spack使用者被分为3类:Spack开发者,负责定期从Spack社区更新软件包,测试软件包稳定性,并补充Spack缺失的软件包;系统管理员,根据Spack开发者反馈的测试结果,将软件的稳定版本部署到系统中供所有用户使用;普通用户,既可以直接使用Spack部署在系统中的应用,也可以只使用Spack部署的编译器或科学库,或者完全从头用Spack部署自己的软件环境。3个角色在相互隔离的环境中测试与合作,管理员只部署通过验证的软件,而开发者进行的测试不会影响生产环境,普通用户可自由选择复用或重新构建整个软件环境。

按类别选择需要部署的软件。软件环境中的软件数量并非越多越好,环境中共存的软件数量越多,生成模块文件和指定依赖关系时产生冲突的概率也越大。根据软件类型、使用广泛程度等因素,选择一个稳定可靠的子集部署在软件环境中。对于编译器和科学库这类基础软件,如GCC、OpenBLAS等,可安装尽可能多的版本供用户选择,并保持一个版本能用至少半年;常用科学计算软件会保留最近的2~3个版本,更新频率要比基础库高;对于使用量小的软件将被部署在特定用户的家目录下。

这套分角色分类别的软件构建方法,很好兼顾了只需要运行计算软件的初级用户需求和需要构建自己软件环境的高级用户的需求。软件部署前经过测试,超过生命周期后有序退出,管理员部署的软件也能最大限度地复用,避免了重复劳动。

5 结 语

本文总结了构建高性能计算软件环境遇到的软件数量多、编译流程差异大、维护模块工作量大、软件版本共存、软件管理角色不清晰等挑战,在对比数个软件包管理器后,重点介绍了Spack软件包管理器的安装方法、工作流程和软件调用方法,并通过测试展示了Spack优异的编译速度和高质量的编译结果。最后介绍了上海交通大学高性能计算平台基于Spack的分角色分类别的软件环境部署流程,这套流程能涵盖Spack开发者、系统管理员和普通用户的软件部署需求,为构建高性能计算软件环境提供了有效方法。Spack收录的软件包数量和功能仍在稳步增加,将为高性能计算用户构建特定领域的软件环境带来便利。

猜你喜欢

编译器管理器高性能
启动Windows11任务管理器的几种方法
应急状态启动磁盘管理器
基于相异编译器的安全计算机平台交叉编译环境设计
运行速度大突破华为《方舟编译器》详解
Windows文件缓冲处理技术概述
一款高性能BGO探测器的研发
高性能砼在桥梁中的应用
SATA推出全新高性能喷枪SATAjet 5000 B
高性能可变进气岐管降低二氧化碳排放
通用NC代码编译器的设计与实现