之前帮兄弟搭 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 台机器并行安装
  • 版本管理:多版本共存
  • 依赖管理:自动解决依赖
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐