Spack使用手册
一、部署spack
下载
1. release(推荐)
github下载最新的release:https://github.com/spack/spack/releases
2. git
git clone https://github.com/spack/spack.git ~/spack
cd ~/spack
git checkout releases/v0.17
✨tips: github 国内下载慢,百度 github镜像加速站 或 油猴脚本 - github 高速下载
2.激活
对于超算/lab/hpc等多用户场景,建议将spack本地放在
全局/共享目录
下单个普通用户建议放在
~/.spack/
或/opt
下
解压下载好的压缩包, 加载环境变量(根据具体情况变更路径):
source spack/share/spack/setup-env.sh
可以将此命令写在~/.bashrc
或 /etc/profile
中 , 打开终端自动生效
3.配置
spack 的用户配置文件均在 ~/.spack
下,首次使用 spack 可能没有此目录,使用 3.2 会自动创建
3.1 基本配置
$ spack config get config > ~/.spack/config.yaml
$ spack config get config
config:
install_tree:
root: $spack/opt/spack
projections:
all: ${ARCHITECTURE}/${COMPILERNAME}-${COMPILERVER}/${PACKAGE}-${VERSION}-${HASH}
template_dirs:
- $spack/share/spack/templates
build_stage:
- $tempdir/$user/spack-stage
- $user_cache_path/stage
test_stage: $user_cache_path/test
source_cache: $spack/var/spack/cache
misc_cache: $user_cache_path/cache
connect_timeout: 10
verify_ssl: true
suppress_gpg_warnings: false
install_missing_compilers: false
checksum: true
deprecated: false
dirty: false
build_language: C
locks: true
url_fetch_method: urllib
ccache: false
concretizer: clingo
db_lock_timeout: 3
package_lock_timeout: null
shared_linking: rpath
allow_sgid: true
terminal_title: false
debug: false
build_jobs: 16
解析:
install_tree
中root
为当前用户 软件安装的路径 ,projections
为软件路径的命名规范verify_ssl
在install
时会校验url的ssl证书,离线环境可以选择关闭(值为fasle
)locks
锁机制: 默认开启,同一用户分别安装相同的软件,只允许有一个进程执行,执行完后,另一个进程将跳过该软件安装;关闭的话,可能制造重复安装,但在某些文件系统的特殊权限限制下,需要关闭,否则会报奇怪的读写错误build_job
安装时默认使用的最大cpu核心数checksum
校验源码包的hash
值
3.2 编译器
使用spack compiler find
将会自动查找本机的所有编译器,生成配置文件~/.spack/linux/compilers.yaml
spack compilers
查看添加到配置文件中的编译器
$ spack compilers
==> Available compilers
-- clang centos7-x86_64 -----------------------------------------
[email protected] [email protected]
-- gcc centos7-x86_64 -------------------------------------------
[email protected] [email protected] [email protected] [email protected] [email protected] [email protected]
-- intel centos7-x86_64 -----------------------------------------
[email protected] [email protected]
-- oneapi centos7-x86_64 ----------------------------------------
[email protected]
3.3 源码镜像仓库
3.3.1 自建源码镜像仓库
$ spack mirror create -d <PATH> --all
一个标准的源码镜像仓库符合以下目录规范:
mirror/
cmake/
cmake-2.8.10.2.tar.gz
dyninst/
dyninst-8.1.1.tgz
dyninst-8.1.2.tgz
libdwarf/
libdwarf-20130126.tar.gz
libdwarf-20130207.tar.gz
libdwarf-20130729.tar.gz
libelf/
libelf-0.8.12.tar.gz
libelf-0.8.13.tar.gz
libunwind/
libunwind-1.1.tar.gz
mpich/
mpich-3.0.4.tar.gz
mvapich2/
mvapich2-1.9.tgz
3.4.2 添加私有源码镜像仓库
$ spack mirror add <scope> <path>
生成配置文件~/.spack/linux/mirrors.yaml
例如 添加 一个 在/opt/mirror
下的源码镜像仓库,给它取名为haha:
spack mirror add haha /opt/mirror
3.4.3 查看已添加的源码镜像仓库
$ spack mirror list
spack-public https://mirror.spack.io
默认使用 位于美国亚马逊云的 spack公共仓库 https://mirror.spack.io ,在国内获取 源码/索引 的速度可能会很慢
3.4 脚本源
查看当前使用的脚本源
$ spack repo list
==> 1 package repository.
builtin /root/spack/var/spack/repos/builtin
默认使用spack官方的脚本源
3.4.1 添加私有脚本源
一个标准的spack脚本源符合如下的路径规范:
$ tree -L /root/spack/var/spack/repos/yeesuan
/root/spack/var/spack/repos/yeesuan
├── packages
│ ├── gromacs
│ │ ├── package.py
│ │ └── __pycache__
└── repo.yaml
其中 repo.yaml
定义了该脚本源的命名空间
:
repo:
namespace: 'yeesuan'
添加该脚本源:
$ spack repo add /root/spack/var/spack/repos/yeesuan
3.5 modules
$ spack config get modules > ~/.spack/modules
$ spack config get modules
modules:
prefix_inspections:
lib:
- LD_LIBRARY_PATH
lib64:
- LD_LIBRARY_PATH
bin:
- PATH
man:
- MANPATH
share/man:
- MANPATH
share/aclocal:
- ACLOCAL_PATH
lib/pkgconfig:
- PKG_CONFIG_PATH
lib64/pkgconfig:
- PKG_CONFIG_PATH
share/pkgconfig:
- PKG_CONFIG_PATH
? ''
: - CMAKE_PREFIX_PATH
# These are configurations for the module set named "default"
default:
# roots:
# tcl: $spack/share/spack/modules
# lmod: $spack/share/spack/lmod
enable:
- tcl
# Default configurations if lmod is enabled
lmod:
hierarchy:
- mpi
prefix_inspections
:定义了声明的环境变量和路径的对应关系
其中defalut
中roots
的tcl /lmod
定义了 安装软件后,modules 文件的安装位置
其他,待补充
3.6 自定义packages
spack external find
可以添加系统中的软件,为spack 管理 (超算环境不推荐)
$ spack external find
==> The following specs have been detected on this system and added to /root/.spack/packages.yaml
[email protected] [email protected] [email protected] [email protected] [email protected]
[email protected] [email protected] [email protected] [email protected] [email protected]
[email protected] [email protected] [email protected] [email protected] [email protected]
[email protected] [email protected] [email protected] [email protected] [email protected]
[email protected] [email protected] [email protected] [email protected]
[email protected] [email protected] [email protected] [email protected]
这是我们自定义添加的两块软件:
packages:
cmake:
externals:
- spec: [email protected]
prefix: /yeesuan/linux-centos7-haswell/gcc-4.8.5/cmake-3.21.4-4q7yowzqqc6x36tsxd2bsgeenwci6iqt
util-linux-uuid:
externals:
- spec: [email protected]
prefix: /yeesuan/linux-centos7-haswell/gcc-4.8.5/util-linux-uuid-2.36.2-psepywix72fmt453hwcmrepmqslrai3a
可以按照上述规范添加自己的软件
二、基本使用
1.spack中有什么?
基础命令:spack list
默认返回所有支持spack安装
的软件:
$ spack list
==> 5969 packages.
3dtk intel-oneapi-inspector pexsi py-pygeos r-parallelmap
3proxy intel-oneapi-ipp pfapack py-pygetwindow r-param helpers
支持通配符
查找:
$ spack list *blas*
==> 18 packages.
blaspp blast-legacy cblas hipblas ncbi-magicblast openblas
blasr blast-plus flexiblas libblastrampoline ncbi-rmblastn rocblas
blasr-libcpp blast2go graphblast liblas netlib-xblas samblaster
查找描述
里包含某个关键词:
$ spack list -d physics
==> 46 packages.
albany cradl flecsph herwig3 n2p2 py-openmc sombrero
alps damask freefem herwigpp openmc py-uproot3-methods thepeg
amp datatransferkit geant4 jali pennant pythia6 trilinos
ascent delphes genfit libsakura podio pythia8 yambo
axom exciting hepmc lorene portage r-qvalue
clhep fastjet hepmc3 mcutils precice recola
cp2k flecsi heputils minuit py-espresso rivet
2.查看软件详细信息
基础命令:spack info <package_name>
$ spack info vasp
MakefilePackage: vasp
Description:
The Vienna Ab initio Simulation Package (VASP) is a computer program
for atomic scale materials modelling, e.g. electronic structure
calculations and quantum-mechanical molecular dynamics, from first
principles.
Homepage: https://vasp.at
Externally Detectable:
False
Tags:
None
Preferred version:
6.1.1 file:///root/vasp.6.1.1.tgz
Safe versions:
6.1.1 file:///root/vasp.6.1.1.tgz
5.4.4.pl2 file:///root/vasp.5.4.4.pl2.tgz
5.4.4 file:///root/vasp.5.4.4.tgz
Deprecated versions:
None
Variants:
Name [Default] When Allowed values Description
=============== ==== =============== ====================================
cuda [off] -- on, off Enables running on Nvidia GPUs
scalapack [off] -- on, off Enables build with SCALAPACK
vaspsol [off] -- on, off Enable VASPsol implicit solvation model
https://github.com/henniggroup/VASPsol
Installation Phases:
edit build install
Build Dependencies:
blas cuda fftw lapack mpi netlib-scalapack qd rsync
Link Dependencies:
blas cuda fftw lapack mpi netlib-scalapack qd
Run Dependencies:
mpi
Virtual Packages:
None
解析
1.MakefilePackage
表示vasp用make
构建
其他的,像gromacs 是`CMakePackage`,表示用`cmake`构建,
fftw 是 `Autotools`, 流程中需要先`configure`再`make`
✨tips: 更为详细的请阅读spack官方中关于构建系统的介绍(有流程图):
2.Description
: 软件的介绍
3.Homepage
:软件官网
4.Preferred version
是推荐版本,Safe versions
是安全的(经过充分验证的)版本
其中,左侧列是`版本号`,右侧列是`软件的URL地址`
spack默认使用 系统命令 `curl` "下载"软件 ,curl支持的协议有 https/http/file/.... ,上面例子表示默认使用当前路径下的源码包
5.Variants
我翻译为“特性”
第一列为特性的名字,第二列为特性的条件,第三列为特性的值
其中,第一列,变量名后的中括号内,是`默认`的变量值
6.Installation Phases
表示了该软件安装时的三个步骤
7.Build Dependencies
表示了构建前需要加载的环境
8.Link Dependencies
表示了构建时用到的链接库
9.Run Dependencies
表示了在使用软件时,需要加载的环境
3.安装软件
基础命令:spack install <package_name>
$ spack install zlib
==> Bootstrapping clingo from pre-built binaries
==> Installing zlib-1.2.11-3rlgy7ycxtoho44una6o3itgfjltkmpd
==> No binary for zlib-1.2.11-3rlgy7ycxtoho44una6o3itgfjltkmpd found: installing from source
==> Fetching https://mirror.spack.io/_source-cache/archive/c3/c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1.tar.gz
==> No patches needed for zlib
==> zlib: Executing phase: 'install'
==> zlib: Successfully installed zlib-1.2.11-3rlgy7ycxtoho44una6o3itgfjltkmpd
Fetch: 1.06s. Build: 3.09s. Total: 4.15s.
[+] /home/spack/spack/opt/spack/linux-ubuntu18.04-x86_64/gcc-7.5.0/zlib-1.2.11-3rlgy7ycxtoho44una6o3itgfjltkmpd
进阶-高度自定义的安装命令
3.1 指定编译器
编译器需要搭配 百分号 “%”,只能跟在软件名后面
例如使用gcc编译器:
spack install zlib%gcc
软件名和编译器之间允许有多个空格,所以也可以写成这样:
spack install zlib %gcc
一般地,我们的系统中存在多个版本的gcc编译器,所以需要指定使用哪一个版本的编译器:
spack install zlib %[email protected]
需要说明的是,这里的编译器 名称,可能不会和 spack list
中一一对应,
例如,英特尔oneapi的编译器,list表里的名称为 intel-oneapi-compilers
, 但spack compilers
里则是intel
3.4 指定依赖
以2.1为例,vasp的依赖,其中的blas、lapack、netlib-scalapack
这三个数学库在英特尔的mkl库中均有实现,
所以安装vasp时可以指定使用mkl,搭配 “^”
spack install vasp ^intel-mkl
2020之后的mkl库的包名发生了变化,我们指定适合用2021.4.0版本的
spack install vasp ^[email protected]
我们的cc编译器也想用intel的icc, 版本号和mkl相同
spack install vasp %[email protected] ^[email protected]
3.4 特性
仍以2.1为例,官方提供的vasp有一个叫vaspsol
的特性,它是vasp的一个扩展包,默认关闭状态,如果想开启此特性,需要搭配“+”使用
spack install vasp +vaspsol
mpich的特性pmi
的值有多个,默认为mpi
pmi [pmi] -- off, pmi, pmi2, pmix PMI interface.
我们想全都使用,则使用“=”表达,以英文小写逗号“,”分隔不同的值
spack install mpich mpi=pmi,pmi2,pmix
mpich的特性fortran
的值默认时开启状态,我们不想使用它,搭配波浪线
spack install mpich ~fortran
3.5 多线程
构建时可以指定使用的最大cpu核心数,在install后面 加入 -j 参数, 后接核心数
spack install -j 64 vasp
✨tips: 可以通过系统命令
nproc
查询到最大核心数 ,也可以写成变量的形式
综合
以安装gcc6.5.0为例,使用系统自带的gcc4.8.5编译,需要开启几乎全部的特性,其中的go使用1.16版本
spack install -j 64 -y [email protected] %[email protected] +binutils+bootstrap+piclibs+strip languages=ada,c,c++,fortran,go,java,jit,lto,objc,obj-c++ ^[email protected]
✨tips: 其中的 “-y”可以默认选择一些软件的提示性的编译选项或其他选项
3.6 卸载软件
基础命令: spakc uninstall <package_name>
$ spack uninstall autoconf
==> Error: autoconf matches multiple packages:
-- linux-centos7-cascadelake / [email protected] -----------------------
kwq2zrg [email protected]
-- linux-centos7-skylake_avx512 / [email protected] ---------------------
2vv3qa2 [email protected]
==> Error: You can either:
a) use a more specific spec, or
b) specify the spec by its hash (e.g. `spack uninstall /hash`), or
c) use `spack uninstall --all` to uninstall ALL matching specs.
像上面,卸载报错,我们可以指定编译器:
spack uninstall autoconf %[email protected]
方便地,使用其hash
值:
spack uninstall /2vv3qa2
默认卸载全部autoconf:
spack uninstall --all autoconf
有时候,卸载该软件也需要卸载其依赖:
spack uninstall -d <package_name>
4.查找已安装的软件
基础命令:spack find
$ spack find
==> 805 installed packages
-- linux-centos7-cascadelake / [email protected] -----------------------
[email protected] [email protected] [email protected]
[email protected] [email protected] [email protected]
[email protected] [email protected] [email protected]
-- linux-centos7-cascadelake / [email protected] -----------------
[email protected] [email protected] [email protected]
[email protected] [email protected] [email protected]
...
4.1 指定包名
$ spack find vasp
==> 2 installed packages
-- linux-centos7-cascadelake / [email protected] -----------------
[email protected]
-- linux-centos7-cascadelake / [email protected] -------------------
[email protected]
4.2 指定编译器
$ spack find vasp %[email protected]
==> 1 installed package
-- linux-centos7-cascadelake / [email protected] -------------------
[email protected]
4.3 指定版本号
$ spack find [email protected]
==> 1 installed package
-- linux-centos7-cascadelake / [email protected] -----------------
[email protected]
4.4 查看软件的特征值
$ spack find -l openmpi
==> 2 installed packages
-- linux-centos7-haswell / [email protected] ----------------------------
pt2putc [email protected]
-- linux-centos7-skylake_avx512 / [email protected] ---------------------
tchnk2v [email protected]
✨tips: 1.spack支持使用
/<hash_value>
的方式替代<package_name>
,hash_vaule
支持长写(完整 )和短写(前面3到7个字符) 2.可以使用 -L 查看完整的特征值
4.5 查看软件的特征值和依赖
$ spack find -l -d openmpi
==> 2 installed packages
-- linux-centos7-haswell / [email protected] ----------------------------
pt2putc [email protected]
y5iroad [email protected]
bmzkyfq [email protected]
xkbs7ll [email protected]
rpsecj5 [email protected]
e6cbjcd [email protected]
z6uqlxn [email protected]
ez4gk67 [email protected]
owe3cjs [email protected]
jwr4s44 [email protected]
2hfxs5z [email protected]
tjk74sh [email protected]
ugfkpjd [email protected]
4.6 查看软件的路径
spack find -p openmpi
==> 2 installed packages
-- linux-centos7-haswell / [email protected] ----------------------------
[email protected] /yeesuan495/.spack/software/linux-centos7-haswell/gcc-4.8.5/openmpi-4.1.1-pt2putcrv2o53naxpesk3rsb4xl44pqa
-- linux-centos7-skylake_avx512 / [email protected] ---------------------
[email protected] /yeesuan495/.spack/software/linux-centos7-skylake_avx512/gcc-6.5.0/openmpi-4.1.1-tchnk2vf4iskpfkh7giwurtmyipwmjma
4.6.1 location (建议用find -p)
location 命令也可以定位软件的路径
$ spack location -i openmpi%[email protected]
/yeesuan495/.spack/software/linux-centos7-haswell/gcc-4.8.5/openmpi-4.1.1-pt2putcrv2o53naxpesk3rsb4xl44pqa
4.6.2 cd 进入软件根目录
$ spack cd -i openmpi%[email protected]
[yxxxx@xxxx openmpi-4.1.1-pt2putcrv2o53naxpesk3rsb4xl44pqa]$
4.7 查看软件的命名空间
$ spack find -N mpich
==> 1 installed package
-- linux-centos7-skylake_avx512 / [email protected] ---------------------
[email protected]
$ spack find -N xz
==> 3 installed packages
-- linux-centos7-cascadelake / [email protected] -----------------------
[email protected]
...
5.使用软件
基础命令:
加载软件环境变量 spack load <package_name>
卸载软件环境变量 spack unload <package_name>
5.1 查看已加载的依赖
$ spack find --loaded
==> 4 loaded packages
-- linux-centos7-cascadelake / [email protected] -------------------
[email protected] [email protected]
[email protected] [email protected]
5.2 仅加载软件本身或它的依赖
仅软件本身:
spack load --only package <package_name>
仅依赖:
spack load --only dependencies <package_name>
5.3 查看加载软件的所有环境变量
spack load --sh <package_name>
5.4 指定参数加载环境变量
-
指定版本号
spack load <package_name>@<package_version>
-
指定编译器
spack load <package_name> %<compiler_name>@<compiler_version>
-
指定用到的依赖/特性
spack load <package_name> ^<dependency_name>
-
指定命名空间
spack load <scope>.<package_name>
上述加载方式都可以组合使用
-
使用hash值 :
spack load /<hash_value>
✨tips: 有时候我们查到的软件版本号和编译器甚至命名空间都一样,它将很难区分
通常,使用`spack find -l -d <package_name>` 可以打印多个“相同”的软件的依赖详情,我们选择其中一个的hash值加载