CANN计算架构的一般流程理解【玩转华为云】

举报
码乐 发表于 2025/11/02 07:22:52 2025/11/02
【摘要】 1 简介本文以 Ascend / CANN 的常见路径为例(官方文档常把“算子开发”分为:Ascend C(C/C++算子)、TBE(Tensor Boost Engine)算子、以及用 ATC 把单算子 JSON 编译成离线模型等)。步骤写成工程化 checklist,并附上简短示例/伪代码,方便上手参考。 2 CANN(Ascend)算子开发:典型流程(工程化步骤 + 示例)典型步骤(...

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
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。