02 — 昇腾硬件架构与 CANN 软件栈
1. 硬件架构: Ascend 910B3
1.1 概述
Ascend 910B3 是华为昇腾系列 AI 处理器,采用 达芬奇 (Da Vinci) 架构,7 nm 制程。本服务器配备 8 张 910B3 卡,通过 HCCS (Huawei Cache Coherence System) 全互联。
关键硬件参数 (实测数据):
| 参数 | 值 |
|---|---|
| 型号 | Ascend 910B3 |
| HBM 容量/卡 | 64 GB (65536 MB) |
| HBM 频率 | 1600 MHz |
| HBM 厂商 ID | 0x57 (Samsung) |
| 卡间互联 | HCCS,8 卡全互联 (full mesh) |
| HCCS 单链路 lane 数 | 4 |
| 典型功耗 | ~90-97 W(空闲)/ ~231 W(FP16 算力满载)/ ~273 W(实测训练满载)/ ~300 W(TDP 额定最大) |
| 空闲温度 | 34-40°C |
| 驱动版本 | 24.1.0.3 |
服务器上实测的卡间拓扑(npu-smi info -l):
NPU0 NPU1 NPU2 NPU3 NPU4 NPU5 NPU6 NPU7
NPU0 X HCCS HCCS HCCS HCCS HCCS HCCS HCCS
NPU1 HCCS X HCCS HCCS HCCS HCCS HCCS HCCS
NPU2 HCCS HCCS X HCCS HCCS HCCS HCCS HCCS
NPU3 HCCS HCCS HCCS X HCCS HCCS HCCS HCCS
NPU4 HCCS HCCS HCCS HCCS X HCCS HCCS HCCS
NPU5 HCCS HCCS HCCS HCCS HCCS X HCCS HCCS
NPU6 HCCS HCCS HCCS HCCS HCCS HCCS X HCCS
NPU7 HCCS HCCS HCCS HCCS HCCS HCCS HCCS X
8 卡之间每两张卡均有 HCCS 专有链路直连,不经过 PCIe 或 NUMA。这是训练集群的理想拓扑。
通过
ascend-dmi --info --detail可获得更完整的硬件规格(DIE ID、AI CPU 数量、ECC 状态、PCIe LnkCap 等),详见 02_ascend_dmi_reference.md 第 3 节。
1.2 达芬奇 (Da Vinci) 架构核心设计
昇腾 AI Core 是达芬奇架构的计算核心单元。每个 AI Core 内部包含三种计算单元,分工明确:
┌─────────────────────────────────────┐
│ AI Core │
│ ┌──────────┐ ┌────────┐ ┌───────┐ │
│ │ Cube │ │ Vector │ │ Scalar│ │
│ │ Unit │ │ Unit │ │ Unit │ │
│ │(矩阵运算) │ │(向量运算)│ │(标量) │ │
│ └──────────┘ └────────┘ └───────┘ │
│ ┌──────────┐ ┌──────────────────┐ │
│ │ L1 Buffer│ │ L0 Buffer │ │
│ └──────────┘ └──────────────────┘ │
│ ┌────────────────────────────────┐ │
│ │ Unified Buffer │ │
│ └────────────────────────────────┘ │
└─────────────────────────────────────┘
| 计算单元 | 职责 | CUDA 类比 |
|---|---|---|
| Cube Unit | 矩阵乘加 (MAC) 运算,处理卷积/矩阵乘 | Tensor Core |
| Vector Unit | 向量运算:激活函数、归一化、元素级操作 | CUDA Core (向量化) |
| Scalar Unit | 标量计算、控制流、地址计算 | CUDA Core (标量) |
关键设计理念:与 NVIDIA 的 SIMT (Single Instruction Multiple Threads) 不同,达芬奇架构将计算按类型分离到不同硬件单元,每个单元针对特定计算模式优化。Cube Unit 专注矩阵运算(AI 训练/推理的核心负载),Vector/Scalar Unit 处理其余操作。这种异构设计使得矩阵密集负载下的面积/能效比更高。
1.3 内存层次
HBM (64 GB, High Bandwidth Memory)
└── L2 Cache (共享, 多 AI Core 共用)
└── L1 Buffer (AI Core 内)
└── L0 Buffer (CU 专用, 每种计算单元独享)
- HBM:64 GB HBM2e,带宽实测值约 1.54 TB/s(
ascend-dmi --bw -t d2d实测 1538 GB/s) - L2 Cache:芯片级共享缓存,容量 MB 级别
- L1 Buffer:AI Core 内部缓存
- L0 Buffer:最接近计算单元,Cube/Vector/Scalar 各自独享
对比 A100 的 40/80 GB HBM2e 和 2 TB/s 带宽,910B3 的 HBM 容量更大(64 GB)但带宽略低,适合大批量数据和模型并行场景。
注:CANN 的商业版本号和内部版本号需要区分。本服务器上的 CANN 商业版本为 8.0.1(对应
ascend-toolkit目录名),但 runtime/compiler/hccl 等内部组件版本号均为 7.6.0.2.220(即7.6系列)。在查阅版本兼容性矩阵时需注意这个区分。
2. CANN 软件栈
CANN 是昇腾硬件上层的完整异构计算栈,用户从上层框架到底层驱动都会与其交互。下面先从全貌看各层位置,再逐层展开职责。
2.1 栈全貌
CANN (Compute Architecture for Neural Networks) 是华为昇腾的异构计算架构,类似于 NVIDIA 的 CUDA 平台 + 工具链集合。
┌──────────────────────────────────────────────┐
│ 开发框架层 │
│ MindSpore / PyTorch (torch_npu) / TensorFlow│
├──────────────────────────────────────────────┤
│ 应用开发层 │
│ AscendCL (C/Python API) │
├──────────────────────────────────────────────┤
│ 图编译与优化层 │
│ GE (Graph Engine) / AOE (Auto Optimizer) │
├──────────────────────────────────────────────┤
│ 算子层 │
│ Ascend C / TBE / AI CPU 算子 + 内置算子库 │
│ (OPP: Operator Plugin Package) │
├──────────────────────────────────────────────┤
│ 运行时层 (Runtime) │
│ 任务调度 / 内存管理 / Stream 管理 │
├──────────────────────────────────────────────┤
│ 任务调度层 (Task Scheduler / TSC) │
├──────────────────────────────────────────────┤
│ 驱动层 (Driver) │
│ 设备管理 / 固件通信 / PCIe 驱动 │
├──────────────────────────────────────────────┤
│ 硬件层 │
│ Ascend 910B3 / 310P / 710 等 │
└──────────────────────────────────────────────┘
2.2 各层详解
2.2.1 驱动层 (Driver)
最底层,负责:
- 与固件 (Firmware v7.5.0.5.220) 通信
- PCIe 设备管理(
/dev/davinci0~/dev/davinci7) - 内存映射、DMA 传输
- 通过
npu-smi工具导出设备状态
当前服务器驱动版本:24.1.0.3
2.2.2 运行时层 (Runtime)
对应 CUDA Runtime API 的角色。负责任务分发到 AI Core/AI CPU、设备内存管理、Stream 与 Event 管理。Runtime 下层是任务调度层(Task Scheduler, TSC),负责将计算任务派发到具体 AI Core,但对用户完全透明——框架和 AscendCL 封装了这一层。
2.2.3 算子层 (Operator Layer)
CANN 提供三层算子开发体系:
| 算子开发方式 | 抽象层级 | 适用场景 |
|---|---|---|
| 内置算子 (OPP) | 最高(直接用) | 标准算子:Conv、BN、Activation 等 1400+ 算子 |
| Ascend C | 中(C++ 类库) | 自定义算子,用标准 C++ + Ascend C API 编写 |
| TBE (Tensor Boost Engine) | 低(DSL) | 手动优化算子,使用领域特定语言 |
OPP (Operator Plugin Package) 已预置在 /usr/local/Ascend/ascend-toolkit/latest/opp/,包含各芯片架构(Ascend910、Ascend310P 等)的优化实现。
与 CUDA 的对比:
- CUDA 只有一套算子开发模型(CUDA C++ Kernel),附带 cuDNN/cuBLAS 等优化库
- CANN 将算子开发分层:优先用内置算子 → Ascend C 自定义 → TBE 深度优化。门槛更低,层次清晰
2.2.4 图编译与优化层
- GE (Graph Engine):将框架(PyTorch/MindSpore)的计算图转换为 Ascend 可执行图,执行图融合(算子合并)、内存优化、数据布局转换等编译优化。这是 CANN 区别于 CUDA 的关键组件——CUDA 将图优化留给框架(TorchDynamo/XLA),而 CANN 在驱动层面提供了统一的图编译器。
- AOE (Ascend Optimization Engine):自动调优工具,选择最优算子实现和 tiling 策略
2.2.5 AscendCL (Ascend Computing Language)
应用开发 API 层,提供 C/Python 接口。功能包括:
- 设备/Context/Stream 管理
- 模型加载与推理执行
- 媒体数据预处理(图像编解码、缩放等,即 DVPP 模块)
- 单算子调用
对于 PyTorch 用户,torch_npu 底层调用 AscendCL;对于 C/C++ 开发者,直接使用 AscendCL API。
2.2.6 HCCL (Huawei Collective Communication Library)
集合通信库,对应 NVIDIA 的 NCCL。提供:
- AllReduce、AllGather、ReduceScatter、Broadcast 等集合操作
- 基于 HCCS 链路的卡间通信
- 通信原语和算法实现
本服务器 HCCL 版本:7.6.0.2.220,8 卡之间通过 HCCS 链路全互联。
2.2.7 框架适配层
- torch_npu:PyTorch 与 CANN 的适配层。将 PyTorch 的 CUDA 后端调用转化为 AscendCL 调用。版本需与 PyTorch 和 CANN 同时兼容。
- MindSpore:华为自研框架,对 Ascend 有原生支持,不依赖 torch_npu。
3. CANN vs CUDA 开发工具对照
| 功能 | CANN 工具 | CUDA 工具 |
|---|---|---|
| 设备管理 | npu-smi |
nvidia-smi |
| Profiling | msprof |
nsys / ncu (Nsight) |
| 模型转换 | atc (Ascend Tensor Compiler) |
TensorRT trtexec |
| 模型压缩 | AMCT | TensorRT 量化 |
| 算子自动调优 | AOE | cuDNN autotune |
| 算子开发 | Ascend C / TBE + msopgen |
CUDA C++ |
| 编译工具链 | BiSheng Compiler (ccec) |
NVCC |
| 调试 | msdebug |
cuda-gdb |
| 分布式通信 | HCCL | NCCL |
| 图编译 | GE (Graph Engine) | CUDA Graphs |
| 集合通信测试 | hccl_test |
nccl-tests |
| 开发套件路径 | /usr/local/Ascend/ascend-toolkit/latest/ |
/usr/local/cuda/ |
关键环境变量对照:
| CANN | CUDA | 作用 |
|---|---|---|
ASCEND_RT_VISIBLE_DEVICES |
CUDA_VISIBLE_DEVICES |
可见设备控制 |
ASCEND_TOOLKIT_HOME |
CUDA_HOME |
工具套件路径 |
ASCEND_OPP_PATH |
(无对应,内置) | 算子包路径 |
ASCEND_HOME_PATH |
(无对应) | CANN 安装路径 |
4. 从服务器视角理解 CANN 目录结构
/usr/local/Ascend/
├── driver/ # 驱动 (v24.1.0.3)
│ ├── device/ # 设备节点
│ ├── lib64/ # 驱动库
│ └── version.info
├── firmware/ # 固件 (v7.5.0.5.220)
├── ascend-toolkit/ # CANN 开发套件
│ ├── 8.0.1/ # 版本号
│ ├── 8.0/ # 主版本
│ ├── latest/ → 8.0.1 # 符号链接
│ └── set_env.sh # 环境变量脚本
├── toolbox/ # 工具箱 (npu-smi 等)
└── Ascend-Docker-Runtime/
set_env.sh 的核心内容:
ASCEND_TOOLKIT_HOME=/usr/local/Ascend/ascend-toolkit/latest
LD_LIBRARY_PATH=$ASCEND_TOOLKIT_HOME/lib64:...
PYTHONPATH=$ASCEND_TOOLKIT_HOME/python/site-packages:...
PATH=$ASCEND_TOOLKIT_HOME/bin:$ASCEND_TOOLKIT_HOME/compiler/ccec_compiler/bin:...
ASCEND_OPP_PATH=$ASCEND_TOOLKIT_HOME/opp
ASCEND_AICPU_PATH=$ASCEND_TOOLKIT_HOME
5. 编程范式差异: SIMT vs 达芬奇
SIMT 与达芬奇架构在“计算如何被拆分”上走了两条不同路线,这直接决定了 CUDA 代码能否直接迁移到 NPU。
5.1 NVIDIA SIMT
GPU 通过大量 CUDA Core 执行相同指令、不同数据(SIMT)。一个 Warp (32 线程) 共享控制逻辑,所有线程执行相同操作。矩阵运算需要通过 Tensor Core 专门加速——Tensor Core 是 SM (Streaming Multiprocessor) 内的独立子单元。
5.2 达芬奇架构
达芬奇将计算任务按类型拆分到不同的硬件单元:
- 数据到 NPU 后,图编译器 (GE) 分析算子类型
- Cube Unit 执行矩阵乘加 → 这是 AI 计算的核心(占据 ~90% 的计算量)
- Vector Unit 并行执行激活函数、归一化等向量操作
- Scalar Unit 处理标量运算和控制流
这种设计意味着:
- 优势:矩阵运算的硬件利用率和能效比极高(同等功耗下矩阵乘吞吐更高)
- 代价:需要图编译器将算子合理拆分到不同单元,CUDA 代码不能直接 1:1 翻译执行
- 迁移影响:自定义 CUDA kernel 需要改写为 Ascend C/TBE 算子;标准 PyTorch 算子(已有 NPU 适配)可直接迁移