【AI】华为鲲鹏950+昇腾950:NPU驱动与CANN安装
昇腾这套东西,装之前先得把层次理清楚。不然很容易出现"驱动装完了,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 三层都验证通过,后面接集群才不会在底层反复返工。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)