写给新手的 cann-spack-package:昇腾Spack包管理到底是啥?
写给新手的 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
$ ssh machine1
$ bash install_cann.sh
$ # 等 30 分钟
$ # 登上机器 2
$ ssh machine2
$ bash install_cann.sh
$ # 等 30 分钟
$ # ... 重复 100 次
# 问题:
# 1. 太慢了(100 台 × 30 分钟 = 50 小时)
# 2. 版本可能不对(有人装了 8.0,有人装了 8.5)
# 3. 依赖关系不清楚(装了 opbase,但忘了装 catlass)
# 4. 卸载麻烦(要一台一台卸)
用 cann-spack-package(一条命令)
# 1. 安装 Spack
$ git clone https://github.com/spack/spack.git
$ cd spack
$ . share/spack/setup-env.csh
# 2. 添加 cann-spack-package 仓库
$ spack repo add https://atomgit.com/cann/cann-spack-package.git
# 3. 在 100 台机器上并行安装 CANN
$ spack install --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. 验证
$ spack find
# ==> 1 installed package
# -- linux-ubuntu20.04-haswell / gccc-11.2.0 ---
# cann@8.0.0
你说气人不气人,之前装 2 天,现在 10 分钟。
核心概念就三个
1. Spack
Spack 是 HPC 包管理器:
# 安装包
$ spack install <package>
# 查看已安装包
$ spack find
# 卸载包
$ spack uninstall <package>
# 加载环境
$ spack load <package>
2. 包定义(Package Definition)
每个包一个 package.py:
# cann-spack-package/packages/cann/package.py
from spack import PackageBase
class Cann(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')
def install(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
$ spack install cann
# 10 分钟,100 台机器并行 ✅
2. 版本管理
多版本共存:
# 安装多个版本
$ spack install cann@8.0.0
$ spack install cann@8.5.0
# 查看
$ spack find
# ==> 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.0
3. 依赖管理
自动解决依赖:
# 安装 cann
$ spack install cann
# 输出:
# ==> 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
$ git clone https://github.com/spack/spack.git
$ cd spack
$ . share/spack/setup-env.csh
# 2. 添加 cann-spack-package 仓库
$ spack repo add https://atomgit.com/cann/cann-spack-package.git
# 3. 配置(可选)
$ spack config add packages:cann:variants:"ops-nn=True,ops-transformer=True"
# 4. 安装 CANN
$ spack install 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
# ==> Successfully installed cann-8.0.0-rmv2pbo6x3q5sziotdh7tkigxqwszbg
#
# 完成!✅
# 5. 验证
$ spack find
# ==> 1 installed package
# -- linux-ubuntu20.04-haswell / gccc-11.2.0 ---
# cann@8.0.0
示例 2:管理多版本
# 1. 安装多个版本
$ spack install cann@8.0.0
$ spack install cann@8.5.0
# 2. 查看
$ spack find
# ==> 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. 验证
$ spack find
# ==> 1 installed package
# -- linux-ubuntu20.04-haswell / gccc-11.2.0 ---
# cann@8.5.0
示例 4:创建环境
# 1. 创建环境
$ spack env create cann-env
$ spack env activate cann-env
# 2. 在环境里安装包
$ spack add cann@8.0.0
$ spack add opbase
$ spack add catlass
$ spack add ops-nn
# 3. 安装
$ spack install
# 输出:
# ==> Installing opbase-1.0.0-...
# ==> Installing catlass-1.0.0-...
# ==> Installing ops-nn-1.0.0-...
# ==> Installing cann-8.0.0-...
#
# 完成!✅
# 4. 查看环境
$ spack find
# ==> 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. 退出环境
$ spack env deactivate
性能数据
用 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.py
class Cann(PackageBase):
homepage = "..."
url = "..."
version('8.0.0', sha256='...')
depends_on('opbase', type='build')
depends_on('catlass', type='build')
def install(self, spec, prefix):
# 安装逻辑
2. 仓库
cann-spack-package/
├── packages/
│ ├── cann/
│ ├── opbase/
│ ├── catlass/
│ └── ops-nn/
│
└── repo.yaml
3. 配置
# ~/.spack/config.yaml
repos:
- https://atomgit.com/cann/cann-spack-package.git
4. 环境
$ spack env create cann-env
$ spack env activate cann-env
$ spack add cann@8.0.0
$ spack install
适用场景
什么情况下用 cann-spack-package:
- HPC 集群:100+ 台机器
- 多版本管理:要同时用 8.0 和 8.5
- 依赖管理:要自动解决依赖
什么情况下不用:
- 单机:不用看
- 快速测试:用 Docker 镜像更快
总结
cann-spack-package 就是昇腾的"集群部署工具":
- 批量安装:100 台机器并行安装
- 版本管理:多版本共存
- 依赖管理:自动解决依赖
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)