跳转至

昇腾 NPU:生态概览与环境搭建

约 1648 个字 55 行代码 2 张图片 预计阅读时间 6 分钟

本章是昇腾部分的导读。如果你已经学过 CUDA,那么昇腾的各种概念对你来说都不算陌生——它们只是换了名字的同一套思想:异构并行计算

昇腾(Ascend) 是华为的 AI 处理器(NPU)系列,广泛应用于训练和推理服务器。近年来国内各大算力中心、高校集群中昇腾设备的占比越来越高,学会在 NPU 上写代码、调算子,正在成为 HPC/AI 系统方向的一项实用技能。

硬件形态

常见的昇腾硬件包括:

产品线 典型型号 用途
训练/推理服务器 Atlas 800T A2 / 800I A2(搭载 Ascend 910B) 大模型训练与推理的主力
超节点 Atlas 900 A3 SuperPoD(搭载 Ascend 910C) 大规模集群训练与推理
新一代 Atlas 950 SuperPoD(搭载 Ascend 950 系列) 超节点集群
推理加速卡 Atlas 300I Duo / 300V Pro 服务器插卡推理
开发者套件 Atlas 200I DK A2 板卡级开发

对入门者来说,同一套软件栈适用于上述所有硬件,不用担心型号差异。

以训练主力 Atlas 800T A2 为例,它长这样——4U 机架式服务器,一台最多装 8 颗 910B 芯片,对应 npu-smi info 里的 8 个 NPU 编号:1

Atlas 800T A2 训练服务器

软件栈:从固件到框架

昇腾的软件栈自下而上分为几层,整体结构与 NVIDIA 生态一一对应:

NVIDIA 生态 昇腾生态 说明
GPU NPU 硬件
nvidia-smi npu-smi 查看设备状态
驱动 NPU 驱动 + 固件 驱动装在物理机,固件与驱动配套
CUDA Toolkit CANN 异构计算架构,编译器、运行时、算子库全家桶
CUDA C Ascend C 设备端编程语言
cuBLAS / cuDNN CANN 算子库 / ATB 高性能算子库
NCCL HCCL 集合通信库
PyTorch (torch.cuda) PyTorch + torch_npu 框架适配插件
Triton triton-ascend Triton 编译器的昇腾后端
CUTLASS / TVM DSL TileLang(昇腾适配) 算子开发 DSL
ONNX → TensorRT ONNX → ATC → om 模型 推理模型转换

昇腾软件栈与 NVIDIA 生态对照示意图

记住这张表,你就能把已有的 GPU 知识“平移”到昇腾上。

其中 CANN(Compute Architecture for Neural Networks) 是一切的核心:它向上支持 PyTorch、MindSpore 等框架,向下调度 NPU 硬件,类似于 CUDA Toolkit 在 NVIDIA 生态中的地位。

环境搭建

动手前先确认

昇腾软件栈对版本配套要求严格:驱动固件 ↔ CANN ↔ torch_npu ↔ PyTorch ↔ Python 版本必须互相匹配,这是新手踩坑的头号来源。装任何东西之前,先查官方的版本配套表。本指南引用的版本号均为写作时点(2026 年 8 月)的快照,仅作参考。

方式一:物理机安装

完整流程是 安装驱动固件 → 安装 CANN Toolkit → 安装框架插件,官方文档见 CANN 安装指南

1. 安装 NPU 驱动和固件(需要 root,从固件与驱动下载页获取对应产品型号的包):

# 安装依赖(Ubuntu/Debian)
apt-get install -y make dkms gcc linux-headers-$(uname -r)

# 安装驱动(* 是版本号,按实际文件名补全)
./Ascend-hdk-910b-npu-driver_xx.x.x_linux-aarch64.run --full --install-for-all

# 验证
npu-smi info

看到类似下面的输出就说明驱动装好了。下面是 openEuler 22.03 + 8 卡 910B3 服务器上的真实输出(节选两卡与进程表;不同版本格式略有差异):

+------------------------------------------------------------------------------------------------+
| npu-smi 25.2.3                   Version: 25.2.3                                               |
+---------------------------+---------------+----------------------------------------------------+
| NPU   Name                | Health        | Power(W)    Temp(C)           Hugepages-Usage(page)|
| Chip                      | Bus-Id        | AICore(%)   Memory-Usage(MB)  HBM-Usage(MB)        |
+===========================+===============+====================================================+
| 0     910B3               | OK            | 94.7        32                0    / 0             |
| 0                         | 0000:C1:00.0  | 0           0    / 0          56896/ 65536         |
+===========================+===============+====================================================+
| 1     910B3               | OK            | 88.7        33                0    / 0             |
| 0                         | 0000:C2:00.0  | 0           0    / 0          56687/ 65536         |
+===========================+===============+====================================================+
+---------------------------+---------------+----------------------------------------------------+
| NPU     Chip              | Process id    | Process name             | Process memory(MB)      |
+===========================+===============+====================================================+
| 0       0                 | 501588        | python                   | 101                     |
| 0       0                 | 504351        | sglangschedul            | 53321                   |
+===========================+===============+====================================================+
| 1       0                 | 504352        | sglangschedul            | 53325                   |
+===========================+===============+====================================================+

几个对新手有用的读法:HBM-Usage(MB) 就是 NPU 上的“显存”占用(910B3 单卡 64 GB,上面两卡当时正跑着推理服务,各占了 55+ GB);下半张进程表回答的是“卡被谁占着”——共享服务器上任务排队或报 device busy 时,先来这里看看,作用等同 nvidia-smi 的进程列表。

驱动装的是什么版本,可以用 cat /usr/local/Ascend/driver/version.info 查看——排查驱动固件与 CANN 的配套问题时,先核对这里。

2. 安装 CANN Toolkit 与 Kernels 包(不需要 root。注意:root 默认装到 /usr/local/Ascend,普通用户默认装到 ~/Ascend,下文以 /usr/local 为例,装到其他位置时请同步替换 source 命令里的路径):

./Ascend-cann-toolkit_8.x.x_linux-aarch64.run --install

# Kernels 包:与 Toolkit 同版本、按芯片型号(如 910B)选择,用框架训练/推理时必需
./Ascend-cann-kernels_8.x.x_linux-aarch64.run --install

# 激活环境变量(这一步每次登录都要做,或写进 ~/.bashrc)
source /usr/local/Ascend/ascend-toolkit/set_env.sh

# 验证
atc --version

x86 还是 aarch64?

昇腾服务器通常是鲲鹏/ARM 平台,软件包选 aarch64;如果你在 x86 服务器上插了昇腾卡,选 x86_64uname -m 可以确认。

容易混淆的四个软件包

  • 驱动(driver):内核态驱动,装在物理机,负责管理 NPU 设备;
  • 固件(firmware):与驱动配套的设备端软件,两者从同一页面成对下载;
  • CANN Toolkit:开发套件(编译器、ATC、运行时与开发算子库),装在开发机或容器内;
  • CANN Kernels 包:按芯片型号(如 910B)发布的预编译算子库,用框架训练/推理时需与 Toolkit 同版本配套安装。

方式二:容器部署(推荐)

官方在 Ascend Hub 和 Docker Hub 上提供预装好 CANN 的镜像(宿主机仍需安装驱动固件;tag 中 910b/a3 对应 910B/910C 两代硬件,并区分操作系统与 Python 版本),例如:

docker pull quay.io/ascend/cann:9.1.0-910b-ubuntu22.04-py3.11

容器内开发需要先在物理机安装 Ascend Docker Runtime,启动时把 NPU 设备挂进去:

docker run -it --rm \
    --device /dev/davinci0 \
    --device /dev/davinci_manager \
    --device /dev/devmm_svm \
    --device /dev/hisi_hdc \
    -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
    quay.io/ascend/cann:9.1.0-910b-ubuntu22.04-py3.11 bash

容器方案的好处是 CANN 及配套算子库已由官方装好,宿主机只需安装驱动固件,这也是集群上最主流的用法。

方式三:集群与云上环境

在学校/单位共享的昇腾集群上,通常不直接登录计算节点,而是通过作业调度系统申请 NPU 资源。以 Slurm 为例(分区名、资源类型名以本集群文档为准):

# 交互式申请 1 张 NPU
srun -p npu --gres=npu:1 --pty bash

进入分配的节点后,用法与前两种方式完全一致(推荐直接拉起容器镜像)。没有硬件时,也可以使用提供昇腾实例的云平台(如华为云 ModelArts、各类 AI 算力平台)。集群登录与网络配置可回顾计算机网络一章。

验证环境

环境搭好后,跑一段最简单的代码:

import torch
import torch_npu

print(torch_npu.npu.is_available())   # True
x = torch.randn(3, 3).npu()
y = x * 2
print(y.cpu())                        # 结果能算出来并搬回内存

能打印出结果,说明从驱动、CANN 到 torch_npu 的整条链路都是通的。

学习&拓展:

  1. 在自己的机器或集群上完成一次昇腾环境搭建(容器方式即可),截图记录 npu-smi info 的输出。
  2. 阅读 CANN 安装文档,弄清楚“驱动、固件、Toolkit、Kernels 包”各自的作用。
  3. npu-smi info watch 观察一次模型训练时 NPU 的利用率变化,对比 GPU 上的 nvidia-smi
  4. 了解昇腾 AICore 中 Cube 单元和 Vector 单元的分工(为下一章 Ascend C 做准备)。

一些链接

昇腾社区官网(文档、教程、问答的入口)

CANN 官方下载与安装文档

固件与驱动下载

Ascend Hub 容器镜像仓库

昇腾源码仓库组织(Gitee)(多数仓库已同步迁移至 GitCode