CANN 软件栈详解
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 等 │
└──────────────────────────────────────────────┘
[!NOTE] CANN 的商业版本号和内部版本号需要区分。测试服务器上的 CANN 商业版本为 8.0.1(对应
ascend-toolkit目录名),但 runtime/compiler/hccl 等内部组件版本号均为 7.6.0.2.220(即7.6系列)。在查阅版本兼容性矩阵时需注意这个区分。
2. 各层详解
2.1 驱动层 (Driver)
最底层,负责:
- 与固件 (Firmware v7.5.0.5.220) 通信。
- PCIe 设备管理(
/dev/davinci0~/dev/davinci7)。 - 内存映射、DMA 传输。
- 通过
npu-smi工具导出设备状态。
当前服务器驱动版本:24.1.0.3。
2.2 运行时层 (Runtime)
对应 CUDA Runtime API 的角色。负责任务分发到 AI Core/AI CPU、设备内存管理、Stream 与 Event 管理。Runtime 下层是任务调度层(Task Scheduler, TSC),负责将计算任务派发到具体 AI Core,但对用户完全透明——框架和 AscendCL 封装了这一层。
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.4 图编译与优化层
- GE (Graph Engine):将框架(PyTorch/MindSpore)的计算图转换为 Ascend 可执行图,执行图融合(算子合并)、内存优化、数据布局转换等编译优化。这是 CANN 区别于 CUDA 的关键组件——CUDA 将图优化留给框架(TorchDynamo/XLA),而 CANN 在驱动层面提供了统一的图编译器。
- AOE (Ascend Optimization Engine):自动调优工具,选择最优算子实现和 tiling 策略。
2.5 AscendCL (Ascend Computing Language)
应用开发 API 层,提供 C/Python 接口。功能包括设备/Context/Stream 管理、模型加载与推理执行、媒体数据预处理(DVPP 模块)、单算子调用。对于 PyTorch 用户,torch_npu 底层调用 AscendCL。
2.6 HCCL (Huawei Collective Communication Library)
集合通信库,对应 NVIDIA 的 NCCL。提供 AllReduce、AllGather、ReduceScatter、Broadcast 等集合操作,基于 HCCS 链路的卡间通信。测试服务器 HCCL 版本:7.6.0.2.220,8 卡之间通过 HCCS 链路全互联。
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 (仅 kernel 录制回放,GE 功能范围更广) |
| 集合通信测试 | 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