原作者:严海峰 发布时间:2026-04-13
项目地址https://gitcode.com/cann/skills
本文档基于原 PDF《CANNBot入门:从0到1生成你的第一个算子》整理与扩展,在保留原文核心内容的基础上,补充了原理讲解、名词解释、代码示例和操作注意事项,力求让零基础读者也能循序渐进地完成第一个 Ascend C 算子的开发。


目录


第 0 章 阅读准备:你需要知道的基础概念

在正式开始之前,先理解几个贯穿全文的关键概念,会让后面的学习顺畅很多。

0.1 什么是「算子」(Operator)

在深度学习框架(如 PyTorch、MindSpore)中,一个神经网络的每一层,底层本质上都是由一个个基础的数学运算组成的,这些基础运算就是算子(Operator)。常见的算子包括:

  • 绝对值 Absy = |x|
  • 加法 Add、乘法 Mul
  • 矩阵乘法 MatMul
  • 卷积 Conv、池化 Pooling
  • 归约类(求和、求最大值)Reduce

所谓「开发一个算子」,就是为某个特定的硬件平台(这里是昇腾 NPU)编写高性能的底层计算实现,让上层的神经网络可以高效地调用它。

0.2 什么是 CANN 与 Ascend C

  • CANN(Compute Architecture for Neural Networks)是华为昇腾(Ascend)AI 处理器配套的异构计算架构,为开发者提供了一套从算子开发到模型部署的完整工具链。
  • Ascend C 是 CANN 提供的算子开发编程语言/编程模型,它基于 C++ 扩展,让开发者可以用贴近 C++ 的语法,直接编写运行在 NPU AI Core 上的高性能 Kernel 代码。

简单理解:Ascend C 就是「写给昇腾 NPU 的 C++」

0.3 什么是 CANNBot

CANNBot 是一套面向 CANN 开发的智能体(AI Agent)系统,它的目标是让「开发算子」这件事从「需要深厚硬件功底的手工活」变成「用自然语言描述需求,AI 自动完成方案设计、代码编写、质量审查」的高效流程。

核心理念:让 Ascend C 算子开发触手可及

0.4 几个高频名词速览

名词含义
Kernel运行在 NPU AI Core 上的核心计算代码(算子实现的核心)
Tiling把大块数据切分成小块、分配到多个 AI Core 并行执行的策略
GMGlobal Memory,全局内存(芯片外的存储)
UBUnified Buffer,统一缓冲区(AI Core 内的片上高速存储)
L1AI Core 内部的一级缓存/缓冲区
AI CoreNPU 上的核心计算单元,一颗芯片上通常有多个
block_dimTiling 中切分的核数(用多少个 AI Core 并行)
float16 / fp16半精度浮点数,占用 2 字节
msprof / msprof op昇腾的性能剖析工具

第 1 章 CANNBot 概述

1.1 CANNBot 是什么

CANNBot 是面向 CANN 开发的系列智能体,旨在提升开发效率。它提供可复用的 Skills(技能模块),目前已实现 Ascend C / PyPTO 算子开发全流程覆盖,未来将拓展至 CANN 更多技术领域。

几个关键数字:

  • 20+ 个 Skills 技能模块
  • 7 个开发阶段(标准化工作流)
  • 3 层架构(应用编排层 / 角色执行层 / 知识能力层)

1.2 核心价值

  1. 标准化开发工作流:自动完成「方案设计 → 编写代码 → 审查质量」全流程;
  2. 可编译产出:输出包含 Kernel 和 Tiling 的、可直接编译运行的代码;
  3. 质量保障:内置代码审查、精度调试、性能验收等环节。

1.3 目标用户

  • CANN 社区开发者
  • 昇腾 NPU 平台 AI 应用开发者
  • Ascend C / PyPTO 算子开发者
  • 希望贡献 Skills / Agents 的社区贡献者

1.4 CANNBot 三层架构

CANNBot 采用了清晰的三层架构,自上而下分别是:

┌─────────────────────────────────────────────────┐
│  TEAMS(应用编排层)                               │
│  pypto-op-orchestrator                           │
│   ├─ ops-direct-invoke  (Ascend C Kernel 直调)  │
│   ├─ ops-registry-invoke (PyPTO 算子开发)        │
│   └─ (Ascend C 自定义算子开发流程,规划中)        │
├─────────────────────────────────────────────────┤
│  AGENTS(角色执行层)                              │
│  architect / analyst  方案设计、需求分析           │
│  developer            代码开发                    │
│  reviewer             代码检视                    │
│  perf-tuner / tester  性能调优、测试(规划中)      │
├─────────────────────────────────────────────────┤
│  SKILLS(知识能力层)                              │
│  npu-arch / tiling-design / api-best /           │
│  precision / runtime                            │
└─────────────────────────────────────────────────┘
  • 编排层(Teams):编排 Agents,定义开发流程和协作模式;
  • 执行层(Agents):绑定 Skills,执行具体的开发任务;
  • 能力层(Skills):提供知识能力,支撑 Agent 执行任务。

打个比方:Teams 是「项目经理」,Agents 是「分工明确的工程师团队」,Skills 是「工程师手中的工具书和知识库」。

1.5 CANNBot Skills 全景图

Skills 按用途分为几大类:

分类Skills说明
知识库类ascendc-npu-archascendc-tiling-designascendc-api-best-practicesascendc-docs-searchNPU 架构、Tiling 设计、API 最佳实践、文档检索
调试测试类ascendc-precision-debugascendc-runtime-debugops-profilingops-precision-standard精度调试、运行时调试、性能剖析、精度标准
工程模板类ascendc-registry-invoke-to-direct-invokeascendc-direct-invoke-template工程模板与调用方式转换
测试开发类ascendc-st-designascendc-ut-develop系统测试设计、单元测试开发
工具辅助类ascendc-env-checkascendc-code-reviewascendc-task-focusascendc-whitebox-design环境检查、代码审查、任务聚焦、白盒设计

第 2 章 环境搭建

2.1 环境要求与前置条件

硬件要求
项目要求
昇腾 NPU 设备Ascend 910 及后续系列产品
内存建议 16GB 以上
存储建议 50GB 可用空间
软件要求
项目要求
CANN 版本8.0.RC2 及以上
操作系统EulerOS 2.10 / CentOS 7.6 / Ubuntu 18.04+
CLI 工具OpenCode、Claude Code 等
环境检查清单
检查项达标标准
NPU 设备就绪npu-smi info 能正常输出
CANN 已安装版本 ≥ 8.0.RC2
CLI 工具就绪OpenCode / Claude Code 可正常启动
网络连接能访问 GitCode 仓库

推荐云开发环境:CANN 社区云开发环境支持一键启动,NPU 设备、CANN 环境、OpenCode 工具等依赖均已默认安装,可大幅降低入门门槛。

2.2 安装方式一:脚本安装(推荐)

仓库提供 init.sh 初始化脚本,负责安装 Skills 技能模块Agents 配置asc-devkit 工具包,并生成配置文件(opencode.json / CLAUDE.md)。

方式 A:项目级安装(推荐)

配置仅对当前项目生效,适合多项目开发场景。

# 1. 克隆 CANN Skills 仓库
git clone https://gitcode.com/cann/skills.git

# 2. 进入算子直调示例目录
cd skills/ops/teams/ops-direct-invoke

# 3. 执行初始化脚本(OpenCode 用户)
bash init.sh project opencode

# 3. 执行初始化脚本(Claude 用户)
bash init.sh project claude
方式 B:全局安装

配置在用户目录下全局生效,适合单一项目开发场景。

# 1-2 步同上(克隆仓库并进入目录)

# 3. 执行初始化脚本(全局,OpenCode 用户)
bash init.sh global opencode

# Claude 用户
bash init.sh global claude
安装路径对比
安装方式OpenCodeClaude
项目级.opencode/.claude/
全局~/.config/opencode/~/.claude/

2.3 安装方式二:手动安装

手动安装仅安装 Skills 和 Agents,适用于自定义配置场景。如果你需要灵活控制安装位置或修改配置,可以选择手动安装。注意保持符号链接的正确性,确保 CLI 工具能正确加载 Skills 和 Agents。

OpenCode 用户
# 1. 克隆 CANN Skills 仓库
git clone https://gitcode.com/cann/skills.git

# 2. 进入 skills 目录
cd skills/

# 3. 创建 .opencode 目录
mkdir -p .opencode

# 4. 创建 Skills 符号链接
ln -s ../ops/skills .opencode/skills

# 5. 创建 Agents 符号链接
ln -s ../ops/agents .opencode/agents

# 6. 复制 AGENTS.md
cp AGENTS.md .opencode/AGENTS.md
Claude 用户
# 1. 克隆 CANN Skills 仓库
git clone https://gitcode.com/cann/skills.git

# 2. 进入 skills 目录
cd skills/ops/

# 3. 创建 .claude 目录
mkdir -p .claude

# 4. 创建 Skills 符号链接
ln -s ../ops/skills .claude/skills

# 5. 创建 Agents 符号链接
ln -s ../ops/agents .claude/agents

# 6. 复制 AGENTS.md
cp AGENTS.md .claude/CLAUDE.md

2.4 环境校验与启动

目录结构校验

安装完成后,检查目录结构是否符合规范:

skills/ops/teams/ops-direct-invoke/
├── .opencode/
│   ├── skills/              # 技能模块
│   │   ├── ascendc-kernel-develop-workflow/
│   │   ├── ascendc-docs-search/
│   │   └── ...
│   ├── agents/              # 子代理
│   ├── AGENTS.md            # Agent 配置
│   └── opencode.json        # opencode 配置
├── init.sh                  # 初始化脚本
└── quickstart.md            # 快速入门文档
校验检查项
检查项达标标准
Skills 目录存在.opencode/skills/ 目录不为空
Agents 目录存在.opencode/agents/ 目录不为空
配置文件正确AGENTS.mdopencode.json 存在
CLI 能正常启动opencode 命令无报错
启动 CLI 工具

在初始化完成的目录下执行以下命令启动交互界面:

# 启动 OpenCode CLI
opencode

# 启动后,输入算子开发需求
帮我开发一个 abs 算子,支持 float16...
常见问题
问题解决方案
如何查看帮助?bash init.sh --help
如何更新 Skills?重新执行 init.sh 即可
安装失败怎么办?检查 CANN 版本和网络连接

第 3 章 核心工作流

3.1 Ascend C:七阶段开发工作流

CANNBot 将算子开发过程标准化为七个阶段

┌────┐  ┌────┐  ┌────┐  ┌────┐  ┌────┐  ┌────┐  ┌────┐
│ 1  │→ │ 2  │→ │ 3  │→ │ 4  │→ │ 5  │→ │ 6  │→ │ 7  │
│环境│  │需求│  │算子│  │验证│  │问题│  │性能│  │总结│
│检查│  │分析│  │实现│  │优化│  │处理│  │验收│  │报告│
└────┘  └────┘  └────┘  └────┘  └────┘  └────┘  └────┘

工作流三大特点:

  1. 质量控制:每个阶段完成后才能进入下一阶段,确保开发质量;
  2. 迭代优化:阶段 4–5 支持循环迭代,持续优化算子性能;
  3. Agent 驱动:每个阶段由专门 Agent 执行,自动完成各项任务。

工作流触发:所有算子开发任务会自动加载 ascendc-kernel-develop-workflow 技能,按阶段执行。详见 AGENTS.md 配置文件。

3.2 阶段 1–2:环境检查与需求分析

阶段 1 环境检查

确保开发环境就绪:

检查项说明
NPU 设备查询检查 NPU 是否可用,获取设备信息
CANN 环境验证检查 CANN 版本、环境变量配置
依赖检查验证必要的库和工具是否安装

相关 Skill:ascendc-env-check(自动执行环境检查)。

阶段 2 需求分析

理解算子功能和要求:

分析项说明
算子功能理解分析算子的数学表达式和计算逻辑
数据类型确定支持的数据类型(float16 / float32 等)
Shape 分析输入输出 Tensor 的 Shape 范围
性能要求吞吐量、延迟等性能指标

Agent 自动化:CANNBot 的 architect Agent 会自动分析需求,调用 ascendc-npu-archascendc-api-best-practices Skills,生成设计方案。

3.3 阶段 3:算子实现

阶段 3 是核心,包含 Tiling 设计Kernel 开发两部分。

3.3.1 Tiling 设计

什么是 Tiling?

Tiling 是将大规模数据计算任务切分成小块,分配到多个 AI Core 并行执行的技术。合理的 Tiling 策略能显著提升算子性能。

Tiling 数据结构示例:

// Tiling 参数示例
struct AddTiling {
    uint32_t blockDim;   // 核数
    uint32_t tileSize;   // 块大小
    uint32_t totalSize;  // 总大小
    uint32_t splitAxis;  // 切分轴
};

Tiling 设计方法论(四步):

  1. 分析数据特征:理解输入数据的 Shape、数据类型、访问模式;
  2. 确定切分策略:选择合适的切分维度(N/H/W/C 等);
  3. 计算 Tiling 参数:计算 block_dimtile_size 等参数;
  4. Buffer 规划:合理分配 GM、UB、L1 内存。

切分策略主要有两类:

  • 多核切分:将数据分配到多个 AI Core;
  • UB 切分:适配 Unified Buffer 容量。

自动 Tiling 设计:CANNBot 根据算子类型自动选择合适的 Tiling 方案:

  • Element-wise 算子 → 按数据块均匀切分;
  • Reduce 算子 → 按 Reduce 轴切分;
  • MatMul 算子 → 分块矩阵乘法策略。

调用 ascendc-tiling-design Skill 自动生成。

3.3.2 Kernel 开发

Kernel 代码生成:CANNBot 自动生成符合 Ascend C 规范的 Kernel 代码,包括数据搬入、计算、数据搬出三个核心步骤。

Kernel 函数结构:

// Kernel 函数结构
extern "C" __global__ __aicore__ void
abs_kernel(...) {
    // 1. 数据从 GM 搬入 UB
    DataCopy(xUB, xGM, size);

    // 2. 执行计算(Abs)
    Abs(zUB, xUB, size);

    // 3. 数据从 UB 搬出到 GM
    DataCopy(zGM, zUB, size);
}

这里的「搬入 → 计算 → 搬出」是 Ascend C Kernel 最经典的三段式结构,对应 GM(慢)→ UB(快)→ GM(慢)的数据流转。

代码生成流程(四步):

  1. 分析需求:理解算子功能和数据特征;
  2. 选择模板:基于算子类型选择代码模板;
  3. 生成代码:填充模板生成完整 Kernel 代码;
  4. 优化调整:应用最佳实践和性能优化。

产出物结构:

ops/{operator}/
├── CMakeLists.txt
├── {operator}_kernel.asc
├── build.sh
├── run.sh
├── scripts/
├── docs/
│   ├── DESIGN.md
│   └── PLAN.md
└── tests/

代码质量保证(由 developer Agent 自动完成):

  • 遵循 API 最佳实践
  • 符合 NPU 架构特性
  • 自动内存对齐
  • 流水线优化

3.4 阶段 4–5:验证优化与问题处理

阶段 4 验证与优化
环节说明相关 Skill
编译算子使用 build.sh 编译生成算子二进制文件
运行测试执行 run.sh 验证算子功能正确性
性能分析使用 profiling 工具分析性能瓶颈
# 编译和测试
bash build.sh
bash run.sh
阶段 5 问题处理
环节说明相关 Skill
精度调试对比 CPU 和 NPU 输出,定位精度问题ascendc-precision-debug
运行时调试解析错误码,排查 Kernel 挂起等问题ascendc-runtime-debug
自动修复CANNBot 自动诊断并提供修复建议
  • 迭代优化:阶段 4–5 支持循环迭代,持续优化直到满足要求;
  • 智能诊断:Agent 自动分析问题并提供解决方案。

3.5 阶段 6–7:性能验收与总结

阶段 6 性能验收
环节说明
性能数据采集调用 msprof op 采集 8 个 CSV 指标文件
性能达标判定对照性能标准判定是否达标
瓶颈定位与优化定位瓶颈类型并给出优化建议
最终判定PASS / PASS WITH NOTES / FAIL

性能验收流程:调用 ops-profiling Skill → 数据归档到 perf/ 目录。

阶段 7 完成总结
环节说明
总分与代码路径汇总开发结果
性能概要Task Duration、主导流水、达标状态
关键问题列表记录开发过程中遇到的问题
文档归档DESIGN.md / PLAN.md / REVIEW.md / WALKTHROUGH.md

第 4 章 实操演示:从 0 到 1 开发 Abs 算子

本章通过一个完整的实例,带你走完整个开发流程。

4.1 实操场景设定

算子需求

开发一个 Abs(绝对值)算子,用于计算输入张量每个元素的绝对值。这是深度学习中的基础算子,广泛应用于各种神经网络模型。

  • 数学表达式y = |x|
  • 计算内容:计算输入张量的绝对值
技术要求
项目要求
数据类型float16
计算精度1e-3
支持的 Shape[1, 128][4, 2048][32, 4096]
输入输出示例
// 输入数据
x = [-1.5, 2.0, -3.5, 4.0]

// 输出结果
y = [1.5, 2.0, 3.5, 4.0]
开发流程预览
1. 启动 CANNBot 并输入需求
2. 自动设计方案与代码生成
3. 代码审查与质量保障
4. 编译运行与验证

预计耗时:约 1 小时

4.2 Step 1:启动 CANNBot 并输入需求

启动 CLI 工具

在初始化完成的目录下执行 opencode 命令,启动交互式开发环境:

# 进入项目目录
cd skills/ops/teams/ops-direct-invoke

# 启动 OpenCode CLI
opencode

# 成功启动后显示
OpenCode > _
输入算子开发需求

在交互界面中输入以下算子开发需求:

帮我开发一个 abs 算子,支持 float16 数据类型,shape 主要是 [1,128]、[4,2048]、[32,4096]
需求要素解析
需求要素取值
算子类型Abs(绝对值)
数据类型float16
Shape 范围[1,128][4,2048][32,4096]
CANNBot 响应流程
  1. 自动加载工作流:加载 ascendc-kernel-develop-workflow
  2. 确认需求理解:Agent 复述需求确保理解正确;
  3. 进入阶段 0:开始环境检查。

提示技巧:描述要清晰具体;明确数据类型和 Shape;可以补充性能要求。

4.3 Step 2:自动设计方案与代码生成

自动设计方案

CANNBot 的 architect Agent 自动完成 Tiling 设计和方案规划:

设计项方案
Tiling 策略按数据块均匀切分,适配多核并行
Buffer 规划合理分配 GM、UB 内存空间
并行策略利用多个 AI Core 并行计算
API 选择使用 Ascend C 内置 Abs 高阶 API
代码生成过程
  1. 分析 Abs 算子特性(Element-wise);
  2. 选择 Element-wise 算子代码模板;
  3. 生成 Kernel、Tiling、Host 代码;
  4. 填充 Tiling 参数和 Shape 信息。
自动生成的代码示例
// Abs Kernel 核心代码
Abs(zUB, xUB, size);

CANNBot 自动生成符合 Ascend C 规范的代码,包含完整的数据搬入、计算、数据搬出流程。

产出物结构
ops/abs/
├── CMakeLists.txt
├── abs_kernel.asc
├── build.sh
├── run.sh
├── scripts/
├── docs/
│   ├── DESIGN.md
│   └── PLAN.md
└── tests/
代码特点
  • 符合 Ascend C 编程规范
  • 使用高阶 API 提升性能
  • 自动内存对齐和优化
  • 完整的编译和运行脚本

4.4 Step 3:代码审查与质量保障

CANNBot 的 reviewer Agent 自动进行多维度代码审查,确保代码质量和性能。

5 大类别规范
类别检查内容
代码风格命名规范、缩进、注释
性能内存访问、并行度、流水线
安全内存越界、空指针检查
可维护性模块化、可读性、可测试性
正确性算法实现、边界条件
检视内容示例
检视项结果
内存对齐检查(UB 内存是否 32 字节对齐)✅ 通过
API 使用规范(是否遵循最佳实践)✅ 通过
流水线优化(是否使用双缓冲和流水线)✅ 通过

4.5 Step 4:编译运行与验证

编译算子
# 进入算子目录
cd ops/abs

# 执行编译脚本
bash build.sh

# 编译成功输出
[100%] Built target abs_custom
运行测试
# 执行测试脚本
bash run.sh

# 测试成功输出
[INFO] Input:  [-1.5, 2.0, -3.5, 4.0]
[INFO] Output: [1.5, 2.0, 3.5, 4.0]
[INFO] Expect: [1.5, 2.0, 3.5, 4.0]
[PASS] Test passed!

恭喜!你的第一个算子开发完成!

验证要点
  • ✅ 功能正确性
  • ✅ 精度达标(< 1e-3)
  • ✅ 性能满足要求
  • ✅ 多 Shape 支持
产出物说明
文件说明
docs/DESIGN.mdPLAN.md需求设计文档、开发计划
abs_kernel.ascKernel 实现代码
test/测试用例代码
build.sh / run.sh编译和运行脚本

第 5 章 常见问题与排错

5.1 安装阶段

问题排查思路
无法克隆仓库检查网络能否访问 GitCode,尝试配置代理
init.sh 执行报错先运行 bash init.sh --help 查看用法,确认参数正确
CLI 无法加载 Skills检查符号链接是否正确,目录结构是否符合规范
CANN 版本过低升级到 8.0.RC2 及以上

5.2 环境检查阶段

问题排查思路
npu-smi info 无输出检查 NPU 驱动是否安装、设备是否就绪
环境变量缺失确认 source 了 CANN 的 set_env.sh

5.3 开发与验证阶段

问题排查思路
编译失败检查 CANN 版本、头文件路径、CMake 配置
精度不达标使用 ascendc-precision-debug 对比 CPU/NPU 输出定位
Kernel 挂起使用 ascendc-runtime-debug 解析错误码排查
性能不达标使用 ops-profiling(msprof op)定位瓶颈并优化

5.4 通用建议

  1. 需求描述要具体:明确数据类型、Shape 范围、精度和性能要求;
  2. 善用云开发环境:新手优先使用 CANN 社区云开发环境,避免环境配置踩坑;
  3. 按阶段推进:每阶段验收通过后再进入下一阶段,减少返工;
  4. 善用文档DESIGN.md / PLAN.md / REVIEW.md / WALKTHROUGH.md 记录了完整开发过程,遇到问题先查文档。

附录 快速参考

A. 关键命令速查

# —— 安装 ——
git clone https://gitcode.com/cann/skills.git
cd skills/ops/teams/ops-direct-invoke
bash init.sh project opencode    # 项目级安装(OpenCode)
bash init.sh project claude      # 项目级安装(Claude)
bash init.sh global opencode     # 全局安装(OpenCode)

# —— 启动 ——
opencode                          # 启动 OpenCode CLI

# —— 编译与测试 ——
cd ops/abs
bash build.sh                     # 编译算子
bash run.sh                       # 运行测试

# —— 其他 ——
bash init.sh --help               # 查看帮助
npu-smi info                      # 查看 NPU 设备信息

B. 七阶段工作流一览

阶段名称核心任务相关 Skill/Agent
1环境检查NPU/CANN/依赖就绪ascendc-env-check
2需求分析功能、类型、Shape、性能architect Agent
3算子实现Tiling 设计 + Kernel 开发ascendc-tiling-design、developer Agent
4验证优化编译、测试、性能分析
5问题处理精度/运行时调试、自动修复ascendc-precision-debugascendc-runtime-debug
6性能验收msprof op 采集、达标判定ops-profiling
7总结报告汇总结果、文档归档

C. 关键术语表

术语全称含义
CANNCompute Architecture for Neural Networks昇腾 AI 异构计算架构
Ascend C面向 NPU 的算子开发编程模型
Kernel运行在 AI Core 上的核心计算代码
Tiling数据切分与多核并行策略
GMGlobal Memory全局内存
UBUnified Buffer统一缓冲区(片上高速存储)
AI CoreNPU 核心计算单元
msprof昇腾性能剖析工具
Element-wise逐元素运算(如 Abs、Add)

D. 社区信息

  • 项目地址https://gitcode.com/cann/skills
  • 社区愿景:打造开放易用、技术领先的 AI 算力新生态
  • 社区使命:使能开发者基于 CANN 社区自主研究创新,构筑根深叶茂、跨产业协同共享共赢的 CANN 生态

本文档到此结束。现在,开始您的 CANNBot 之旅!让 Ascend C 算子开发触手可及!

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐