跳到主要内容
昇腾AI芯片与算子开发

2.1 CANN 全栈架构

从昇腾驱动固件到应用开发接口,逐层拆解 CANN 异构计算架构(Compute Architecture for Neural Networks),理解编译器、运行时、算子库、集合通信与框架适配的分层职责

CANN 昇腾软件栈 AscendCL ATC HCCL

NVIDIA 的护城河一半在硬件,一半在 CUDA 软件栈。昇腾要打对等生态,就需要一套和 CUDA 对标的软件体系——它就是 CANN。理解 CANN 的分层设计,等于拿到了昇腾开发的地图:你知道「报错出现在哪一层」「该去哪一层找文档」。

📑 目录


1. CANN 是什么

CANN = Compute Architecture for Neural Networks,昇腾异构计算架构。它是一整套软件栈,负责把开发者写的模型(PyTorch/MindSpore 代码、算子代码、应用代码)翻译成昇腾芯片能执行的指令。

可以这样类比:

NVIDIA昇腾
CUDA ToolkitCANN
nvcc(CUDA 编译器)昇腾编译器(ATC/Ascend C 编译工具链)
cuDNN / cuBLAS(算子库)aclnn / 昇腾算子库
CUDA Runtime / Driver APIAscendCL Runtime(aclrt)
NCCLHCCL
torch.cuda(PyTorch GPU 适配)torch_npu
TensorRTMindIE / ATC 离线转换

对照着看,你会发现昇腾几乎给 NVIDIA 的每个关键组件都做了「对应物」。AI Infra 工程师迁移到昇腾,最大的优势就是这套「对位翻译」的直觉。

2. CANN 全栈分层总览

CANN 从下到上大致是这么叠的:

┌───────────────────────────────────────────────┐
│  应用层:训练脚本 / 推理服务 / 算子工程         │
├───────────────────────────────────────────────┤
│  框架适配层:MindSpore / torch_npu / Paddle    │
├───────────────────────────────────────────────┤
│  应用开发接口:AscendCL(aclInit/aclrt/aclnn)  │
├───────────────────────────────────────────────┤
│  编译器与算子层:ATC(图编译)/ Ascend C 工具链 │
│  算子库:aclnn 标准算子、自研高性能算子         │
├───────────────────────────────────────────────┤
│  运行时与通信:Runtime(资源管理)/ HCCL        │
├───────────────────────────────────────────────┤
│  昇腾驱动固件(Ascend HDK:Driver + Firmware) │
├───────────────────────────────────────────────┤
│  昇腾 AI 处理器(910B/910C/310P ...)          │
└───────────────────────────────────────────────┘

每层只负责自己的职责,向上提供清晰接口,向下隐藏实现细节。开发者在哪一层工作,取决于你是什么角色:

  • 应用/算法工程师:接触框架层(torch_npu / MindSpore)最多。
  • 推理/部署工程师:接触 MindIE、ATC、AscendCL 最多。
  • 算子/系统工程师:接触 Ascend C、Runtime、HCCL 最多。

3. 昇腾驱动固件(Ascend HDK)

昇腾硬件上直接运行的是 驱动(Driver)与固件(Firmware),官方统称 Ascend HDK(Huawei Device Kit):

  • 固件(Firmware):烧录在芯片/板卡上的底层程序,管理硬件初始化、电源、温度、错误处理。
  • 驱动(Driver):运行在操作系统内核,向上提供 /dev/davinci* 等设备节点,是上层软件访问硬件的唯一入口。

为什么必须单独装 HDK? 因为 Runtime、编译器、HCCL 等所有上层组件都要通过驱动访问硬件。装昇腾环境的第一步永远是:安装与芯片型号匹配的固件驱动,再装 CANN 软件包。版本不匹配是最常见的环境报错来源。

对应 NVIDIA:驱动(NVIDIA Kernel Driver)+ CUDA Toolkit。昇腾把它拆成「驱动固件包 + CANN 软件包」两部分。

4. 编译器与图优化:ATC / AKG

把模型变成昇腾可执行的形式,靠的是 CANN 的编译层:

  • ATC(Ascend Tensor Compiler):把训练好的模型(如 ONNX、MindIR、TensorFlow 模型)离线编译成昇腾的 OM(Offline Model) 格式。推理部署时加载 OM 即可执行,无需再次编译。可类比 NVIDIA TensorRT 的 trtexec。
  • 图编译与图优化(GE):训练/推理时的计算图优化,包括算子融合、内存复用、常量折叠等,由框架适配层触发,最终把图拆解为算子序列。
  • AKG(Auto Kernel Generator):自动算子生成/优化框架,部分融合算子由它自动生成高效实现(类似 Triton 的「自动生成 Kernel」思路)。
  • Ascend C 编译工具链:算子开发者用 Ascend C 写算子,编译成 NPU 可执行文件。

5. 运行时与算子库:Runtime / aclnn

  • 运行时(Runtime):管理设备(Device)、上下文(Context)、流(Stream)、事件(Event)、内存(Memory)等资源,对应 CUDA Runtime。应用开发者通过 AscendCL 的 aclrt* 接口使用它。
  • 算子库(Operator Library):把常用算子(Add、MatMul、Softmax、Conv、LayerNorm……)做成高性能实现:
    • aclnn:昇腾「标准算子库」的 C 接口,应用开发者按 aclnnXxx 调用。
    • 底层还有华为自研的高性能算子实现(对标 cuDNN/cuBLAS)。

这里有个容易混淆的点:AscendCL 既是运行时接口(aclrt),也是算子调用接口(aclnn)**。把 AscendCL 理解成「昇腾的应用开发 SDK」就好:aclrt* 管资源,aclnn* 管算子。

6. 集合通信:HCCL

HCCL(Huawei Collective Communication Library) 是昇腾的集合通信库,负责多卡/多机之间的 AllReduce、AllGather、ReduceScatter、AlltoAll 等通信。

  • 单机内走 HCCS,跨机走 RoCE,HCCL 在软件层屏蔽底层差异。
  • 它对应 NCCL,是分布式训练(DDP/FSDP/TP 等)的通信底座。
  • 详细内容见本模块第 4 章。

7. 框架适配层:MindSpore / torch_npu

框架层是算法工程师的「主战场」:

  • MindSpore:华为自研 AI 框架,与昇腾深度绑定,图编译、算子选择、分布式策略都原生优化。
  • torch_npu:PyTorch 的昇腾适配插件,让现有 PyTorch 代码通过 .to('npu') 在昇腾上运行,底层把算子派发给 aclnn/昇腾算子库。
  • 其他框架(PaddlePaddle 等)也有昇腾适配,但主流的国产框架路线是 MindSpore + PyTorch(via torch_npu)。

8. 一条请求在 CANN 里走了多远

把各层串起来,看一次「用 PyTorch 在昇腾上做前向」的完整旅程:

1. 应用调用:output = model(input)      (框架层:torch_npu)
2. torch_npu 把算子派发给昇腾算子库/aclnn
3. AscendCL 申请资源:aclInit、Stream、内存
4. 计算图被图编译器拆分/融合为算子序列
5. Runtime 通过驱动把算子下发到芯片
6. AI Core 执行计算,数据在 HBM/L2/UB 间搬运
7. 结果通过 Runtime 回到应用

途中任何一个环节报错,都能通过「报错信息出现在哪一层」快速定位问题方向——这就是分层架构给开发者的红利。

总结

  • CANN = 昇腾异构计算架构,对标 NVIDIA CUDA 生态,从驱动到框架逐层分工。
  • 关键组件:驱动固件(HDK)→ 编译器(ATC/AKG)→ Runtime(aclrt)→ 算子库(aclnn)→ 通信(HCCL)→ 框架适配(MindSpore/torch_npu)。
  • 不同角色的工程师在不同的层工作;理解分层 = 理解问题归属与文档查找路径。
  • 上手昇腾第一步:按芯片型号装匹配的驱动固件 + CANN 软件包。

延伸阅读