跳到主要内容

弹性容器集群使用Spack

更新时间:2025-04-12 18:43:25

本文档介绍了如何在容器环境中使用 Spack —— 一个支持多平台(Linux、macOS、Windows)的软件包管理工具,特别适用于超级计算和高性能计算(HPC)场景。Spack支持非破坏性安装,允许在同一系统中并存多个版本和配置的软件,非常适合需要精细控制软件环境的科研与工程应用。

前置条件

  • 用户已开通独享型弹性容器集群,且集群可正常使用。如尚未开通,可参考开通弹性容器集群完成开通。
  • 用户已被授权对应的VKS(弹性容器集群 ),企业主账号可参考授权弹性容器集群完成授权。
  • 已在弹性容器集群中启动了一个容器。

安装 Spack

spack是美国Lawrence Livermore National Laboratory开发的一个python库,它的基本思路是包括编译器在内的所有的软件都在spack环境下编译并登录,因此所有操作都可以在用户权限下进行。同时用户可以自由地加载或卸载登录在在spack环境下的工具链

如想安装其他版本,请参考 https://github.com/spack/spack/releases

下载

Spack 的安装比较简单,在容器内使用git克隆到指定目录即可。

git clone https://gh-proxy.com/https://github.com/spack/spack.git

安装

spack的设定文件在其目录/share/spack下,需要调用相应的设定文件来完成其设定。比如,你如果使用的是bash,可以将如下命令加入你的~/.bashrc文件中。

export SPACK_ROOT=你克隆下来的文件的路径
source $SPACK_ROOT/share/spack/setup-env.sh

1.安装编译器

spack compiler add

这会扫描系统中可用编译器,并将其登录再spack环境中。如

==> Added 1 new compiler to /yourhome/.spack/linux/compilers.yaml
gcc@11.4.0
==> Compilers are defined in the following files:
/yourhome/.spack/linux/compilers.yaml

如果输出类似于这样的内容:

==> Error: failed to concretize `gcc@13.2.0` for the following reasons:
1. Cannot satisfy 'gcc@13.2.0'
2. Cannot satisfy 'gcc@13.2.0'
required because gcc@13.2.0 requested explicitly
3. Cannot satisfy 'gcc@=11.4.0' and 'gcc@13.2.0'
required because gcc@13.2.0 requested explicitly
required because gcc available as external when satisfying gcc@=11.4.0 languages:='c,c++'
required because gcc@13.2.0 requested explicitly
4. Cannot satisfy 'gcc@11.3:' and 'gcc@13.2.0'
required because gcc@13.2.0 requested explicitly
required because @11.3: is a requirement for package gcc
required because gcc available as external when satisfying gcc@=11.4.0 languages:='c,c++'
required because gcc@13.2.0 requested explicitly
required because gcc@13.2.0 requested explicitly

则需要在pod内安装gcc:

apt install -y build-essential gcc g++ gfortran

然后再重新执行

spack compiler add

2.输入:

spack compiler list

此时应该输出一下内容:

root@model2:~/spack# spack compiler list
==> Available compilers
-- gcc ubuntu22.04-x86_64 ---------------------------------------
[e] gcc@11.4.0

此时可以输入一下内容来安装gcc:

spack install gcc@11.4.0

3.激活环境: 输入:

spack env create default
spack env activate default

此时已经激活default环境,可以使用以下命令来验证:

spack env status

输出信息:

==> In environment default

这表明当前激活的环境为 default.

spack env status

输出信息:

==> In environment default

这表明当前激活的环境为 default.

Spack 引导 (bootstrap)

Spack 本身需要一些软件来协助完成其他软件包的管理动作,安装这些软件的过程称之为引导。

用以下命令检查引导状态:

spack bootstrap status

在引导完成之前可能输出如下:

Spack v0.22.2 - python@3.10

[FAIL] Core Functionalities
[B] MISSING "clingo": required to concretize specs

[FAIL] Binary packages
[B] MISSING "patchelf": required to relocate binaries


Spack will take care of bootstrapping any missing dependency marked as [B]. Dependencies marked as [-] are instead required to be found on the system.

其中标有 [B] 的项目是可以通过 spack 命令安装的。执行以下命令:

spack bootstrap now

在此过程中 Spack 将安装一些软件,需要访问 Spack 软件源,因此要保持网络畅通。安装完成后,再次用 spack bootstrap status 查询引导状态,应该得到以下输出:

Spack v0.22.2 - python@3.10

[PASS] Core Functionalities

[PASS] Binary packages


引导过程安装的软件独立于当前环境,在所有环境中有效。

注册编译器

虽然系统中已经安装了编译环境,但是 Spack 将编译器版本作为软件包规格的一部分,不同编译器版本编译得到的软件包被视为不同的实体,因此需要向 Spack 环境注册所用的编译器。

用以下命令检查是否有注册的编译器:

spack compiler list

如果输出为:

==> No compilers available. Run `spack compiler find` to autodetect compilers

表明没有编译器注册到 Spack. 按提示执行命令:

spack compiler find

输出信息:

==> Added 1 new compiler to /home/user/opt/spack-trunk/environments/default/spack.yaml
gcc@11.4.0
==> Compilers are defined in the following files:
/home/user/opt/spack-trunk/environments/default/spack.yaml

以上信息表示 Spack 发现并注册了一个编译器 gcc@11.4.0. 还可以看到注册编译器的信息写入了 default 环境下的 spack.yaml 配置文件,因此只对 default 环境有效,如果切换环境需要重新注册。实际上也可以在不激活任何环境的情况下注册编译器,这样编译器的配置信息将写入 ~/.spack/ 目录下并对所有环境生效。

注册编译器之后再次运行 spack compiler list 则得到以下输出:

==> Available compilers
-- gcc ubuntu22.04-x86_64 ---------------------------------------
gcc@11.4.0

使用 Spack 安装软件

Spack 安装软件包分为三步。第一步将要安装的软件包添加到当前环境的 spec 中,第二步。这里使用 figlet 来举例:

spack add figlet
spack install
注意

spack add 是把包“加入环境配置”,spack install 才是真正安装

输出信息:


==> Concretized 1 spec
- uqto4ln figlet@2.2.5 build_system=makefile platform=linux os=ubuntu22.04 target=sapphirerapids %c=gcc@11.4.0
[+] ko5hzr4 ^compiler-wrapper@1.0 build_system=generic platform=linux os=ubuntu22.04 target=sapphirerapids
[e] fquvhtl ^gcc@11.4.0~binutils+bootstrap~graphite~nvptx~piclibs~profiled~strip build_system=autotools build_type=RelWithDebInfo languages:='c,c++,fortran' platform=linux os=ubuntu22.04 target=sapphirerapids
[+] oyvxc3b ^gcc-runtime@11.4.0 build_system=generic platform=linux os=ubuntu22.04 target=sapphirerapids
[e] httx6fh ^glibc@2.35 build_system=autotools platform=linux os=ubuntu22.04 target=sapphirerapids
[+] ii4mqh7 ^gmake@4.4.1~guile build_system=generic platform=linux os=ubuntu22.04 target=sapphirerapids %c=gcc@11.4.0

[+] /root/spack/opt/spack/linux-sapphirerapids/compiler-wrapper-1.0-ko5hzr4ee5def7f72xwh5cs5hgntfnr4
[+] /usr (external gcc-11.4.0-fquvhtl4ahvuiqobnwi5nbqrtzfgs67x)
[+] /usr (external glibc-2.35-httx6fh4xxexl3ubqwapbcpouftvsuwl)

[+] /root/spack/opt/spack/linux-sapphirerapids/gcc-runtime-11.4.0-oyvxc3bkvqxmjm2arfqyp6l5l6s4sqnl
[+] /root/spack/opt/spack/linux-sapphirerapids/gmake-4.4.1-ii4mqh7w5ygp6odoabod7mgzr257e27m
==> No binary for figlet-2.2.5-uqto4ln5k633s7mbm56otmv5zpmpiy3d found: installing from source
==> Installing figlet-2.2.5-uqto4ln5k633s7mbm56otmv5zpmpiy3d [6/6]
==> Using cached archive: /root/spack/var/spack/cache/_source-cache/archive/4d/4d366c4a618ecdd6fdb81cde90edc54dbff9764efb635b3be47a929473f13930.tar.gz
==> No patches needed for figlet
==> figlet: Executing phase: 'edit'
==> figlet: Executing phase: 'build'
==> figlet: Executing phase: 'install'
==> figlet: Successfully installed figlet-2.2.5-uqto4ln5k633s7mbm56otmv5zpmpiy3d
Stage: 0.01s. Edit: 0.00s. Build: 0.32s. Install: 0.01s. Post-install: 0.02s. Total: 0.40s
[+] /root/spack/opt/spack/linux-sapphirerapids/figlet-2.2.5-uqto4ln5k633s7mbm56otmv5zpmpiy3d
==> Updating view at /root/spack/var/spack/environments/default/.spack-env/view

则代表已经安装完成。 可以使用一下指令验证:

figlet "Hello Spack"  

如果出现以下信息,则代表安装成功:

root@model2:~/spack# figlet "Hello Spack"
_ _ _ _ ____ _
| | | | ___| | | ___ / ___| _ __ __ _ ___| | __
| |_| |/ _ \ | |/ _ \ \___ \| '_ \ / _` |/ __| |/ /
| _ | __/ | | (_) | ___) | |_) | (_| | (__| <
|_| |_|\___|_|_|\___/ |____/| .__/ \__,_|\___|_|\_\
|_|

用以下命令可以查看当前环境的 spec 以及安装的软件等:

spack find

示例输出如下:

==> In environment default
==> 1 root specs
-- no arch / no compilers ---------------------------------------
[+] figlet

-- linux-ubuntu22.04-sapphirerapids / %c=gcc@11.4.0 -------------
figlet@2.2.5 gmake@4.4.1

-- linux-ubuntu22.04-sapphirerapids / no compilers --------------
compiler-wrapper@1.0 gcc@11.4.0 gcc-runtime@11.4.0 glibc@2.35
==> 6 installed packages
==> 0 concretized packages to be installed (show with `spack find -c`)

可以看到 spec 中的软件已经安装完毕,所有依赖的软件包也一并装上了。

有些软件在整个安装过程结束后,由于有了更新的版本并且不被依赖,可以移除。用以下命令进行垃圾回收:

spack gc -y