Way to the science

Spack基础使用说明

Spack:超算上最好的包管理器

气象备忘录

气象备忘录

南京信息工程大学 气象学博士

Spack是一个包管理工具,它为大型超级计算中心设计,支持各种平台和环境上的软件的多个版本和配置。

用户可在集群中安装多种版本的软件,且可以相互隔离、无特权需求,用户可在集群中安装一个软件的不同版本来使用。

更重要的是,它可以在没有网络的情况下,一键解析依赖,并安装库。通常情况下,这些库的编译都是很复杂的,但spack却可以轻松地解决这些编译上的问题。

注:本文大量参考了spack官方文档内容,并在一些地方添加了自己的注释与理解。希望这篇文章能对所有超算用户有所帮助。

1. 安装Spack

Spack安装十分简单,您可以在github上,将spack仓库克隆到本地,然后将spack环境变量导入现有窗口中。

1.1 下载Spack包管理器文件

cd ~  # 也可以打开到任何你想把spack安装到的目录
git clone https://github.com/spack/spack.git

1.2 导入Spack环境

# 注意,前面的点号不要忘了输入
$ . spack/share/spack/setup-env.sh

您也可以将Spack环境放入.bashrc中,这样在每次加载shell时可默认加载spack环境。

echo "source /opt/spack/share/spack/setup-env.sh" >> ~/.bashrc
source ~/.bashrc 

1.3 检查安装情况

当完成安装和导入spack的步骤后,您可以试着使用一些spack命令,来测试功能是否正常执行,从而判断spack是否正确安装。 本次测试使用spec模块来做测试。spec可用于查询安装此软件包需要的依赖项。 下列命令为使用现有gcc版本为7.5.0的编译器来编译gcc-10.2.0版本,如可以出现下面类似输出,则说明spack环境搭建完成。

$ spack spec gcc@10.2.0%gcc@7.5.0
Input spec
--------------------------------
gcc@10.2.0%gcc@7.5.0

Concretized
--------------------------------
gcc@10.2.0%gcc@7.5.0~binutils~bootstrap~nvptx~piclibs~strip languages=c,c++,fortran patches=2c18531a23623596e1daf6f0dd963cf72c208945ecad90515640c3ab23991159 arch=linux-ubuntu18.04-skylake
    ^gmp@6.1.2%gcc@7.5.0 arch=linux-ubuntu18.04-skylake
        ^autoconf@2.69%gcc@7.5.0 arch=linux-ubuntu18.04-skylake
            ^m4@1.4.18%gcc@7.5.0+sigsegv patches=3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00,fc9b61654a3ba1a8d6cd78ce087e7c96366c290bc8d2c299f09828d793b853c8 arch=linux-ubuntu18.04-skylake
                ^libsigsegv@2.12%gcc@7.5.0 arch=linux-ubuntu18.04-skylake
            ^perl@5.30.3%gcc@7.5.0+cpanm+shared+threads arch=linux-ubuntu18.04-skylake
                ^berkeley-db@18.1.40%gcc@7.5.0 arch=linux-ubuntu18.04-skylake
                ^gdbm@1.18.1%gcc@7.5.0 arch=linux-ubuntu18.04-skylake
                    ^readline@8.0%gcc@7.5.0 arch=linux-ubuntu18.04-skylake
                        ^ncurses@6.2%gcc@7.5.0~symlinks+termlib arch=linux-ubuntu18.04-skylake
                            ^pkgconf@1.7.3%gcc@7.5.0 arch=linux-ubuntu18.04-skylake
        ^automake@1.16.2%gcc@7.5.0 arch=linux-ubuntu18.04-skylake
        ^libtool@2.4.6%gcc@7.5.0 arch=linux-ubuntu18.04-skylake
    ^isl@0.21%gcc@7.5.0 arch=linux-ubuntu18.04-skylake
    ^mpc@1.1.0%gcc@7.5.0 arch=linux-ubuntu18.04-skylake
        ^mpfr@4.0.2%gcc@7.5.0 patches=3f80b836948aa96f8d1cb9cc7f3f55973f19285482a96f9a4e1623d460bcccf0 arch=linux-ubuntu18.04-skylake
            ^autoconf-archive@2019.01.06%gcc@7.5.0 arch=linux-ubuntu18.04-skylake
    ^zlib@1.2.11%gcc@7.5.0+optimize+pic+shared arch=linux-ubuntu18.04-skylake
    ^zstd@1.4.5%gcc@7.5.0+pic arch=linux-ubuntu18.04-skylake

1.4 编译器配置

默认情况下,spack在第一次加载环境时会自动发现当前可用的编译器

1.4.1 spack compilers

您可以通过运行spack compilers 或者 spack compiler list来查看spack在你的超算上所能够发现的所有编译器。

$ spack compilers                                               
==> Available compilers
-- gcc ubuntu18.04-x86_64 ---------------------------------------
gcc@10.2.0  gcc@7.5.0  gcc@5.4.0

1.4.2 spack compiler find

您可以通过运行spack compiler find或者spack compiler add来自动发现或手动添加编译器路径。

# 这里假设了你的超算使用了module环境管理工具
# 这一步把管理员安装的hpc_sdk套件导入了你的环境
$ module load hpc_sdk 
# 于是,你就可以自动找到了新增的nvhpc编译器
$ spack compiler find
==> Added 1 new compiler to /home/nfs/admin0/user/.spack/linux/compilers.yaml
    nvhpc@20.9
==> Compilers are defined in the following files:
    /home/nfs/admin0/user/.spack/linux/compilers.yaml

1.4.3 spack compiler info

如果你想查看详细的编译器信息,您可以使用如下命令。

$ spack compiler info nvhpc                                                        
             
nvhpc@20.9:
        paths:
                cc = /home/nfs/admin0/apps/hpc_sdk/Linux_x86_64/20.9/compilers/bin/nvc
                cxx = /home/nfs/admin0/apps/hpc_sdk/Linux_x86_64/20.9/compilers/bin/nvc++
                f77 = /home/nfs/admin0/apps/hpc_sdk/Linux_x86_64/20.9/compilers/bin/nvfortran
                fc = /home/nfs/admin0/apps/hpc_sdk/Linux_x86_64/20.9/compilers/bin/nvfortran
        modules  = []
        operating system  = ubuntu18.04

如果有多个版本的软件包,您可以在软件包名称后添加@,例如spack compiler info gcc@10.2.0

1.4.4 手动配置可用编译器(可选)

如果您有兴趣手动指定cc|cxx|f77|fc,您可以以如下两种方式来配置compilers.yaml

  • EDIT ~/.spack/linux/compilers.yaml # 这里的EDIT可以为任何linux上的文本编译器,如vim、emacs等
  • spack config edit compilers

编译器配置文件如下所示:

- compiler:
    spec: nvhpc@20.9
    paths:
      cc: /home/nfs/admin0/apps/hpc_sdk/Linux_x86_64/20.9/compilers/bin/nvc
      cxx: /home/nfs/admin0/apps/hpc_sdk/Linux_x86_64/20.9/compilers/bin/nvc++
      f77: /home/nfs/admin0/apps/hpc_sdk/Linux_x86_64/20.9/compilers/bin/nvfortran
      fc: /home/nfs/admin0/apps/hpc_sdk/Linux_x86_64/20.9/compilers/bin/nvfortran
    flags: {}
    operating_system: ubuntu18.04
    target: x86_64
    modules: []
    environment: {}
    extra_rpaths: []

1.4.5 指定默认编译器版本(可选)

在您安装新软件包时,spack需要使用一个编译器来编译环境,如果您对编译器版本有要求,您可以通过以下两种方式来指定编译器:

  • EDIT ~/.spack/packages.yaml
  • spack config edit packages

包配置文件如下所示:

packages:
  all:
    compiler: [gcc@10.2.0]     

2. 基础使用教程

spack有许多子命令可以使用,您需要了解一些基础 命令以便更好的使用spack来安装和使用软件

例如,我们要查找当前spack环境中安装的软件包,可以使用spack find

$ spack find                                                                                                                                                                                                    
==> 93 installed packages

-- linux-ubuntu18.04-skylake_avx512 / gcc@7.5.0 -----------------
autoconf@2.69                bzip2@1.0.8    gcc@7.5.0     gmp@6.1.2      libedit@3.1-20191231  libtool@2.4.6        lua@5.3.5                  mpc@1.1.0   ncurses@6.2     perl@5.30.3    tcl@8.6.10   zstd@1.4.5
autoconf-archive@2019.01.06  curl@7.72.0    gdbm@1.18.1   isl@0.18       libiconv@1.16         libunistring@0.9.10  lua-luafilesystem@1_7_0_2  mpc@1.1.0   openssh@8.4p1   pkgconf@1.7.3  unzip@6.0
automake@1.16.2              diffutils@3.7  gettext@0.21  isl@0.21       libidn2@2.3.0         libxml2@2.9.10       lua-luaposix@33.4.0        mpfr@3.1.6  openssl@1.1.1h  readline@8.0   xz@5.2.5
berkeley-db@18.1.40          expat@2.2.9    git@2.29.0    libbsd@0.10.0  libsigsegv@2.12       lmod@8.3             m4@1.4.18                  mpfr@4.0.2  pcre2@10.35     tar@1.32       zlib@1.2.11

2.1 列出spack可安装的软件包

当您准备安装某一个软件时,需要先确认软件包是否存在于spack软件包列表中。您可以使用spack list命令来查找可用软件,或者可以打开Package List网页来查找软件包信息。

注意!spack可安装的软件包非常多!因此这一步可能不是太快。

2.1.1 spack list

此命令可以查询spack可安装的软件包,截至2021年10月18日,目前可用软件包为5945个。

$ spack list                                                                                                                  
==> 5021 packages.                                                                                                                                                                                                 
3proxy                     icu4c                            perl-set-intervaltree                     py-pyfftw                                       r-popgenome                                                  
abduco                     id3lib                           perl-set-intspan                          py-pyfits                                       r-popvar                                                     
abi-compliance-checker     idba                             perl-set-scalar                           py-pyflakes                                     r-powerlaw                                                   
abi-dumper                 idl                              perl-soap-lite                            py-pygdal                                       r-prabclus                                                   
abinit                     iegenlib                         perl-star-fusion                          py-pygdbmi                                      r-praise                                                     
abseil-cpp                 ignite                           perl-statistics-basic                     py-pygelf                                       r-preprocesscore                                             
abyss                      igraph                           perl-statistics-descriptive               py-pygit2                                       r-prettyunits                                                
accfft                     igv                              perl-statistics-pca                       py-pyglet                                       r-processx    
......

在执行spack list命令时,由于相关库太多,在命令行上,我们会用引号隐藏一些包文件。您可以使用spack list命令来查找可用软件,或者可以打开Package List网页来查找软件包信息。

如果想寻找可安装包中的名称来匹配您想要安装的软件,可以使用*进行匹配。

*代表开始和结束的匹配,mpi意思和*mpi*相同;

下列示例为查找mpi相关的软件包

$ spack list mpi
==> 23 packages.
compiz       intel-mpi             mpi-bash  mpifileutils  mpileaks  mpir               openmpi  phylobayesmpi  py-mpi4py  rempi         sst-dumpi  vampirtrace
fujitsu-mpi  intel-mpi-benchmarks  mpich     mpilander     mpip      mpix-launch-swift  pbmpi    pnmpi          r-rmpi     spectrum-mpi  umpire

2.1.2 spack info

当您已经明确需要安装的软件包时,此时您可以使用spack info <package>来查看此软件包的更多信息。

[~] spack info openmpi                                                                                                                                                                                             
AutotoolsPackage:   openmpi                                                                                                                                                                                        

Description:                                                                                                                                                                                                       
    An open source Message Passing Interface implementation. The Open MPI                                                                                                                                          
    Project is an open source Message Passing Interface implementation that                                                                                                                                        
    is developed and maintained by a consortium of academic, research, and                                                                                                                                         
    industry partners. Open MPI is therefore able to combine the expertise,                                                                                                                                        
    technologies, and resources from all across the High Performance                                                                                                                                               
    Computing community in order to build the best MPI library available.                                                                                                                                          
    Open MPI offers advantages for system and software vendors, application                                                                                                                                        
    developers and computer science researchers.                                                                                                                                                                   

Homepage: http://www.open-mpi.org                                                                                                                                                                                  

Maintainers: @hppritcha                                                                                                                                                                                            

Tags:                                                                                                                                                                                                              
    None                                                                                                                                                                                                           

Preferred version:                                                                                                                                                                                                 
    3.1.6     http://www.open-mpi.org/software/ompi/v3.1/downloads/openmpi-3.1.6.tar.bz2                                                                                                                           

Safe versions:                                                                                                                                                                                                     
    master    [git] https://github.com/open-mpi/ompi.git on branch master                                                                                                                                          
    4.0.5     http://www.open-mpi.org/software/ompi/v4.0/downloads/openmpi-4.0.5.tar.bz2                                                                                                                           
    4.0.4     http://www.open-mpi.org/software/ompi/v4.0/downloads/openmpi-4.0.4.tar.bz2                                                                                                                           
    4.0.3     http://www.open-mpi.org/software/ompi/v4.0/downloads/openmpi-4.0.3.tar.bz2                                                                                                                           
    4.0.2     http://www.open-mpi.org/software/ompi/v4.0/downloads/openmpi-4.0.2.tar.bz2                                                                                                                           
    4.0.1     http://www.open-mpi.org/software/ompi/v4.0/downloads/openmpi-4.0.1.tar.bz2

    ......

Variants:
    Name [Default]           Allowed values          Description
    =====================    ====================    ==============================================================================

    atomics [off]            on, off                 Enable built-in atomics
    cuda [off]               on, off                 Enable CUDA support
    cxx [off]                on, off                 Enable C++ MPI bindings
    cxx_exceptions [off]     on, off                 Enable C++ Exception support
    fabrics [none]           none, auto, fca,        List of fabrics that are enabled; 'auto' lets openmpi determine
                             knem, hcoll, verbs,
                             psm2, psm, xpmem,
                             ucx, mxm, cma, ofi
    gpfs [on]                on, off                 Enable GPFS support (if present)
    java [off]               on, off                 Build Java support

    ......

Installation Phases:
    autoreconf    configure    build    install

Build Dependencies:
    autoconf  binutils  hcoll  java  libfabric  lsf     m4   numactl   openpbs  pkgconfig  singularity  sqlite  valgrind  zlib
    automake  fca       hwloc  knem  libtool    lustre  mxm  opa-psm2  perl     rdma-core  slurm        ucx     xpmem

Link Dependencies:
    binutils  fca  hcoll  hwloc  java  knem  libfabric  lsf  lustre  mxm  numactl  opa-psm2  openpbs  rdma-core  singularity  slurm  sqlite  ucx  valgrind  xpmem  zlib

Run Dependencies:
    None

Virtual Packages: 
    openmpi@2.0.0: provides mpi@:3.1
    openmpi@1.7.5: provides mpi@:3.0
    openmpi@1.6.5 provides mpi@:2.2
    openmpi provides mpi

通过查询软件包信息,您可以了解可添加的编译项以便更好的编译需要的软件。

2.1.3 spack versions

通过使用spack versions,您可以找到某一个软件包的可用版本。

这里以安装openmpi为例,我们可以看到openmpi的版本号,我们可以找到需要的版本号来执行install的操作。

输出中Safe version代表spack已经校验过sum值,不会在安装时遭受黑客攻击和篡改;

Remote version为未校验过sum值的软件包。spack无法确认其安全性,使用者需要自己加以注意。

$ spack versions openmpi                                                                                                                                                                                        
==> Safe versions (already checksummed):
  master  4.0.2  3.1.5  3.1.1  3.0.3  2.1.6  2.1.2  2.0.3  1.10.7  1.10.3  1.8.8  1.8.4  1.8    1.7.2  1.6.4  1.6    1.5.2  1.4.4  1.4    1.3.1  1.2.7  1.2.3  1.1.5  1.1.1  1.0
  4.0.5   4.0.1  3.1.4  3.1.0  3.0.2  2.1.5  2.1.1  2.0.2  1.10.6  1.10.2  1.8.7  1.8.3  1.7.5  1.7.1  1.6.3  1.5.5  1.5.1  1.4.3  1.3.4  1.3    1.2.6  1.2.2  1.1.4  1.1
  4.0.4   4.0.0  3.1.3  3.0.5  3.0.1  2.1.4  2.1.0  2.0.1  1.10.5  1.10.1  1.8.6  1.8.2  1.7.4  1.7    1.6.2  1.5.4  1.5    1.4.2  1.3.3  1.2.9  1.2.5  1.2.1  1.1.3  1.0.2
  4.0.3   3.1.6  3.1.2  3.0.4  3.0.0  2.1.3  2.0.4  2.0.0  1.10.4  1.10.0  1.8.5  1.8.1  1.7.3  1.6.5  1.6.1  1.5.3  1.4.5  1.4.1  1.3.2  1.2.8  1.2.4  1.2    1.1.2  1.0.1
==> Remote versions (not yet checksummed):
==> Warning: Found no unchecksummed versions for openmpi

2.1.4 spack arch

通过执行spack arch命令来了解当前机器的CPU架构

$ spack arch                                                                                                                                                                                                    
linux-ubuntu18.04-cascadelake

你也可以通过使用spack arch --known-targets命令来显示所有CPU架构

2.2 软件包参数指定

在安装时您可以使用:

  • 使用@来指定需要安装的版本;
  • 使用%来选择需要使用的编译器;
  • 使用+-~来指定此软件的布尔值变量依赖(通过spack info <package>)来查找;
  • 使用name=<value>来指定此此软件的非布尔值环境依赖;
  • 使用target=<value> os=<value>指定CPU架构和系统(例如,target=skylake_avx512 os=linux
  • 使用^指定依赖的软件(例如,^callpath@1.1)

2.3 安装和卸载软件

2.3.1 spack install

spack install可以从spack list中找到的软件中来安装软件包。

我们以gcc为例,

  1. 如果gcc依赖其他的软件包,spack将会先将依赖包安装,
  2. 然后校验下载的包文件没有错误,构建并安装到目录SPACK_ROOT/opt

在安装完成后,您可以看到成功安装的输出。arch=skylake_avx512为指定平台,具体可以参考spack arch这一节的内容。

在执行过程中出现的[+],意味着依赖项已经相关安装完成,无须重新编译。

$ spack install gcc@10.2.0 target=skylake_avx512
[+] /home/user/spack/opt/spack/linux-ubuntu18.04-skylake_avx512/gcc-7.5.0/libsigsegv-2.12-65cvzrqkbruz3jwexeg7r44ovcz6zml5
[+] /home/user/spack/opt/spack/linux-ubuntu18.04-skylake_avx512/gcc-7.5.0/berkeley-db-18.1.40-6zahi2waipcqbqepcscqyc52alhv6bxw
[+] /home/user/spack/opt/spack/linux-ubuntu18.04-skylake_avx512/gcc-7.5.0/pkgconf-1.7.3-idmzwmyvgrql5cvpdof7tldya6jldl2g
[+] /home/user/spack/opt/spack/linux-ubuntu18.04-skylake_avx512/gcc-7.5.0/autoconf-archive-2019.01.06-zpx5jjtsx5qwkdoytknoqncsyaja7ryf
......
==> Installing gcc
==> No binary for gcc found: installing from source
==> Using cached archive: /home/user/spack/var/spack/cache/_source-cache/archive/b8/b8dd4368bb9c7f0b98188317ee0254dd8cc99d1e3a18d0ff146c855fe16c1d8c.tar.xz
==> gcc: Executing phase: 'autoreconf'
==> gcc: Executing phase: 'configure'
==> gcc: Executing phase: 'build'
==> gcc: Executing phase: 'install'

$spack find gcc                                                                                                                                                                                                
==> 2 installed packages
-- linux-ubuntu18.04-skylake_avx512 / gcc@7.5.0 -----------------
gcc@7.5.0  gcc@10.2.0

2.3.2 spack uninstall

卸载安装的软件包,您可以使用spack uninstall <package>来卸载目前已经安装的软件。

已经安装的软件可以通过spack find找到。

--dependents可以将依赖此软件的其他软件一起卸载。

如果您需要卸载所有软件,可以使用--all来实现

[~] spack uninstall --dependents openmpi%gcc@10.2.0
==> The following packages will be uninstalled:

    -- linux-ubuntu18.04-cascadelake / gcc@10.2.0 -------------------
    w2atmjq hdf5@1.10.7  sehyo5r netcdf-c@4.7.4  a4w6sg6 openmpi@3.1.6

==> Do you want to proceed? [y/N] y
==> Successfully uninstalled netcdf-c@4.7.4%gcc@10.2.0~dap~hdf4~jna+mpi~parallel-netcdf+pic+shared arch=linux-ubuntu18.04-cascadelake/sehyo5r
==> Successfully uninstalled hdf5@1.10.7%gcc@10.2.0~cxx~debug~fortran+hl~java+mpi+pic+shared~szip~threadsafe api=none arch=linux-ubuntu18.04-cascadelake/w2atmjq
==> Successfully uninstalled openmpi@3.1.6%gcc@10.2.0~atomics~cuda~cxx~cxx_exceptions+gpfs~java~legacylaunchers~lustre~memchecker~pmi~singularity~sqlite3+static~thread_multiple+vt+wrapper-rpath fabrics=none sche
dulers=none arch=linux-ubuntu18.04-cascadelake/a4w6sg6

2.3.3 spack gc

gc全称为(”Garbage Collector”,即垃圾回收),当您完成编译后,剩余一些目前不被其他软件依赖的项目可以被清理。

您可以通过使用spack gc来清理掉不需要的软件包。

$ spack gc                                                                                                                                                                                                       
==> The following packages will be uninstalled:                                                                                                                                                                    

    -- linux-ubuntu18.04-skylake_avx512 / gcc@7.5.0 -----------------                                                                                                                                              
    ayxupwc autoconf@2.69                nnarbli curl@7.72.0    wmcteof git@2.29.0            7vlbp2m libidn2@2.3.0        bhtzjl5 libxml2@2.9.10  66vt3mk perl@5.30.3         te3i3a5 xz@5.2.5                    
    zpx5jjt autoconf-archive@2019.01.06  zorqtw7 diffutils@3.7  h6rui4l hwloc@2.2.0           vhckpte libpciaccess@0.16    lj57qtx m4@1.4.18       idmzwmy pkgconf@1.7.3                                           
    oa4lssz automake@1.16.2              gqtxtgk expat@2.2.9    bez7ort libbsd@0.10.0         65cvzrq libsigsegv@2.12      phtjrqd openssh@8.4p1   mzpdmwj tar@1.32                                                
    6zahi2w berkeley-db@18.1.40          sz3iurw gdbm@1.18.1    upr5h3c libedit@3.1-20191231  smnwhui libtool@2.4.6        fcemob6 openssl@1.1.1h  nwu2trb texinfo@6.5                                             
    oukbgll bzip2@1.0.8                  4bstie7 gettext@0.21   qzdhx3t libiconv@1.16         2khexru libunistring@0.9.10  24pllrg pcre2@10.35     ozhfnrm util-macros@1.19.1                                      

==> Do you want to proceed? [y/N] y                                                                                                                                                                                
==> Successfully uninstalled pkgconf@1.7.3%gcc@7.5.0 arch=linux-ubuntu18.04-skylake_avx512/idmzwmy                                                                                                                 
==> Successfully uninstalled libtool@2.4.6%gcc@7.5.0 arch=linux-ubuntu18.04-skylake_avx512/smnwhui                                                                                                                 
==> Successfully uninstalled autoconf@2.69%gcc@7.5.0 arch=linux-ubuntu18.04-skylake_avx512/ayxupwc                                                                                                                 
==> Successfully uninstalled automake@1.16.2%gcc@7.5.0 arch=linux-ubuntu18.04-skylake_avx512/oa4lssz                                                                                                               
==> Successfully uninstalled autoconf-archive@2019.01.06%gcc@7.5.0 arch=linux-ubuntu18.04-skylake_avx512/zpx5jjt
==> Successfully uninstalled diffutils@3.7%gcc@7.5.0 arch=linux-ubuntu18.04-skylake_avx512/zorqtw7
==> Successfully uninstalled git@2.29.0%gcc@7.5.0~tcltk arch=linux-ubuntu18.04-skylake_avx512/wmcteof
==> Successfully uninstalled util-macros@1.19.1%gcc@7.5.0 arch=linux-ubuntu18.04-skylake_avx512/ozhfnrm
==> Successfully uninstalled hwloc@2.2.0%gcc@7.5.0~cairo~cuda~gl~libudev+libxml2~netloc~nvml+pci+shared arch=linux-ubuntu18.04-skylake_avx512/h6rui4l
......

$ spack find
==> 19 installed packages
-- linux-ubuntu18.04-skylake_avx512 / gcc@7.5.0 -----------------
gcc@7.5.0   gmp@6.1.2  isl@0.21  lua@5.3.5                  lua-luaposix@33.4.0  mpc@1.1.0   mpfr@4.0.2   readline@8.0  unzip@6.0    zstd@1.4.5
gcc@10.2.0  isl@0.18   lmod@8.3  lua-luafilesystem@1_7_0_2  mpc@1.1.0            mpfr@3.1.6  ncurses@6.2  tcl@8.6.10    zlib@1.2.11

2.3.4 编译无法下载的软件包

Spack有一些软件包不能自动下载,原因可能有以下情况:

  • 软件包作者需要用户在下载安装包前手动同意License(如jdk和galahd)
  • 软件包无法在互联网上下载

如果需要编译这些软件包,您可能需要用到spack mirrors

创建Mirror的步骤如下:

  1. mirror创建一个目录

您可以在任何目录创建,如~/spackmirrors。注意,这个文件夹所在硬盘的剩余空间最好可以大一些。

$ mkdir ~/spackmirrors

2. 在mirrors.yaml文件中注册此路径,您可以通过spack config edit mirrors打开此文件

mirrors:
  manual: file://~/spackmirrors

3. 将软件的二进制或源码压缩包放到此目录下,以<package>/<package>-<version>.tar.gz来命名。

例如,Oracle下载安装包需要手动同意License,我们放置Oraclejdktar包到mirrors目录下:

$ cd ~/spackmirrors/jdk/
$ mv jdk-14_linux-x64_bin.tar.gz jdk-14.tar.gz 
$ tree spackmirrors                                                                                                                                                                                             
spackmirrors
└── jdk
    └── jdk-14.tar.gz

4. 通过使用<package>@<version>来安装软件

$ spack install jdk@14 target=skylake_avx512
==> Warning: Missing a source id for jdk@14
==> Installing jdk
==> No binary for jdk found: installing from source
==> Warning: There is no checksum on file to fetch jdk@14 safely.
==>   Fetch anyway? [y/N] y
==> Fetching file:///home/user/spackmirrors/jdk/jdk-14.tar.gz
############################################################################################################################################################################################################ 100.0%
==> jdk: Executing phase: 'install'
[+] /home/user/spack/opt/spack/linux-ubuntu18.04-skylake_avx512/gcc-7.5.0/jdk-14-ctoqgkgu4qvmbbjvdewpdsx4hb4qawki
$ spack find jdk                                                                                                                                                                                              
==> 1 installed package
-- linux-ubuntu18.04-skylake_avx512 / gcc@7.5.0 -----------------
jdk@14

2.4 spack mirror create

您可以使用spack mirror命令, 创建一个spack镜像(假设您在可以访问 Internet 的计算机上)。

该命令将遍历 Spack 的所有包,并将安全的包下载到上述目录结构中,像这样:

$ spack mirror create libelf libdwarf
==> Created new mirror in spack-mirror-2014-06-24
==> Trying to fetch from http://www.mr511.de/software/libelf-0.8.13.tar.gz
##########################################################                81.6%
==> Checksum passed for libelf@0.8.13
==> Added libelf@0.8.13
==> Trying to fetch from http://www.mr511.de/software/libelf-0.8.12.tar.gz
######################################################################    98.6%
==> Checksum passed for libelf@0.8.12
==> Added libelf@0.8.12
==> Trying to fetch from http://www.prevanders.net/libdwarf-20130207.tar.gz
######################################################################    97.3%
==> Checksum passed for libdwarf@20130207
==> Added libdwarf@20130207
==> Trying to fetch from http://www.prevanders.net/libdwarf-20130126.tar.gz
########################################################                  78.9%
==> Checksum passed for libdwarf@20130126
==> Added libdwarf@20130126
==> Trying to fetch from http://www.prevanders.net/libdwarf-20130729.tar.gz
#############################################################             84.7%
==> Added libdwarf@20130729
==> Added spack-mirror-2014-06-24/libdwarf/libdwarf-20130729.tar.gz to mirror
==> Added python@2.7.8.
==> Successfully updated mirror in spack-mirror-2015-02-24.
  Archive stats:
    0    already present
    5    added
    0    failed to fetch.

完成此操作后,您可以对 spack-mirror-2014-06-24 目录进行 tar 压缩并将其复制到您希望它托管的机器上。

2.5 查询已安装的软件包

当您将软件完成安装时,您需要了解哪些软件是已经安装的,您可以通过下列命令来了解。

2.5.1 spack find

通过使用spack find可以找到已经安装的软件。

安装的软件包由名称、版本、编译器、架构和构建选项来分组。

$ spack find                                                                                                                 
==> 20 installed packages
-- linux-ubuntu18.04-skylake_avx512 / gcc@7.5.0 -----------------
gcc@7.5.0   gmp@6.1.2  isl@0.21  lmod@8.3   lua-luafilesystem@1_7_0_2  mpc@1.1.0  mpfr@3.1.6  ncurses@6.2   tcl@8.6.10  zlib@1.2.11
gcc@10.2.0  isl@0.18   jdk@14    lua@5.3.5  lua-luaposix@33.4.0        mpc@1.1.0  mpfr@4.0.2  readline@8.0  unzip@6.0   zstd@1.4.5

2.5.2 查询find更多信息

通过拓展查找选项可以了解安装软件的详细信息

2.5.2.1 spack find –deps

通过使用spack find –deps您可以查找安装软件包所需要的依赖条件。

$ [~] spack find --deps gcc                                           
==> 2 installed packages
-- linux-ubuntu18.04-skylake_avx512 / gcc@7.5.0 -----------------
gcc@7.5.0
    gmp@6.1.2
    isl@0.18
    mpc@1.1.0
        mpfr@3.1.6
    zlib@1.2.11

gcc@10.2.0
    gmp@6.1.2
    isl@0.21
    mpc@1.1.0
        mpfr@4.0.2
    zlib@1.2.11
    zstd@1.4.5

现在我们可以看到gcc不同版本依赖软件的版本不同。

2.5.2.2 spack find –paths

通过使用spack find –paths您可以了解软件安装的位置。

[~] spack find --paths gcc@10.2.0                                                                                                           
==> 1 installed package
-- linux-ubuntu18.04-skylake_avx512 / gcc@7.5.0 -----------------
gcc@10.2.0  /home/user/spack/opt/spack/linux-ubuntu18.04-skylake_avx512/gcc-7.5.0/gcc-10.2.0-7s57lgiv24lajskfc4aqf2npajnnweao

2.6 使用已安装的软件包

当您在系统中安装完成软件包,软件包会使用hash值来命名一个长路径。如果您想使用这个软件包,您可以使用spack load命令导入当前窗口的环境变量中。

2.6.1 spack load

当您执行安装操作后,通过spack find可以找到需要的软件包。

例如,如果我们需要导入gcc环境来使用,我们可以这样做

$ gcc --version                                                           
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


$ spack find gcc                                                          
==> 2 installed packages
-- linux-ubuntu18.04-skylake_avx512 / gcc@7.5.0 -----------------
gcc@7.5.0  gcc@10.2.0

$ spack load gcc@10.2.0                                                   

$ gcc --version                                                           
gcc (Spack GCC) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

当使用spack load命令后,spack将会将此软件的环境变量加载到环境变量PATHMANPATHCPATHLD_LIBRARY_PATH中。

我们来做一个实验,用新安装的gcc@10.2.0来编译一个2048小游戏

项目地址: https://github.com/plibither8/2048.cpp

$ spack find gcc
==> 2 installed packages
-- linux-ubuntu18.04-skylake_avx512 / gcc@7.5.0 -----------------
gcc@7.5.0  gcc@10.2.0

$ spack load gcc@10.2.0
$ git clone https://github.com/plibither8/2048.cpp
$ cd 2048.cpp
$ mkdir build && cd build

$ cmake ../         
......
-- Build files have been written to: /home/nfs/admin0/qizewen/2048.cpp/build

$ cmake --build .        
Scanning dependencies of target 2048
......
[100%] Linking CXX executable 2048
[100%] Built target 2048

$ ./2048

2.6.2 spack unload

当您不希望在某个窗口中使用load后的软件,您可以通过spack unload来将环境变量已加载的环境变量取消。

[~] spack unload gcc                                                       
==> Warning: Reversing `Set` environment operation may lose original value                                                                                                                                         
==> Warning: Reversing `Set` environment operation may lose original value 

2.6.3 多版本共存问题

当您在load环境时可能会出现以下情况,您可以参考 软件包参数指定 章节指定更多参数来明确需要加载的软件包。

$ spack load gcc                                    
==> Error: gcc matches multiple packages.
  Matching packages:
    o7522oj gcc@7.5.0%gcc@7.5.0 arch=linux-ubuntu18.04-skylake_avx512
    7s57lgi gcc@10.2.0%gcc@7.5.0 arch=linux-ubuntu18.04-skylake_avx512
  Use a more specific spec.

$ spack load gcc@7.5.0 target=skylake_avx512

3. Spack ENV环境

假设我们在做一个项目,但是在spack find列出的软件有多个版本,且不能迅速找到所需要的软件依赖。

那看起来是不是特别不方便?

这里Spack引入了ENV环境来创建一个干净的环境,您可以理解为类似CondaPython Environment,您可以使用项目名称来命名ENV环境。

3.1 spack env create

您可以使用spack env create <envname>创建虚拟环境。

$ spack env create emenv

==> Updating view at /home/user/spack/var/spack/environments/emenv/.spack-env/view
==> Created environment 'emenv' in /home/user/spack/var/spack/environments/emenv
==> You can activate this environment with:
==>   spack env activate emenv

所有的命名的环境存储位置在spack安装目录/spack/var/spack/environments

虚拟环境最大的好处就是可以迁移环境,您可以通过spack/var/spack/environments目录下的spack.yamlspack.lock来创建新的虚拟环境。

以下示例通过一个已经创建的spack.yaml来创建新的虚拟环境newenv

$ pwd                                                                                       
/home/user/spack/var/spack/environments/emenv

$ ls                                                                                        
spack.lock  spack.yaml

$ spack env create newenv spack.yaml                                                        
==> Updating view at /home/user/spack/var/spack/environments/newenv/.spack-env/view
==> Created environment 'newenv' in /home/user/spack/var/spack/environments/newenv
==> You can activate this environment with:
==>   spack env activate newenv

您也可以通过使用spack.lock创建环境

$ spack env create myenv spack.lock
spack env activate <envname>

在您创建完成虚拟环境后,您可以通过使用spack env activate <envname>激活环境;

在新环境中,您可以看到一个干净的env环境,那么您就可以只安装和此项目相关的软件包了。

$ spack env activate newenv         
$ spack find                        

==> In environment emenv
==> No root specs
==> 0 installed packages 

3.2 spack env deactive

在使用完成虚拟环境时,您可以使用spack env deactive来取消使用虚拟环境。

$ spack find            
==> In environment emenv
==> No root specs
==> 0 installed packages

$ spack env deactivate                                                                                                                                                                         
$ spack find                                                                                                                                                                                   
==> 15 installed packages
-- linux-ubuntu18.04-skylake_avx512 / gcc@7.5.0 -----------------
gcc@7.5.0  gmp@6.1.2  isl@0.18  jdk@14  lmod@8.3  lua@5.3.5  lua-luafilesystem@1_7_0_2  lua-luaposix@33.4.0  mpc@1.1.0  mpfr@3.1.6  ncurses@6.2  readline@8.0  tcl@8.6.10  unzip@6.0  zlib@1.2.11

您也可以使用despacktivate来取消环境,效果与spack env deactive相同。

$ despacktivate

Debug:

spack –debug install gcc

. /mnt/softs/spack/share/spack/setup*.sh

Spack 入门指南

Spack 入门指南

17 May 2019 引言 与其他包管理生态的区别 为什么要写本文 原理 快速上手 安装 基本的命令行用法 module 使用 进阶使用 配置文件 repos, mirros and caches 虚拟环境 pip in spack […]

Leave a comment

Your email address will not be published. Required fields are marked *