昇腾这套东西,装之前先得把层次理清楚。不然很容易出现"驱动装完了,npu-smi 也能看到卡,但跑模型还是报找不到算子"的情况——因为下面还有一层没装。

这篇记录的是鲲鹏950 + 昇腾950DT 环境下,从裸机到 CANN 可用的完整过程。命令都是实际执行过的,每一步也给了成功回显,照着核对就行。

一、先厘清要装哪几层

昇腾的软件栈,从下往上大致是三块:

层次组件干什么
硬件层NPU 驱动 + 固件让操作系统认到卡,提供 /dev 设备节点
计算层CANN算子库、编译器、运行时,对标 CUDA 的位置
集群层MindCluster面向 K8s 的设备挂载、调度、故障恢复

三层的关系可以这么理解:驱动是把卡插上电、让系统看得见;CANN 是给这张卡准备工具箱;MindCluster 才是把一堆卡组织起来干活的调度系统。

本文只做前两层——驱动固件和 CANN。集群层先把组件认全,等单机跑通了再说。

CANN 到底是个什么位置

CANN 之于昇腾,基本等于 CUDA 之于 NVIDIA。

英伟达的软件栈是驱动 → CUDA → cuDNN / TensorRT;昇腾这边是驱动 → CANN → 各类加速库。所以"CANN(CUDA)"这个写法不是并列关系,是类比关系。

理解了这一点,后面装 CANN 的 toolkit 和 ops 就不会觉得多余——toolkit 是编译器和运行时,ops 是针对具体芯片型号的算子包,两个都得装。

MindCluster 里都有什么

虽然本文不装,但先把组件认全,后面看文档不容易迷路:

组件职责
Ascend Docker Runtime按传入的 NPU 编号,自动把设备文件和驱动文件挂进容器
Device Plugin向 K8s 上报 NPU 数量、编号、健康状态;配合 Runtime 完成挂载
NodeD节点异常检测,把 CPU、内存、硬盘健康状态上报给 ClusterD
ClusterD汇总集群的昇腾任务与资源信息,提供查询接口;判断任务是否需要训练/推理的高阶恢复,并协调恢复过程
NPU Exporter暴露利用率、温度、电压、内存等监控指标,也支持自定义插件补充指标
Volcano感知集群可用芯片,结合网络与资源碎片选择最优调度;任务运行中芯片故障时重新选卡恢复
Ascend Operator负责昇腾相关 CRD 的编排与生命周期管理

一句话概括:Runtime 管挂载,Device Plugin 管上报,NodeD 管健康,ClusterD 管决策,Exporter 管监控,Volcano 管调度。

二、安装驱动和固件

2.1 先看有没有装过

不要上来就装,先确认现状:

npu-smi info

能正常输出卡的信息,说明驱动已经在位,可以直接跳到 CANN 那一节。报 command not found,才是干净环境,从下面开始。

2.2 安装依赖

驱动编译需要内核头文件和编译工具链,这一步跳过的话,安装脚本会在编译阶段失败。

在线环境

先配昇腾源,再装依赖:

curl https://repo.oepkgs.net/ascend/cann/ascend.repo -o /etc/yum.repos.d/ascend.repo && yum makecache
yum install -y make dkms gcc kernel-headers-$(uname -r) kernel-devel-$(uname -r)

注意 $(uname -r) 这个写法——它保证装的是当前运行内核对应的版本。手写版本号很容易和实际内核错开,后面编译驱动就会报找不到头文件。

离线环境

没有外网时,需要手工把下面这些包准备好:

binutils-2.41-30.oe2403sp4.aarch64.rpm
cpp-12.3.1-110.oe2403sp4.aarch64.rpm
gcc-12.3.1-110.oe2403sp4.aarch64.rpm
glibc-devel-2.38-107.oe2403sp4.aarch64.rpm
guile-2.2.7-6.oe2403sp4.aarch64.rpm
kernel-devel-6.6.0-159.4.3.154.oe2403sp4.aarch64.rpm
kernel-headers-6.6.0-159.4.3.154.oe2403sp4.aarch64.rpm
libasan-12.3.1-110.oe2403sp4.aarch64.rpm
libgcc-12.3.1-110.oe2403sp4.aarch64.rpm
libgomp-12.3.1-110.oe2403sp4.aarch64.rpm
libmpc-1.3.1-2.oe2403sp4.aarch64.rpm
libstdc++-12.3.1-110.oe2403sp4.aarch64.rpm
libubsan-12.3.1-110.oe2403sp4.aarch64.rpm
libxcrypt-devel-4.4.36-3.oe2403sp4.aarch64.rpm
make-4.4.1-2.oe2403sp4.aarch64.rpm
zlib-1.2.13-5.oe2403sp4.aarch64.rpm

这堆包里最要紧的是两个内核包,版本必须和 uname -r 的输出完全一致。上面这组是 6.6.0-159.4.3.154.oe2403sp4,换环境时要按实际内核重新取包,不能照抄。

装完之后用 rpm -ivh *.rpm 批量安装,遇到依赖顺序问题就多跑两遍。

2.3 安装 NPU 驱动

先给执行权限:

chmod +x Atlas-A5-hdk-npu-driver_25.6.rc1_linux-aarch64.run
chmod +x Atlas-A5-hdk-npu-firmware_9.0.0.200.200.run

装驱动:

./Atlas-A5-hdk-npu-driver_25.6.rc1_linux-aarch64.run --full --install-for-all

--full 表示完整安装(驱动 + 工具),--install-for-all 是让所有用户都能使用驱动,不加的话默认只有 root 可用,后面普通用户跑容器会踩权限问题。

看到这行就是成功了:

Driver package installed successfully!

2.4 安装固件

./Atlas-A5-hdk-npu-firmware_9.0.0.200.200.run --full

固件包和驱动包是分开的,顺序上先驱动后固件。

成功回显长这样:

Firmware package installed successfully! Reboot now or after driver installation for the installation/upgrade to take effect

这句话后半段是关键——固件升级必须重启才生效。装完别急着往下走。

reboot

2.5 验证驱动

重启之后再查一次:

npu-smi info

图 1 | npu-smi info 输出:8 张 Ascend950DT,健康状态全 OK

这张输出里有几个数值得看一眼:

  • NPU ID 一共 8 个,Name 全是 Ascend950DT,Health 一栏全是 OK,说明卡和驱动都对上了
  • Memory-Usage 显示的 4800 / 98304,斜杠后面那个是每卡的 HBM 容量,换算下来单卡 96GB
  • 温度 46–53℃,功耗 386–407W,NPU Util 全是 0,这是典型的空载状态
  • 底部 No running processes found 也是正常的,机器刚装完,上面还没有任何进程

这些字段都正常,说明驱动和固件这一层就通了。

如果这里显示异常或者查不到卡,先不要装 CANN——底层没通,上层一定报错,先把驱动这关过掉。

三、安装 CANN

CANN 的安装分两个包:toolkit 和 ops。

3.1 安装 Toolkit

chmod +x Ascend-cann-toolkit_9.1.0_linux-aarch64.run
bash Ascend-cann-toolkit_9.1.0_linux-aarch64.run --install --nox11

--nox11 是跳过图形化安装界面,在服务器上必加,否则会卡在等待显示器。

3.2 安装 ops 算子包

chmod +x Ascend-cann-950-ops_9.1.0_linux-aarch64.run
bash Ascend-cann-950-ops_9.1.0_linux-aarch64.run --install --nox11 --type=toolkit

注意包名里的 950——ops 包是按芯片型号分的。950DT 要用 950 的算子包,装错型号会出现"算子找不到"的问题,而且报错信息不会直接告诉你是包装错了。

--type=toolkit 表示把它作为 toolkit 的一部分安装,这样两边的目录结构能对上。

3.3 配置环境变量

source /usr/local/Ascend/cann/set_env.sh

这一步只是让当前 shell 生效。换个终端、重启机器,都得重新 source 一次。

长期使用建议写进 shell 配置文件:

echo "source /usr/local/Ascend/cann/set_env.sh" >> ~/.bashrc

3.4 验证安装

cat /usr/local/Ascend/ascend-toolkit/latest/aarch64-linux/ascend_toolkit_install.info

图 2 | ascend_toolkit_install.info:toolkit 版本落到了 9.1.0

这个文件里记录着已安装 toolkit 的版本信息,几行都值得看懂:

  • version=9.1.0 是发布版本号,装的是哪个包看这个
  • innerversion=V100R001C11SPC001B243 是内部版本号,后面排查问题提工单时,官方要的是这一串
  • compatible_version 列出的是它兼容的版本区间(V100R001C15 / C21 / C23 / C10),可以回头核对前面装固件时的版本
  • arch=aarch64 说明装的是 ARM 架构的版本,鲲鹏机器上就是它
  • path 一栏是实际安装目录 /usr/local/Ascend/cann-9.1.0

这个文件只覆盖 toolkit。ops 包是另一个包,版本要单独确认,别看到这个文件就以为两个都齐了。

到这一步,NPU 驱动、固件、CANN 就绪,可以跑单机的推理或训练任务了。

四、几个容易忽略的点

把上面流程里最容易出问题的地方单独拎出来:

位置容易踩的地方后果
依赖安装kernel-devel 版本和 uname -r 不一致驱动编译失败,报找不到内核头文件
离线依赖直接照抄本文的包版本内核版本不同时装不上
驱动安装漏了 --install-for-all非 root 用户用不了 NPU
固件安装装完没重启固件版本仍是旧的
CANN ops装成别的芯片型号的包运行时报算子找不到
环境变量只 source 了一次没持久化新开终端就失效

这几条都不是"疑难杂症",但每一条都能让流程卡住半天,而且报错信息通常不会直接指向真实原因。

五、下一步

单机跑通之后,如果目标是 K8s 集群,还需要装 MindCluster,把 Device Plugin、Ascend Docker Runtime 这些组件部署上去,让调度器能感知到 NPU 资源。

那是另一段流程了。这篇先把地基打完——驱动、固件、CANN 三层都验证通过,后面接集群才不会在底层反复返工。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐