Date Modified Tags spack

Spack 是一个跨平台的包管理器,可以用来安装和编译不同版本的软件,使得他们不与系统环境冲突并且多个版本可以共存。

1. 下载和安装

spack无需安装,下载完成后,直接调用/spack/bin/下的可执行文件即可。

git clone https://github.com/spack/spack.git
export SPACK_ROOT=/path/to/spack
export PATH=${SPACK_ROOT}/bin:${PATH}
source ${SPACK_ROOT}/share/spack/setup-env.sh

2. 常用的命令

官方的get started比较详细,而且手册也很全面。这里仅简单记录几种我常用的命令。

2.1 添加外部compiler

# 列出当前所有添加到spack里的compiler
spack compilers 
# 自动检测系统环境中可以用的compiler并添加进来
# An alias for spack compiler find
spack compiler add
# 添加特定路径的compilerspackspack compiler find /home/test/opt/gcc10.0

2.2 安装软件

https://spack.readthedocs.io/en/latest/package_list.html

这个页面显示了当前spack维护的所有软件及其版本。(不是所有的软件版本都在支持列表中)

# 新版本的spack需要先add到环境中
spack add gcc@9.4.0
spack install
spack add zlib@1.1.0%gcc@9.0.1 target=icelake
spack install -j 12

如果不加@9.4.0,将默认安装master版本。

-j 12跟make的一致,表示12个thread来执行。

注意观察安装过程中出现的错误。最后软件安装的位置在类似:

/home/test/spack/opt/spack/linux-ubuntu18.04-zen/gcc-7.5.0/gcc-9.4.0-XXXX
你的spck路径/opt/spack/你的操作系统和cpu架构/编译使用的compiler/安装的软件包

安装完成后可以通过spack load [email protected]来加载gcc8.4.0。

spack find -l 可以列出包的hash,spack load /hash可以指定想要加载的包,在装了多个相同软件(不同的vairants)时很有用。

2.3 虚拟环境

spack支持类似python的virtualenv的功能,可以通过创建虚拟环境来将自己安装的软件隔离开。

spack env create myenv
# 如果之前创建过,可以直接activate
spack env activate myenv
# 如果已经在默认的spack环境中安装过,这里将只是在当前的myenv里注册一下
spack install [email protected]
# 或者使用load加载特定的已经安装的包到当前的虚拟环境中,这样下次激活这个环境,将默认加载这些包
spack load [email protected]  arch=$(spack arch)
# 取消虚拟环境
despacktivate

如果上述环境不生效,可以和module配合来改变环境变量。

如果有多个相同的包,除了hash code不同,可以通过spack load /hash_code来load特定的包。如果是在集群上,可以在login node安装所有集群包括的架构的包,然后在compute node上使用arch=$(spack arch)来load特定架构的包。

3. Tips

Curl

由于spack需要用curl从软件的官网或者mirror下载源码,而有些站点仅支持https或者自动转发请求为https请求,所以要求curl必须支持https协议。在部分发行版上(比如centos7),默认的curl可能不支持https,导致安装软件的过程出现curl的错误。可以通过curl --version查看curl支持的协议。如果不支持https,那么需要自己手动编译下curl。

curl官网

cd /home/test/opt/Downloads/curl/
mkdir build && cd build
../configure --with-ssl 
make 
export PATH/home/test/opt/Downloads/curl/bin/:$PATH

hash校验

可能由于网络问题,极少情况会出现下载的源码包校验出错的问题。在spack的源码中,对每个源码包都有固定的hash值。一个临时解决方案是顺着错误提示,找到对应的spack源码,修改下载的包的hash值。spack目录下的var/cache/里存储了下载的源码包。

默认的compiler

目前好像不支持在interactive模式下的灵活修改

https://github.com/spack/spack/issues/8635

指定spack使用系统的一些包

通过修改~/.spack/packages.yaml文件,可以指定spack使用系统的一些包,比如python,gcc等。

packages:
  openmpi:
    buildable: False
    externals:
    - spec: "[email protected]"
      prefix: /usr/

buildable:False意思是凡是用到这个包的,都用外部版本,而不是从源码编译。

Reference

https://spack.readthedocs.io/en/latest/environments.html

https://spack.readthedocs.io/en/latest/basic_usage.html

https://askubuntu.com/questions/821186/protocol-https-not-supported-or-disabled-in-libcurl

https://spack.readthedocs.io/en/latest/build_settings.html


文章版权归 FindHao 所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明作者 FindHao 和本文原始地址:
https://findhao.net/academic/2571.html

Comments