spack添加external及load完整流程
一、简介
在使用spack的时候总会遇到比如超时或者下载不了等问题,而你本地恰好有一个你需要的软件包,那如何用spack去进行管理?
显然,国内的资料我是没找到什么完整的使用流程,而在我踩坑两天之后,现在大概是成功了,并以此文介绍一下如何用spack将本地的软件包进行管理
因为我是在管理intel-oneapi-compilers的时候遇到的这个问题,所以下文都在此基础上进行介绍
linux版本:CentOS7
这里放上spack关于packages.yaml的原文
二、具体流程
1、编辑packages.yaml
这个文件的路径是/path/to/your/.spack/packages.yaml(这里改成你的.spack路径)。如果没有,用spack config edit packages指令也可以,同样可以用spack config get packages查看完整的 packages.yaml 信息。
我这里本地oneapi文件的结构如下
├── 2021.4.0
│ ├── ccl
│ ├── clck
│ ├── compiler
│ │ ├── 2021.4.0
│ │ │ ├── documentation
│ │ │ │ └── en
│ │ │ ├── env
│ │ │ │ └── vars.sh
│ ├── conda_channel
│ ├── dal
│ ├── debugger
│ ├── dev-utilities
│ ├── dpcpp-ct
│ ├── dpl
│ ├── etc
│ ├── inspector
│ ├── intelpython
│ ├── ipp
│ ├── ippcp
│ ├── itac
│ ├── licensing
│ ├── logs
│ ├── mkl
│ ├── mpi
│ ├── setvars.sh
│ ├── tbb
│ └── vpl
└── 2024.1.0
我需要的是2021.4.0版本,而spack在load时,是会从当前路径沿着/compiler/2021.4.0/env/vars.sh去找到这个.sh文件。所以我这里只需要保留/oneapi/2021.4.0就可以了。所以,如果你出现如下问题:
spack load intel-oneapi-compilers@2021.4.0
==> Error: Trying to source non-existing file: /path/to/your/oneapi/2021.4.0/compiler/2021.4.0/compiler/2021.4.0/env/vars.sh
就表示路径错了。而这里的路径,就是要在packages.yaml中添加的部分
我们要在packages.yaml中添加如下代码:
packages:
intel-oneapi-compilers:
externals:
- spec: "intel-oneapi-compilers@2021.4.0"
prefix: /path/to/your/oneapi/2021.4.0
buildable: false
这里的packages: 如果已给出,就在里面添加 intel.. 之后的内容就可以了。其中buildable: false表示不用再编译了
这样我们就把本地的软件包添加到spack的external之中。
2、验证是否存在
添加之后,我们可以用spack spec intel-oneapi-compilers指令查看是否已经存在:
spack spec intel-oneapi-compilers
Input spec
--------------------------------
intel-oneapi-compilers
Concretized
--------------------------------
intel-oneapi-compilers@2021.4.0%gcc@10.2.0 build_system=generic arch=linux-centos7-cascadelake
如果出现和你本地版本号对应的intel-oneapi-compilers,那就证明修改成功了。
但是此时你发现,在键入spack find intel-oneapi-compilers指令时依然返回 no package 的字样。所以到这一步还是不能用的,只能说spack认为自己有。
(这里我可以用icc --version来检测是否已经在使用了,但是返回-bash: icc: command not found。这也是一种检测方法)
3、下载 intel-oneapi-compilers
键入:
spack install intel-oneapi-compilers@2021.4.0%gcc@10.2.0 build_system=generic arch=linux-centos7-cascadelake
可以看到这里的名称是完全从spack spec intel-oneapi-compilers得到的结果中复制过来的全称。
至于为什么要写这么多,讲真我也不知道为什么,但是我知道要是只保留intel-oneapi-compilers@2021.4.0的话spack又要开始自己下载了。
如果看到报错,那就是packages.yaml里面的路径写的有问题,正常情况下应该是这样的:
spack install intel-oneapi-compilers@2021.4.0%gcc@10.2.0 build_system=generic arch=linux-centos7-cascadelake
[+] /path/to/tour//oneapi/2021.4.0 (external intel-oneapi-compilers-2021.4.0-一串字符)
这个时候再看spack find intel-oneapi-compilers的输出,就能看到结果了:
spack find intel-oneapi-compilers
-- linux-centos7-cascadelake / gcc@10.2.0 -----------------------
intel-oneapi-compilers@2021.4.0
==> 1 installed package
(当然,这个时候执行icc --version还是-bash: icc: command not found)
4、load
这里仅键入spack load intel-oneapi-compilers@2021.4.0就可以了,会得到如下结果:(哦,好像正确的话没有结果,如果报错了,还是packages.yaml路径写的不对。)
这里再执行icc --version,就可以得到如下结果了:
icc --version
icc (ICC) 2021.4.0 20210910

浙公网安备 33010602011771号