CANN计算架构的一般流程理解【玩转华为云】
1 简介
本文以 Ascend / CANN 的常见路径为例(官方文档常把“算子开发”分为:Ascend C(C/C++算子)、TBE(Tensor Boost Engine)算子、以及用 ATC 把单算子 JSON 编译成离线模型等)。

步骤写成工程化 checklist,并附简短示例/伪代码,方便上手参考。
2 CANN(Ascend)算子开发:典型流程(工程化步骤 + 示例)
- 典型步骤(高层)
1 确认场景与算子需求:
例如要实现一个 fused-layer(如 fused_conv_bias_relu)或自定义 attention kernel(稀疏/分块 attention),先明确输入输出 shape、数据类型、属性(strides、dilation、axis 等)。
2 选择实现方式:
2.1 TBE(Python + TVM-like 接口/算子模板):
用于在 Ascend 上实现高性能张量算子(通常推荐复杂计算或需高度调优的核)。
2.2 scend C(C/C++)算子:
当逻辑需要用 C/C++ 写或访问底层 API 时使用。
2.3 单算子 JSON + ATC:
用于把一个单算子模型转换为可离线运行的 .om 文件(便于调试/验证)。
2.4 实现算子 kernel:
编写算子源码(TBE 脚本或 C++),实现前向 / 反向(若需要训练支持)以及 shape/type 检查。
2.5 注册算子(OP 注册表):
在 CANN 的注册机制中声明算子名、参数、输入输出类型等(registration metadata)。
2.6 编译与构建:
用 CANN/ATC 工具链把算子编译成可调用的二进制(shared lib)或生成离线模型(.om),并生成接口供框架调用(MindSpore/PyTorch/ONNX)。
2.7 联调测试:
编写单元测试(覆盖不同 shapes、dtype)、benchmark(latency / throughput / memory),与原实现(CPU/GPU)结果比对数值正确性。
2.8 集成到框架:
将算子打包并在框架中注册(例如在 MindSpore 中写 CustomOp,或在 ONNX Runtime 用 CANN EP),然后做端到端验证与性能对比。
3 示例:一个非常简化的算子实现结构文件组织
(注意:下面是结构和伪代码示例,具体 API/注册语法请参照官方文档和版本对应的示例代码)
my_custom_op/
├─ src/
│ ├─ my_op_tbe.py # TBE 实现(算子逻辑 + schedule)
│ └─ my_op_c.cpp # (可选)Ascend C 实现
├─ include/
│ └─ my_op.h
├─ meta/
│ └─ my_op.json # 单算子描述(name, inputs, outputs, attrs)
├─ build/
│ └─ build.sh # 使用 atc/cann 工具编译
└─ tests/
└─ test_my_op.py # 单元测试 + 性能测试
TBE 算子伪代码(极简意图示例)
my_op_tbe.py (伪代码)
def my_op_compute(inputs, attrs):
A = inputs[0] # [N, C, H, W]
B = inputs[1] # [C_out, C_in, Kh, Kw]
# 使用 TBE 提供的低级张量 API 进行计算、内存布局优化、切片、向量指令等
# 例如:先做 im2col,再用 matmul,再 reshape
out = tbe_im2col_matmul(A, B, attrs)
return out
-
注册 op metadata
def my_op_register(): register_op(name="MyFusedConv", inputs=[...], outputs=[...], attrs=[...]) set_compute_func(my_op_compute)
然后用 CANN 的构建脚本 / ATC 把它 link 编译成库 / om 文件。具体参数(如 atc --model, --framework, --input_shapes 等)参见 ATC 文档。
- 在框架中调用(示意)
在 MindSpore:把算子包成自定义算子插件(.so),并在算子注册表中声明,模型中直接替换对应层,或在导出 ONNX 后用 ONNX Runtime 的 CANN Execution Provider 加速(两种路径都可行)。
4 经典场景:
哪些算子常被做成自定义/融合 + 与 CANN 配合的优化点?
下面按场景给出常见自定义算子类型、为什么要自定义,以及如何借助 CANN 提升性能。
- 场景 A — 大规模 LLM 推理(低延迟 / 大批量吞吐)
常见自定义/融合算子:
fused_linear_bias_gelu、fused_layernorm、quantized_matmul、sparse_attention、flash_attention、自定义 rotary / pos-emb kernel。
为什么自定义:
减少 memory read/write、减少 kernel launch(把多步算子融合到单个内核),实现低精度(int8/fp16)量化内核以提高吞吐。
CANN 做法:
在 TBE/Ascend C 上实现 fused kernel,然后用 ATC 生成优化后的离线 model,或在导出 ONNX 后通过 CANN Execution Provider 让推理调用这些优化的内核。
结果是显著的延迟下降与吞吐提升(尤其在批量小、频繁请求的在线推理场景)。
- 场景 B — 实时视频分析 / 视觉推理流水线(摄像头流)
常见自定义算子:
AIPP(图像预处理)融合算子(resize + normalize + crop)、自定义 deformable-conv、NMS 的高性能实现、batch-merge 的 pre/post-processing kernels。
为什么自定义:
视频流要求端到端延迟低,常见瓶颈在预处理和后处理(NMS)上,融合可显著降低整体延时。
CANN 做法:把 AIPP 流程用 Ascend 的图像处理 API(或自定义算子)实现并融合到模型前端,用 ATC 优化 memory layout,直接输出可部署的 .om 推理包,部署在华为云的 Ascend 实例。
- 场景 C — 语音识别 / 语音合成(实时)
常见自定义算子:
高效的卷积 / GRU / LSTM cell(针对小序列的优化)、beam search 的并行化实现。
为什么自定义:
需要在保持精度的同时极限压缩延迟,尤其是在边缘设备或资源受限的云实例上。
CANN 做法:
实现低延迟的 RNN/LSTM kernel 或把 beam search 做成由硬件更友好的并行策略,然后编译后大幅降低推理延迟。
- 场景 D — 混合云/多加速器部署(多厂商)
在这种情况下:通常推荐把模型导出为 ONNX,然后在各云上使用对应的 Execution Provider(NVIDIA: CUDA EP;华为: CANN EP;
AWS: Neuron/Inferentia)进行编译/微调。CANN 提供了 ONNX 的 Execution Provider 支持以便把模型映射到 Ascend。
5 小结
华为 CANN / Ascend 文档与算子开发页(官方文档、ATC/算子开发示例)。
ONNX Runtime 的 CANN Execution Provider 介绍(如何在 ONNX 上跑 Ascend)。
华为 CANN 开源 / 行业新闻分析(关于开源与生态影响)。
AWS Neuron / Inferentia/Trainium 与 CustomOps 指南(示例、限制与框架适配说明)。
阿里云 PAI / AI Acceleration 方案与 Hanguang 芯片介绍(平台型方案说明)。
继续深入:
根据提供的一层/一段模型(例如某个 Transformer 层或 ConvBlock),把哪些节点值得做成 fused op列成清单并给出优先级与预估收益(操作级别分析)。
给出一个更具体的 CANN/TBE 算子模板代码(基于你指定的算子——比如 fused linear+gelu 或 flash attention)的示例实现(伪代码 + 构建/atc 命令行示例)。
把现有的 ONNX/TensorFlow 模型的关键算子映射到 CANN 可用的等价算子(并指出哪些需要自定义)。
参考资料(便于深入)参考:
onnxruntime.ai
hiascend.com
Amazon Web Services, Inc.
developer.huawei.com
- 点赞
- 收藏
- 关注作者
评论(0)