
摘要本篇文章主要介绍如何借助CANNBot工具高效完成计算逻辑复杂的GeluGradV2算子全流程开发与测试。作为一款表现远超预期的算子开发工具CANNBot具备强大的AI驱动能力可精准实现Ascend C代码自动生成同步生成对应的Aclnn接口及可直接执行的完备测试样例全面覆盖算子设计、开发、测试及门禁检查全流程其完整的链路转化能力大幅提升开发效率。此外该工具还能针对性优化算子核函数通过自主内存复用技术精简冗余空间占用、减少不必要的内存浪费妥善解决算子开发中的细节痛点有效优化算子性能全方位保障算子开发的效率与代码质量。本次基于CANNBot完成的GeluGradV2算子严格遵循CANN平台算子开发规范功能与性能对标Ascend C算子最终顺利通过全量测试并提交PR验证了CANNBot在复杂算子开发场景中的实用性与高效性。背景随着人工智能技术的持续迭代与落地底层算子作为AI模型运行的核心支撑其需求量日益增长、复杂度不断提升。为汇聚社区力量、丰富算子生态CANN平台面向开发者发布了大量算子开发任务鼓励开发者积极参与算子贡献共同完善昇腾NPU的算子支持能力。本次开发的GeluGradV2算子是AI模型训练中常用的梯度计算的算子其计算逻辑涉及复杂的数学公式转换与多类型数据处理平台明确要求采用Ascend C语言实现且功能、性能需严格对标成熟的Ascend C算子确保算子的兼容性与运行稳定性。为了简化算子开发流程、降低开发门槛、提升开发效率CANN平台专门推出了CANNBot智能体工具。该工具依托AI大模型能力集成了算子开发全流程所需的技能模块Skills可实现AI驱动的算子自动生成、代码优化、测试样例生成及门禁检查等功能大幅减少开发者的手动编码与调试工作量。一.环境搭建CANNBot的安装配置简洁高效提供了多种灵活的安装方式可适配ClaudeCode,OpenCode,Trae等多种常用开发工具满足不同开发者的使用习惯。本次开发过程中我选用OpenCode作为开发工具结合Qwen3 Coder 30B A3B Instruct大模型进行算子生成与优化这个模型发布时间是比较久的效果上不一定最好。需要说明的是opencode的基础安装与配置教程可在官方文档及网络平台找到详细指引本次不再赘述重点介绍CANNBot的配置流程。windows操作系统下按下winR键输入cmd在命令提示符页面输入命令opencode plugin cannbotgithttps://gitcode.com/cann/cannbot-skills.git -g拉取skills仓的commit版本号为:b4882910。显示如下的界面说明配置成功然后我们使用VS code进行算子开发在安装了opencode插件后对话框输入:/init确保skills可以发挥作用:二.GeluGradV2算子需求分析在开展开发工作前需先明确GeluGradV2算子的核心需求与技术规格确保开发成果符合平台要求。该算子的核心功能是完成gelu的梯度计算其输入、输出及属性参数规格如下表所示涵盖数据类型、排布格式、维度等关键信息是后续代码生成与测试的核心依据。名称类别数据类型排布格式维度介绍x输入fp16、fp32、bf16FRACTAL_NZ,NC1HWC0,NDall输入dy输入fp16、fp32、bf16FRACTAL_NZ,NC1HWC0,NDall输入approximate属性string可选属性支持none、tanhz输出fp16、fp32、bf16FRACTAL_NZ,NC1HWC0,NDall输出按照approximate属性值的不同kernel的计算过程分为两种approximatenone:approximatetanh:我们直接将上面的算子原型发给CANNBot它会生成算子的设计方案三.CANNBot算子开发上面的计算过程如果单纯手写是比较复杂的我们使用CANNBot来辅助实现。因为这个算子比较复杂类型比较多所以对功能进行拆分实现。接下来我将算子的原型描述和approximatenone的公式传给大模型大模型会调用CANNBot的skills策略来生成大模型生成效果如下:通过上面的生成内容可以看到生成了包括Aclnn接口、核心计算在内的代码内容但核心实现用的是伪代码不是真正可以执行的AscendC API所以还要做一些调整。我根据Ascend C文档里面部分API的使用方式传给AI并强制要求其使用API的方式(如果不强制要求有可能CANNBot还会使用伪代码的方式)。在我喂给CANNBot一些API的使用样例后它可以将伪代码转换成正确的Ascend C API生成结果如下图实践中发现在向CANNBot提供部分样例API后其能够成功将伪代码转换为对应API格式。但在传入样例并明确要求使用API接口之前CANNBot多次出现用简单加减乘除运算符号替代标准API的情况。经分析此类问题大概率源于所选用大模型的局限性因此开发者在使用CANNBot时大模型的选择尤为关键建议优先选用最新发布、AI生成准确率更高的大模型以提升算子开发的效率与代码质量。另外运算中有逻辑右移的操作而这一步要求数据类型为uint32类型如果单独再申请单独的临时变量会造成不必要的UB空间浪费因此可以通过使用强解释符来解决我们把这个优化点发给CANNBot它给我们提供了强解释符的使用方式:继续按照跟上面相似的方式再实现属性值为tanh的情况首先要把公式传给大模型:往上翻可以看到公式是正确插入到else判断条件下的但是API并没有直接转换成功:接下来我们要AI 把公式用API接口的方式实现可以看到基本上是将整个计算过程转换成了API的方式说实话在输出之前我没有想到CANNBot能够达到这样效果的因为这个算子的计算是比较复杂的。当然上面的计算我们不能直接拿来使用的因为里面用了很多不必要的变量浪费了很多空间因此还需要对空间进行复用。将需求传输给CANNBot我们在手动对上面的代码进行一些优化和调整并修复一些计算过程中的错误得到最终的版本标出来的红色部分主要是为了对齐Ascend C算子的仿真指令四.CANNBot算子测试样例在完成了算子开发后让CANNBot生成一些测试样例:上面的shape数据有点少我们让CANNBot生成指定shape为[1024]的测试样例:CANNBot生成了功能测试、精度验证、性能测试等多个测试模块的实现从功能上讲很全面。测试结果如下图指标数值要求状态执行时间6.567 ms 100 ms✓ 合格吞吐量1805.64Melements/sec10 Melements/sec✓ 合格精度误差8.5e-7 1e-5✓ 合格内存使用正常无泄漏✓ 合格四.算子其他交付件除算子核心代码及测试组件外算子交付还需提供完整的README文档用于详细介绍算子的功能、参数、计算逻辑、使用方法等内容方便其他开发者理解与复用。该部分工作同样借助CANNBot完成:我并没有告知它具体的README文档生成的信息但它生成的README文档依然结构清晰、内容完整准确涵盖了算子的核心信息包括算子的功能定位、输入输出参数的详细说明、两种approximate属性对应的计算逻辑公式、测试结果及使用注意事项等完全满足平台对算子交付文档的要求无需进行过多手动修改由此可见CANNBot的生成效果绝对是可以的进一步提高了效率。五.CANNBot门禁检查执行门禁校验CANNBot还提供了门禁检查这一步能够提前解决一部分门禁问题减少门禁测试时有可能出现的问题。六.算子提交PR在完成了上面的门禁测试后解决了可能遇到的门禁问题然后直接提交算子PRhttps://gitcode.com/cann/ops-nn/pull/3226在提交pr后输入compile指令执行门禁测试Smoke烟感测试失败查看日志发现错误原因是因为examples路径下的样例变量创建问题C禁止将字符串赋值给char*warning: ISO C forbids converting a string constant to ‘char*’ [-Wwrite-strings]我们把这个错误发给CANNBot来让它解决CANNBot提供了三种解决方案第一种方案因为approximate属性为char*类型不可以使用const修饰那么我们选用方案3将代码修改为:char approximate[] tanh;再次执行compile门禁测试通过总结CANNBot的实际表现远超预期。在算子开发场景中它可精准将数学公式完整转化为标准C逻辑再无缝适配转换为Ascend C的API 代码完整的链路转化能力令人惊喜。同时CANNBot具备自主内存空间复用能力可合理精简冗余临时变量有效优化代码性能工具还支持一键生成完备的测试用例覆盖场景全面。除此之外内置门禁检查能力能够提前排查隐患大幅降低PR合入后的各类问题风险。生成的README文档结构清晰、内容完整准确涵盖了算子的核心信息包括算子的功能定位、输入输出参数的详细说明、两种approximate属性对应的计算逻辑公式、测试结果及使用注意事项等完全满足平台对算子交付文档的要求无需进行过多手动修改进一步提升了开发效率。另外在开发过程中也遇到了CANNBot不足的地方给CANNBot提了issue:https://gitcode.com/cann/cannbot-skills/issues/58