CANN到底是什么?昇腾NPU上的“操作系统+发动机调校师“全拆解
前言
上个月帮一个做大模型推理的团队排查性能问题,他们买了 8 张昇腾 NPU 卡,跑 LLaMA 7B 推理,结果吞吐量只有 GPU 的三分之一。我看了他们的代码——PyTorch 模型直接 torch_npu 跑的,一行 CANN 相关的东西都没碰。
问题不在卡,在他们根本没用对 CANN。
很多人第一次接触昇腾生态,看到 CANN、AscendCL、GE、ATC 这些名词就头大。官方文档又写得像法律条文,看完还是不知道这东西到底在干什么。今天我用最接地气的方式,把 CANN 拆开来讲清楚。
CANN 到底是什么?
一句话:CANN 是昇腾 AI 硬件的软件栈,相当于 GPU 上的 CUDA + cuDNN + TensorRT 打包在一起,但比那个体系更复杂。
打一个通俗的比方:你买了一辆赛车(昇腾 NPU 硬件),引擎很强,但你不能直接往油箱里倒油就上路。你需要:
- 操作系统让车能启动
- 变速箱把引擎动力合理分配到轮子
- 调校师根据赛道特点调整引擎参数
CANN 就是这三样东西的集合体。它不是某一个工具,而是一整套从模型到芯片的中间层软件。
昇腾 CANN 全称是昇腾异构计算架构(Compute Architecture for Neural Networks),注意不是什么编译器,也不是某个单一组件的名字。它是整个软件体系的总称。
CANN 和昇腾芯片的关系
昇腾芯片(比如 Ascend 910)是硬件。光有硬件跑不起来,需要一整套软件把它驱动起来。
你的 PyTorch / MindSpore 模型
↓ 框架适配层
CANN(中间层软件栈)
↓ 驱动 + Runtime
昇腾 NPU 硬件(达芬奇架构)
你在框架里写的 Python 代码,NPU 看不懂。CANN 干的事就是翻译 + 调度 + 优化,让你的模型能在 NPU 上跑起来,而且跑得快。
2025 年 8 月,CANN 已经全面开源了。55 个仓库在 AtomGit 上都能看到,编译器、算子库、加速库、图引擎、运行时全部开放。
CANN 五层架构:每层都在干啥
第一层:AscendCL —— “对外营业的窗口”
这一层的核心是 AscendCL(Ascend Computing Language),是 CANN 对外暴露的编程接口。所有上层框架(PyTorch、MindSpore、TensorFlow)都是通过它来调用昇腾 NPU 的。
它提供三类接口:
- 应用开发接口:推理、预处理、单算子调用
- 图开发接口:统一构图,支持多框架
- 算子开发接口:用 Ascend C 写自定义算子的入口
Ascend C(注意中间有空格)是算子编程语言,类似 CUDA C 在 NVIDIA 生态里的地位,但语法和编程模型完全针对昇腾达芬奇架构设计。
第二层:计算服务层 —— “工具柜”
这一层放的是各种现成的算子和调优工具:
- AOL 算子库:卷积、矩阵乘法、激活函数这些基础算子,开箱即用
- AOE 调优引擎:自动帮你调优模型性能,不用手动试参数
- Framework Adaptor:让不同框架能无缝对接下面的编译和执行层
对应到开源仓库,ops-transformer、ops-nn、ops-math 这些算子库都属于这一层。ops-transformer 专门放大模型里的 FlashAttention、MoE 这类高级算子。
第三层:计算编译层 —— “AI模型的流水线调度员”
这一层的主角是 GE(Graph Engine,图引擎)。
为什么需要图引擎?因为你写的 PyTorch 代码是动态图(一行行执行),但 NPU 更适合拿到完整的计算图,然后一次性规划怎么执行最高效(静态图执行)。
GE 干的事情:
- 把你的模型转换成计算图
- 做图优化:算子融合、内存复用、并行调度
- 把优化后的图交给下层去执行
这一层还有 ATC 工具(Ascend Tensor Compiler),一个命令行工具,把你训练好的模型(.onnx 格式)转成昇腾 NPU 能直接跑的离线模型(.om 格式)。
第四层:计算执行层 —— “芯片资源的管理员”
图编译好了,总得有人真正去驱动硬件执行。Runtime 运行时干的就是这个活:
- 给模型分配显存
- 把算子加载到 NPU 上执行
- 管理 NPU 的计算单元、显存带宽这些资源
- 处理多任务并发
这一层还有 HCCL(集合通信库,多卡并行训练时用它做 AllReduce)和 DVPP(数字视觉预处理,在 NPU 上直接做图片解码和缩放)。
第五层:计算基础层 —— “地基”
最底层的驱动和系统服务,普通开发者基本不会直接碰到。包括芯片驱动(DRV)、资源管理、虚拟内存管理这些。
一个真实场景:跑 PyTorch 模型时 CANN 在干什么?
假设你有一个 ResNet-50 的 PyTorch 模型,想在昇腾 NPU 上做推理:
import torch
import torch_npu
model = torchvision.models.resnet50(pretrained=True)
model = model.to("npu:0") # 搬到 NPU 上
model.eval()
img = torch.randn(1, 3, 224, 224, device="npu:0")
with torch.no_grad():
output = model(img)
看起来很简单,但背后发生了一连串事情:
1. import torch_npu —— 加载 Framework Adaptor,注册 NPU 作为 PyTorch 的新后端。
2. .to("npu:0") —— torch_npu 通过 AscendCL 跟 CANN 建立连接,调用 Runtime 申请 NPU 设备资源,把模型参数从 CPU 内存搬到 NPU 显存里。
3. 动态图转静态图 —— PyTorch 是动态图的,但 GE 图引擎更擅长处理静态图。torch_npu 会把你的模型进行图捕获,转成 GE 能处理的计算图格式。
4. GE 做图优化 —— 拿到计算图之后:把 Conv+BN+ReLU 融合成一个算子(减少内存读写)、合并小矩阵乘法(提高计算密度)、规划显存分配(减少峰值占用)。
5. Runtime 执行 —— 优化后的图每个节点都是一个算子,Runtime 拿到执行计划,分配显存,按拓扑顺序把算子加载到 NPU 的 AI Core 上执行。
整个过程对你来说是透明的。你只写了 10 行 Python,但 CANN 在背后干了上百件事。
另一个场景:用 ATC 工具转离线模型
如果你要做生产级部署,一般会先用 ATC 把模型转成离线的 .om 文件:
atc --model=resnet50.onnx \
--framework=5 \
--output=resnet50_npu \
--soc_version=Ascend910 \
--input_shape="actual_input_1:1,3,224,224"
这条命令背后:
- ATC 解析 ONNX 模型文件,构建计算图
- GE 引擎对图做优化(融合、常量折叠、布局调整)
- 选择最优的算子实现(同一个算子可能有多种实现,GE 根据输入形状选最快的)
- 编译生成 .om 离线模型文件
- 这个 .om 文件可以直接用 AscendCL 的推理 API 加载执行,不需要再经过图编译阶段
离线模型把编译阶段的工作提前做完了,推理的时候直接加载执行,启动更快,延迟更低。
CANN 开源仓库怎么找自己需要的?
55 个仓库在 AtomGit 上都能看到,按用途分类:
算子库(模型间接调用,也可直接调用):ops-transformer(FlashAttention/MoE/MC2)、ops-nn、ops-math、ops-blas、ops-cv
加速库(想榨干性能就看这些):ascend-transformer-boost(ATB,Transformer 加速库)、catlass(算子模板库)
基础设施(底层核心):ge(图引擎)、runtime(运行时)、hccl(集合通信)
学习资源(新手必看):cann-learning-hub(社区教程)、cann-samples(示例代码)、cann-recipes-infer(推理最佳实践)
新手入门路径
第一步:装好 CANN 环境,用 PyTorch + torch_npu 跑通一个简单的推理任务。cann-recipes-infer 里有很多现成的例子。
第二步:学会用 ATC 把自己的模型转成 .om 文件,理解计算图和算子融合是什么。转换时加 --log=info,看 GE 做了哪些优化。
第三步:理解 GE 和 Runtime 各自负责什么。GE 管"怎么编排计算图",Runtime 管"怎么把计划扔给硬件执行"。遇到性能问题,先查这两层。
第四步(进阶):需要做性能调优或开发自定义算子时,再深入 ops-* 算子库和 Ascend C 编程。
总结
CANN 说复杂也复杂——五层架构、55 个开源仓库。说简单也简单——它就是一套让 AI 模型能在昇腾 NPU 上高效运行的软件体系,核心就三件事:翻译(框架代码 → NPU 指令)、调度(GE 规划最优执行路径)、优化(算子融合、内存复用)。
对于大多数开发者,不需要精通每一层。理解这三件事,再看具体组件和工具,就不会迷失方向。昇腾生态正在快速成熟,CANN 全面开源意味着你可以真正去看 GE 的源码、给 ops-transformer 提 PR。
https://atomgit.com/cann/community https://atomgit.com/cann/cann-learning-hub
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)