前言

装过CANN开发环境的人都知道这个痛苦:CANN Toolkit、Ascend C编译器、PyTorch、HCCL、驱动……十几个包,依赖关系错综复杂。手动装一遍,查依赖2小时,配环境变量1小时,解决版本冲突又2小时——一天就这么没了。

cann-spack-package是昇腾CANN的Spack包管理仓库,把CANN全家桶的所有包定义都收纳了。用Spack一条命令就能装好全套CANN开发环境,自动解决依赖、自动编译、自动配环境变量,从2小时压缩到10分钟

这篇从零开始,手把手带你用Spack搭一套完整的CANN开发环境。

cann-spack-package在CANN五层架构里的位置

这个仓库住在第5层——昇腾计算基础层的工具链,和cmake、asc-tools是同级关系:

工具链仓库 用途
cmake CANN构建系统
asc-tools 算子开发工具集
cann-spack-package 包管理仓库
cann-agreements 社区协议

什么是Spack?

Spack是LLNL(劳伦斯利弗莫尔国家实验室)开发的HPC包管理器,核心能力:

  • 自动依赖解析:装A需要B,B需要C,Spack自动算出来
  • 多版本共存:同一台机器上装CANN 7.x和8.x互不冲突
  • 编译优化:根据目标CPU/NPU架构自动选择编译选项
  • 模块化加载:用spack load按需加载环境,不用改.bashrc

昇腾CANN把所有包定义放到cann-spack-package仓库,让Spack能直接管理CANN全家桶。

10分钟搭建完整环境

步骤1:安装Spack(1分钟)

# 克隆Spack仓库
git clone -c feature.manyFiles=true https://github.com/spack/spack.git
cd spack

# 激活Spack环境
source share/spack/setup-env.sh

# 验证版本(必须≥0.20)
spack --version
# 输出: 0.22.0

代码讲解source share/spack/setup-env.sh会把spack命令加到PATH里,并设置Spack的shell函数。这一步不修改任何系统文件,退出shell后自动失效。

步骤2:添加CANN包仓库(2分钟)

# 克隆CANN的Spack包定义仓库
git clone https://atomgit.com/cann/cann-spack-package.git

# 注册到Spack
spack repo add cann-spack-package

# 验证CANN包可见
spack list cann
# 输出:
# cann-toolkit
# cann-ascendc
# cann-hccl
# cann-pytorch
# cann-driver

代码讲解spack repo add把CANN的包定义注册到Spack的仓库搜索路径里。注册后,spack install cann-toolkit就能找到CANN的包定义并自动解析依赖。一个包定义就是一个package.py文件,描述了包的源码地址、编译方式、依赖列表。

步骤3:一条命令装全套CANN环境(5分钟)

# 安装CANN Toolkit + Ascend C + PyTorch + HCCL
spack install cann-toolkit+ascend_c+pytorch+hccl

# Spack会自动解析依赖,安装顺序大致如下:
# 1. opbase(基础组件)
# 2. cann-driver(驱动)
# 3. cann-toolkit(核心工具链)
# 4. cann-ascendc(Ascend C编译器)
# 5. cann-hccl(集合通信库)
# 6. cann-pytorch(PyTorch适配)

代码讲解+ascend_c+pytorch+hccl是Spack的variant语法,表示安装cann-toolkit时带上这三个可选组件。Spack会自动算出这些variant的依赖——比如+pytorch需要Python和CUDA/NPU backend,Spack会自动装好。整个过程不需要手动指定版本,Spack自动选兼容的最新版。

步骤4:加载环境并验证(2分钟)

# 加载CANN环境
spack load cann-toolkit+ascend_c+pytorch+hccl

# 验证CANN Toolkit
npu-smi info
# 输出: CANN Version: 8.0, Device: Ascend 910

# 验证Ascend C编译器
ascendc++ --version
# 输出: ascendc++ 8.0.0

# 验证PyTorch
python -c "import torch; print(torch.npu.is_available())"
# 输出: True

# 验证HCCL
python -c "import hccl; print(hccl.__version__)"
# 输出: 8.0.0

代码讲解spack load会把CANN的bin/lib/include路径加到当前shell的环境变量里。这比手动改.bashrc安全——换一个shell窗口就不生效了,不会污染全局环境。

和手动安装的对比

维度 手动安装 Spack安装
时间 2-5小时 10分钟
依赖处理 手动查文档,容易版本冲突 自动解析,零冲突
环境变量 手动改.bashrc,容易出错 spack load按需加载
多版本共存 不支持,升级要卸载重装 支持多个版本并存
回滚 只能卸载重装 spack uninstall秒级回滚
可复现 靠人记录,容易忘 spack.lock锁定完整依赖树

进阶用法

同时装两个版本

# 装CANN 7.x和8.x共存
spack install cann-toolkit@7.0+pytorch
spack install cann-toolkit@8.0+pytorch

# 用哪个就load哪个
spack load cann-toolkit@7.0  # 切到7.x
spack load cann-toolkit@8.0  # 切到8.x

生成可复现的环境锁定文件

# 创建Spack环境
spack env create my-cann-env
spack env activate my-cann-env

# 添加需要的包
spack add cann-toolkit+ascend_c+pytorch

# 安装并生成spack.lock
spack install

# spack.lock记录了所有包的精确版本和编译选项
cat spack.lock | python -m json.tool | head -30

自定义编译选项

# 指定目标NPU架构编译
spack install cann-toolkit target=ascend910

# 指定Python版本
spack install cann-toolkit ^python@3.9

踩坑实录

坑1:Spack版本太低,不支持compiler aliases

现象spack install cann-toolkit报错Error: Unknown compiler 'ascendc'

原因:Spack 0.19及更早版本不支持自定义compiler aliases,无法识别Ascend C编译器。

解决:升级Spack到0.20+。

# 检查版本
spack --version

# 如果低于0.20,拉最新代码
cd spack && git pull origin develop
source share/spack/setup-env.sh

坑2:编译时内存不够,OOM

现象spack install编译CANN Toolkit时,系统内存不足被kill。

原因:CANN Toolkit的某些模块并行编译时占内存很大(每个编译进程约2GB),8核机器并行编译=16GB内存占用。

解决:限制并行编译数。

# 限制同时编译的进程数为4
spack config set config:build_stage:/tmp/spack_stage
spack install -j4 cann-toolkit  # -j4限制4个并行

坑3:驱动版本和CANN版本不匹配

现象npu-smi info能显示设备,但torch.npu.is_available()返回False。

原因:cann-driver@7.x和cann-toolkit@8.0版本不兼容。Spack装toolkit 8.0时应该自动装driver 8.0,但如果系统已有旧版driver,Spack可能不会覆盖。

解决:先卸旧驱动,再装全套。

# 查看已装的driver
spack list -d cann-driver

# 强制重新装driver
spack uninstall cann-driver
spack install cann-toolkit+driver  # 带driver一起装

结尾

cann-spack-package是昇腾CANN的Spack包管理仓库,住在第5层基础层工具链,用一条命令装好CANN全家桶,把2小时的环境搭建压缩到10分钟

如果在昇腾NPU上做开发,强烈建议用Spack管理CANN环境。实测下来,一条命令搞定全套安装,自动依赖解析+多版本共存+秒级回滚,比手动安装靠谱太多。

昇腾CANN的工具链生态还在持续完善。如果在用的过程中遇到啥问题,欢迎去AtomGit上的昇腾CANN开源社区逛逛,里面有一手资料和活跃社区。

社区链接

https://atomgit.com/cann/cann-spack-package

Logo

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

更多推荐