跳过正文
Spack 管理 HPC 软件栈笔记

Spack 管理 HPC 软件栈笔记

Ridiculous
作者
Ridiculous
Love is the greatest magic in the world.

这篇整理 Spack 的安装、升级、权限管理和常用 HPC 软件安装方法。适合在共享 NFS 目录中统一管理集群软件栈。

安装 Spack
#

git clone https://github.com/spack/spack.git
cd spack
git checkout releases/v0.16

不建议直接使用默认开发分支。生产环境更适合固定到某个 release。

一般安装在共享目录,例如:

/opt/spack
/home/apps/spack

加载环境:

source /path/to/spack/share/spack/setup-env.sh

常用命令
#

加载软件:

spack load name@version
spack load /hash

卸载当前 shell 中加载的软件:

spack unload name@version
spack unload /hash
spack unload

卸载已安装软件:

spack uninstall name@version

搜索软件:

spack find xxx
spack find --loaded

查看软件选项:

spack info xxx

查看依赖解析:

spack spec <spec_string>

安装:

spack install <spec_string>
spack install -j 32 <spec_string>

安装编译器后,让 Spack 重新发现:

spack compiler find --scope site

搜索系统已有依赖:

spack external find --scope site

升级 Spack
#

git fetch
git reset --hard v0.x.y

升级后退出当前 shell,重新加载 Spack。

权限管理
#

Spack 适合使用专门账户管理,避免不同管理员账户写入权限混乱。

sudo mkdir -p /home/spack_new
useradd spack_new -s /bin/zsh -d /home/spack_new
chown -R spack_new:spack_new <path-to-spack>

Spack 运行还依赖用户目录下的 ~/.spack,所以共享环境中应明确谁负责维护。

load 时补充头文件和库路径
#

Spack 早期会自动设置部分头文件和库路径;后续版本移除了默认行为。如果希望 spack load 添加 C_INCLUDE_PATHLD_LIBRARY_PATH 等,可以添加:

$SPACK_HOME/etc/spack/modules.yaml

内容:

modules:
  prefix_inspections:
    ./include:
      - C_INCLUDE_PATH
      - CPLUS_INCLUDE_PATH
      - INCLUDE
    ./lib:
      - LIBRARY_PATH
      - LD_LIBRARY_PATH
    ./lib64:
      - LIBRARY_PATH
      - LD_LIBRARY_PATH

CUDA
#

安装:

spack install cuda@<version>%gcc@<version>

注意 CUDA 和 GCC 的兼容矩阵。版本不匹配时,nvcc 可能无法编译程序。

常见约束:

  • CUDA 10.2.89 最高兼容到 GCC 8。
  • CUDA 11.0 兼容到 GCC 9。
  • CUDA 11.1 对 GCC 10/11 可能有限制。

CUDA 包主要是 binary,一个版本通常只需要安装一次。如果其他软件编译器版本不同,但确认运行兼容,可以用 hash 强制指定:

spack install <package> ^cuda/<hash>

UCX
#

UCX 是 MPI 的重要依赖。系统自带 UCX 不一定带 CUDA 支持,HPC/GPU 场景通常需要手动安装。

查看参数:

spack spec ucx
spack info ucx

安装示例:

spack install ucx@1.14.1 +cuda+cma+dc+dm+gdrcopy+ib_hw_tm+mlx5_dv+rc+ud+rdmacm+verbs+thread_multiple

检查:

ucx_info -v
ucx_info -d | grep mlx
ucx_info -b

重点确认:

  • --with-cuda
  • --with-gdrcopy
  • --enable-mt
  • IB 设备是否被识别

OpenMPI
#

为了使用 IB,OpenMPI 应使用 UCX 作为底层通信实现。

CUDA-aware MPI 示例:

spack install openmpi@<version> +cuda fabrics=ucx ^ucx/<hash> ^cuda/<hash>

非 CUDA-aware MPI:

spack install openmpi@<version> fabrics=ucx ^ucx/<hash>

如果需要 gdrcopy

spack install openmpi@<version> +cuda fabrics=ucx ^ucx +cuda +gdrcopy

注意:

  • OpenMPI 3 之后默认启用 thread_multiple,不要强行加老版本 flag。
  • UCX 也要选择 +cuda 版本。
  • gdrcopy 内核模块和开发库需要在所有机器上安装。

检查 OpenMPI:

ompi_info --parsable | grep cuda
ompi_info --parsable | grep ucx

OSU 测试:

spack install osu-micro-benchmarks ^openmpi/<hash>
$(which mpirun) -host i1:1,i2:1 $(which osu_bw)

带宽应接近 IB 理论值。

Slurm 外部依赖
#

如果系统已经安装 Slurm,可以加入 packages.yml

packages:
  slurm:
    externals:
      - spec: slurm@20-11-8
        prefix: /usr

安装 OpenMPI 时添加:

spack install openmpi +pmi +legacylaunchers schedulers=slurm

Intel 系列
#

传统 Intel 套件需要 License:

/opt/intel/licenses

常见安装:

spack install intel@<version>
spack install intel-mpi@<version>%intel@<version>
spack install intel-mkl@<version>%intel@<version>
spack install intel-parallel-studio@cluster.<version> +vtune +advisor

oneAPI:

spack install intel-oneapi-compilers@<version>

Singularity
#

Spack 中的 Singularity 版本可能偏旧,集群上更推荐手动安装新版本,或者根据系统发行版使用 Apptainer。