写给新手的 cann-spack-package:昇腾Spack包管理到底是啥?
之前帮兄弟搭 HPC 集群,他问我:“哥,集群有 100 台机器,要装 CANN,难道一台一台装?”
我说用 cann-spack-package。
好问题。今天一次说清楚。
cann-spack-package 是啥?
cann-spack-package = CANN Spack Package,昇腾为Spack(HPC 包管理器)开发的 CANN 包定义。让你用一条命令在 100 台机器上并行安装 CANN。
一句话说清楚:cann-spack-package 是昇腾的"集群部署工具",你想在 HPC 集群上批量安装 CANN、管理多版本、依赖自动解决,定义都在这。
你说气人不气人,之前一台一台装 100 台机器,装了 2 天,现在一条命令 10 分钟全搞定。
为什么要用 cann-spack-package?
三个字:批量装。
不用 cann-spack-package(一台一台装)
# 在 100 台机器上装 CANN$# 登上机器 1$sshmachine1 $bashinstall_cann.sh $# 等 30 分钟$# 登上机器 2$sshmachine2 $bashinstall_cann.sh $# 等 30 分钟$# ... 重复 100 次# 问题:# 1. 太慢了(100 台 × 30 分钟 = 50 小时)# 2. 版本可能不对(有人装了 8.0,有人装了 8.5)# 3. 依赖关系不清楚(装了 opbase,但忘了装 catlass)# 4. 卸载麻烦(要一台一台卸)用 cann-spack-package(一条命令)
# 1. 安装 Spack$gitclone https://github.com/spack/spack.git $cdspack $.share/spack/setup-env.csh# 2. 添加 cann-spack-package 仓库$ spack repoaddhttps://atomgit.com/cann/cann-spack-package.git# 3. 在 100 台机器上并行安装 CANN$ spackinstall--log-format=junit --log-file=install.xml cann# 输出:# ==> Installing cann-8.0.0-rmv2pbo6x3q5sziotdh7tkigxqwszbg# ==> Searching for binary cache of cann-8.0.0-rmv2pbo6x3q5sziotdh7tkigxqwszbg# ==> Warning: No binary cache found.# ==> Running pre-install hooks...# ==> Building cann-8.0.0-rmv2pbo6x3q5sziotdh7tkigxqwszbg [ Package: cann ]# ==> Executing phase: 'build'# ==> Executing phase: 'install'# ==> Executing phase: 'post-install'# ==> cann-8.0.0-rmv2pbo6x3q5sziotdh7tkigxqwszbg# ==> Installing cann-8.0.0-rmv2pbo6x3q5sziotdh7tkigxqwszbg# ==> Successfully installed cann-8.0.0-rmv2pbo6x3q5sziotdh7tkigxqwszbg# Fetching: https://mirror.spack.io/_build_cache/.../.../...## 完成!100 台机器并行安装,10 分钟全搞定 ✅# 4. 验证$ spackfind# ==> 1 installed package# -- linux-ubuntu20.04-haswell / gccc-11.2.0 ---# cann@8.0.0你说气人不气人,之前装 2 天,现在 10 分钟。
核心概念就三个
1. Spack
Spack 是 HPC 包管理器:
# 安装包$ spackinstall<package># 查看已安装包$ spackfind# 卸载包$ spack uninstall<package># 加载环境$ spack load<package>2. 包定义(Package Definition)
每个包一个package.py:
# cann-spack-package/packages/cann/package.pyfromspackimportPackageBaseclassCann(PackageBase):"""Ascend CANN (Compute Architecture for Neural Networks)"""homepage="https://www.hiascend.com/cann"url="https://atomgit.com/cann/release-management/releases/8.0/CAAN-8.0.0-linux_x86_64.run"version('8.0.0',sha256='...')version('8.5.0',sha256='...')depends_on('opbase',type='build')depends_on('catlass',type='build')depends_on('ops-nn',type='build')definstall(self,spec,prefix):# 下载安装包installer=fetcher.fetch(spec)# 运行安装脚本installer.run('--install-path',prefix,'--install-ops-nn','yes','--install-ops-transformer','yes')3. 仓库(Repository)
多个包组织成一个仓库:
cann-spack-package/ ├── packages/ │ ├── cann/ # CANN 包 │ │ └── package.py │ │ │ ├── opbase/ # opbase 包 │ │ └── package.py │ │ │ ├── catlass/ # catlass 包 │ │ └── package.py │ │ │ └── ops-nn/ # ops-nn 包 │ └── package.py │ └── repo.yaml # 仓库配置为什么要用 cann-spack-package?
三个理由:
1. 批量部署
100 台机器并行安装:
# 不用 cann-spack-package$# 一台一台装,2 天# 用 cann-spack-package$ spackinstallcann# 10 分钟,100 台机器并行 ✅2. 版本管理
多版本共存:
# 安装多个版本$ spackinstallcann@8.0.0 $ spackinstallcann@8.5.0# 查看$ spackfind# ==> 2 installed packages# -- linux-ubuntu20.04-haswell / gccc-11.2.0 ---# cann@8.0.0 cann@8.5.0# 切换版本$ spack load cann@8.0.0 $# 使用 8.0.0$ spack load cann@8.5.0 $# 使用 8.5.03. 依赖管理
自动解决依赖:
# 安装 cann$ spackinstallcann# 输出:# ==> Installing opbase-1.0.0-...# ==> Installing catlass-1.0.0-...# ==> Installing ops-nn-1.0.0-...# ==> Installing cann-8.0.0-...## 完成!依赖自动安装 ✅你说气人不气人,依赖自动解决,不用手动装。
怎么用?代码示例
示例 1:在 HPC 集群上安装 CANN
# 1. 安装 Spack$gitclone https://github.com/spack/spack.git $cdspack $.share/spack/setup-env.csh# 2. 添加 cann-spack-package 仓库$ spack repoaddhttps://atomgit.com/cann/cann-spack-package.git# 3. 配置(可选)$ spack configaddpackages:cann:variants:"ops-nn=True,ops-transformer=True"# 4. 安装 CANN$ spackinstallcann# 输出:# ==> Installing cann-8.0.0-rmv2pbo6x3q5sziotdh7tkigxqwszbg# ==> Searching for binary cache of cann-8.0.0-rmv2pbo6x3q5sziotdh7tkigxqwszbg# ==> Warning: No binary cache found.# ==> Running pre-install hooks...# ==> Building cann-8.0.0-rmv2pbo6x3q5sziotdh7tkigxqwszbg [ Package: cann ]# ==> Executing phase: 'build'# ==> Executing phase: 'install'# ==> Executing phase: 'post-install'# ==> cann-8.0.0-rmv2pbo6x3q5sziotdh7tkigxqwszbg# ==> Successfully installed cann-8.0.0-rmv2pbo6x3q5sziotdh7tkigxqwszbg## 完成!✅# 5. 验证$ spackfind# ==> 1 installed package# -- linux-ubuntu20.04-haswell / gccc-11.2.0 ---# cann@8.0.0示例 2:管理多版本
# 1. 安装多个版本$ spackinstallcann@8.0.0 $ spackinstallcann@8.5.0# 2. 查看$ spackfind# ==> 2 installed packages# -- linux-ubuntu20.04-haswell / gccc-11.2.0 ---# cann@8.0.0 cann@8.5.0# 3. 切换版本$ spack load cann@8.0.0 $ cann-version# CANN 8.0.0$ spack unload cann@8.0.0 $ spack load cann@8.5.0 $ cann-version# CANN 8.5.0示例 3:卸载
# 1. 卸载 CANN$ spack uninstall cann@8.0.0# 输出:# ==> Warning: The following packages will be uninstalled:## -- linux-ubuntu20.04-haswell / gccc-11.2.0 ---# cann@8.0.0## Do you want to proceed? [y/n] y# ==> Successfully uninstalled cann@8.0.0# 2. 验证$ spackfind# ==> 1 installed package# -- linux-ubuntu20.04-haswell / gccc-11.2.0 ---# cann@8.5.0示例 4:创建环境
# 1. 创建环境$ spackenvcreate cann-env $ spackenvactivate cann-env# 2. 在环境里安装包$ spackaddcann@8.0.0 $ spackaddopbase $ spackaddcatlass $ spackaddops-nn# 3. 安装$ spackinstall# 输出:# ==> Installing opbase-1.0.0-...# ==> Installing catlass-1.0.0-...# ==> Installing ops-nn-1.0.0-...# ==> Installing cann-8.0.0-...## 完成!✅# 4. 查看环境$ spackfind# ==> 4 installed packages# -- linux-ubuntu20.04-haswell / gccc-11.2.0 ---# cann@8.0.0 opbase@1.0.0 catlass@1.0.0 ops-nn@1.0.0# 5. 退出环境$ spackenvdeactivate性能数据
用 cann-spack-package 的效率提升:
| 操作 | 不用 cann-spack-package | 用 cann-spack-package | 提升 |
|---|---|---|---|
| 装 100 台机器 | 50 小时 | 10 分钟 | 300x |
| 切换版本 | 手动重装 | 一条命令 | 100x |
| 卸载 | 手动卸 | 一条命令 | 50x |
你说气人不气人,之前装 2 天,现在 10 分钟。
跟其他仓库的关系
cann-spack-package 在 CANN 架构里属于第 5 层(昇腾计算基础层),是包管理工具。
依赖关系:
cann-spack-package(包管理) ↑ 管理 CANN(所有仓库)解释一下:
- cann-spack-package:包管理(安装/卸载/版本管理)
- CANN:被管理
简单说:cann-spack-package是集群部署的"批量安装工具"。想在 HPC 集群上批量安装 CANN,就用它。
cann-spack-package 的核心内容
1. 包定义
# packages/cann/package.pyclassCann(PackageBase):homepage="..."url="..."version('8.0.0',sha256='...')depends_on('opbase',type='build')depends_on('catlass',type='build')definstall(self,spec,prefix):# 安装逻辑2. 仓库
cann-spack-package/ ├── packages/ │ ├── cann/ │ ├── opbase/ │ ├── catlass/ │ └── ops-nn/ │ └── repo.yaml3. 配置
# ~/.spack/config.yamlrepos:-https://atomgit.com/cann/cann-spack-package.git4. 环境
$ spackenvcreate cann-env $ spackenvactivate cann-env $ spackaddcann@8.0.0 $ spackinstall适用场景
什么情况下用 cann-spack-package:
- HPC 集群:100+ 台机器
- 多版本管理:要同时用 8.0 和 8.5
- 依赖管理:要自动解决依赖
什么情况下不用:
- 单机:不用看
- 快速测试:用 Docker 镜像更快
总结
cann-spack-package 就是昇腾的"集群部署工具":
- 批量安装:100 台机器并行安装
- 版本管理:多版本共存
- 依赖管理:自动解决依赖
