文档/操作指南/相关实践/算子开发
算子开发
使用 Kerminal 快速完成自定义算子的开发、优化和验证
——本指引将帮助你使用 Kerminal 快速完成自定义算子的开发、优化和验证工作。
一、适用场景
- 为国产芯片(如昇腾)开发自定义算子
- 将现有算子从 CUDA 迁移到 Ascend C
- 优化已有算子的性能
- 实现最新论文中的新算法算子
二、准备工作
2.1 环境要求
| 项目 | 要求 |
|---|---|
| 硬件 | 目标芯片服务器(如昇腾 910B) |
| 开发工具 | 算子开发工具链(如 CANN Toolkit) |
| 文档资料 | 平台编程范式说明、API 文档、代码示例(可选) |
| Kerminal | 已安装并配置密钥 |
2.2 安装 Kerminal
安装流程
支持三种平台的安装脚本
Mac / Linux:
curl -fsSL https://release.kerminal.cn/install.sh | bash
Windows:请使用 PowerShell 终端下载安装
irm https://release.kerminal.cn/install.ps1 | iex
看到猫咪图案即启动成功。
2.3 准备参考资料(可选)
如果有以下资料,可放入工作目录供 Kerminal 参考:
- 算子定义文档
- 参考实现代码
- 相关论文 PDF
- 代码规范要求
三、快速开始
3.1 启动任务
用自然语言描述你的需求:
我需要用 Ascend C 实现一个 mhc_post 算子
或者更具体:
帮我实现 DeepSeek 论文中的 mhc_post 算子,用于 hyper-connections 模块
3.2 Kerminal 自动执行流程
Kerminal 会按以下流程自动完成开发:
┌─────────────────────────┐
│ • 需求理解 │ 分析算子功能、查阅论文/文档
└─────────┬───────────────┘
▼
┌─────────────────────────┐
│ • 算子定义 │ 确定输入输出、计算逻辑
└─────────┬───────────────┘
▼
┌─────────────────────────┐
│ • 参考实现 │ 编写 CPU 版本作为基准
└─────────┬───────────────┘
▼
┌─────────────────────────┐
│ • Kernel 开发 │ 实现目标平台算子代码
└─────────┬───────────────┘
▼
┌─────────────────────────┐
│ • 测试验证 │ 精度对比、多参数覆盖
└─────────┬───────────────┘
▼
┌─────────────────────────┐
│ • 输出交付 │ 代码 + 工程结构 + 文档
└─────────────────────────┘
四、开发流程详解
4.1 需求理解
Kerminal 会自动:
- 联网搜索相关论文和实现
- 分析参考代码提取核心逻辑
- 理解算子的数学含义
示例:对于 mhc_post 算子,Kerminal 自动查阅 DeepSeek 论文,提取公式:
4.2 算子定义
Kerminal 会生成清晰的算子规格:
| 属性 | 示例 |
|---|---|
| 输入 | x: [totalLength, dim],weight: [numStreams] |
| 输出 | y: [totalLength × numStreams, dim] |
| 计算逻辑 | 将每个 token 复制 numStreams 份,每份乘以对应权重 |
4.3 Kernel 实现
Kerminal 会根据目标平台特性优化实现:
Ascend C 实现要点:
- 多核并行切分策略
- 双缓冲队列流水优化
- 向量指令对齐要求
- 内存搬运与计算重叠
4.4 测试验证
Kerminal 采用测试先行的开发方式:
- CPU 参考实现:作为正确性基准
- 随机测试数据:覆盖多种输入规模
- 精度对比:逐元素校验(默认容差 rtol=1e-6, atol=1e-6)
- 硬件验证:在真实芯片上运行
五、常用命令示例
从零开发算子
用 Ascend C 实现一个 softmax 算子
帮我写一个矩阵乘法 kernel
实现论文 xxx 中的 attention 算子
算子迁移
把这个 CUDA kernel 转成 Ascend C
帮我把 PyTorch 自定义算子迁移到昇腾
算子优化
优化这个算子的性能
分析一下性能瓶颈在哪里
内存访问能不能优化一下
问题排查
精度对不上,帮我查一下原因
编译报错了怎么解决
运行时 crash 了
六、最佳实践
推荐做法
- 提供参考资料: 论文、代码、文档越完整,开发效果越好
- 硬件在环开发: 直接在目标硬件上开发和验证
- 先正确后优化: 确保精度验证通过后再追求性能
- 多规模测试: 覆盖不同输入规模和边界条件
- 保留中间产物: 测试数据、日志、性能数据便于后续分析
避免做法
- 跳过测试直接集成
- 只测试单一输入规模
- 忽略精度验证
- 在非目标硬件上开发
七、预期效果
| 任务类型 | 传统方式 | Kerminal |
|---|---|---|
| 基础算子开发 | 数小时~1 天 | 10 - 30 分钟 |
| 复杂算子开发 | 1-2 天 | 30 - 60 分钟 |
| 算子优化 | 数天 | 数小时 |
| 效率提升 | 10 - 50 倍 |
八、交付产物
任务完成后,Kerminal 会输出:
1 ├── src/
2 │ ├── kernel.cpp # Ascend C 算子实现
3 │ └── cpu_ref.cpp # CPU 参考实现
4 ├── test/
5 │ └── test_kernel.cpp # 测试程序
6 ├── CMakeLists.txt # 构建配置
7 └── README.md # 使用说明
九、常见问题
Q: 没有现成的算子文档怎么办?
Kerminal 可以自动搜索论文、分析参考代码,从零理解算子定义。
Q: 精度验证不通过怎么办?
描述问题,Kerminal 会自动分析原因并修复。常见原因包括数据类型、边界处理、数值稳定性等。
Q: 如何进一步优化性能?
直接告诉 Kerminal 你的性能目标,它会尝试多种优化策略。
Q: 支持哪些算子开发语言?
目前支持 Ascend C,后续将支持更多平台的算子开发语言。
