当前位置: 首页 > news >正文

昇腾CANN开源竞赛,从参赛到获奖的实战攻略

前言

昇腾CANN开源社区每年都会办技术竞赛——算子开发赛、模型优化赛、应用创新赛,奖金从几千到几万不等。但很多人一听到"竞赛"就打退堂鼓,觉得那是大佬的游戏。

实际上,昇腾CANN竞赛的门槛没想象中高。掌握Ascend C基础语法、熟悉一两个算子的开发流程,就能参赛。关键是搞清楚竞赛的规则、评审标准和常见坑——这些信息散落在社区各个角落,cann-competitions仓库把它汇总了。

这篇会用最直白的方式,把昇腾CANN竞赛的完整参赛路径拆解清楚。

竞赛全景

昇腾CANN开源竞赛分三个赛道,每个赛道的考察重点和难度不同:

赛道1:算子开发赛

考察重点:用Ascend C写一个高性能算子,在NPU上跑出好成绩

典型赛题

  • 实现一个自定义激活函数算子(如SwiGLU)
  • 优化一个已有算子的性能(如FlashAttention的某个变体)
  • 实现一个NPU原生的信号处理算子

难度:⭐⭐⭐⭐(需要对达芬奇架构有基本理解)

奖金:1-5万元

赛道2:模型优化赛

考察重点:用CANN工具链优化一个模型的推理性能

典型赛题

  • 用ATB加速LLM推理,降低首token延迟
  • 用AMCT量化模型,在精度损失<1%的前提下提升吞吐
  • 用GE图优化减少算子数量

难度:⭐⭐⭐(不需要写算子,但要懂CANN工具链)

奖金:1-3万元

赛道3:应用创新赛

考察重点:基于昇腾NPU做一个创新应用

典型赛题

  • 用昇腾NPU做实时视频分析(安防/交通)
  • 用昇腾NPU做边缘推理(工业检测/农业)
  • 用昇腾NPU做行业解决方案(金融/医疗)

难度:⭐⭐(门槛最低,创意和完整性最重要)

奖金:0.5-2万元

参赛全流程

注册 → 选赛道 → 开发 → 提交PR → CI检查 → 评审 → 颁奖

第一步:注册

在昇腾CANN开源社区注册账号,签署CLA(贡献者许可协议):

# Fork竞赛仓库到自己的账号gitclone https://atomgit.com/<your-username>/cann-competitions.gitcdcann-competitions# 创建参赛目录mkdir-psubmissions/<year>/<track>/<team-name>

第二步:开发(以算子开发赛为例)

用Ascend C实现一个自定义算子。以下是往届获奖作品的核心代码结构:

// swiglu_kernel.cpp - Ascend C实现的SwiGLU算子// SwiGLU(x) = x * sigmoid(1.702 * x),是LLaMA等大模型的激活函数#include"kernel_operator.h"classSwiGLUKernel{public:__aicore__SwiGLUKernel(){}__aicore__voidInit(GM_ADDR x,GM_ADDR y,uint32_ttotalLength){// 分配GPU/NPU上的bufferxGm.SetGlobalBuffer((__gm__ half*)x,totalLength);yGm.SetGlobalBuffer((__gm__ half*)y,totalLength);// 把输入从Global Memory搬到Local Memory(更快)pipe.InitBuffer(inQueueX,1,totalLength*sizeof(half));pipe.InitBuffer(outQueueY,1,totalLength*sizeof(half));this->totalLength=totalLength;}__aicore__voidProcess(){// 1. 从Global Memory搬数据到Local MemoryCopyIn();// 2. 在Local Memory上做计算(SwiGLU = x * sigmoid(1.702x))Compute();// 3. 把结果从Local Memory搬回Global MemoryCopyOut();}private:__aicore__voidCopyIn(){// 从Global Memory读输入LocalTensor<half>xLocal=inQueueX.AllocTensor<half>();DataCopy(xLocal,xGm,totalLength);inQueueX.EnQue(xLocal);}__aicore__voidCompute(){LocalTensor<half>xLocal=inQueueX.DeQue<half>();LocalTensor<half>yLocal=outQueueY.AllocTensor<half>();// SwiGLU核心计算:y = x * sigmoid(1.702 * x)// 先算 1.702 * xLocalTensor<half>scaled=xLocal;// 复用bufferMuls(scaled,xLocal,(half)1.702,totalLength);// 再算 sigmoid(1.702x)Sigmoid(yLocal,scaled,totalLength);// 最后 x * sigmoidMul(yLocal,xLocal,yLocal,totalLength);outQueueY.EnQue<half>(yLocal);inQueueX.FreeTensor(xLocal);}__aicore__voidCopyOut(){LocalTensor<half>yLocal=outQueueY.DeQue<half>();DataCopy(yGm,yLocal,totalLength);outQueueY.FreeTensor(yLocal);}private:TPipe pipe;TQue<QuePosition::VECIN,1>inQueueX;TQue<QuePosition::VECOUT,1>outQueueY;GlobalTensor<half>xGm,yGm;uint32_ttotalLength;};// 算子入口函数extern"C"__global__ __aicore__voidswiglu_kernel(GM_ADDR x,GM_ADDR y,GM_ADDR workspace,GM_ADDR tiling){SwiGLUKernel op;op.Init(x,y,1024);// 1024个元素op.Process();}

代码讲解:这是Ascend C的典型算子结构——Init/Process三段式。核心在Compute()函数:先用Muls做标量乘法(1.702×x),再用Sigmoid做激活,最后用Mul做逐元素乘法。整个过程在Local Memory(类似GPU的Shared Memory)上执行,比在Global Memory上快10倍以上。DataCopy负责Global↔Local的数据搬运,是达芬奇架构的DMA操作。

第三步:提交PR

# 1. 写好算子代码和测试脚本# 目录结构:# submissions/2026/operator/team-abc/# ├── swiglu_kernel.cpp # 算子实现# ├── swiglu_build.sh # 编译脚本# ├── test_swiglu.py # 测试脚本# └── README.md # 说明文档# 2. 提交到自己的Forkgitadd.gitcommit-s-m"feat(operator): add SwiGLU kernel for Ascend C Implement SwiGLU activation function using Ascend C. Performance: 1024 elements in 0.02ms, 3.2x faster than PyTorch. Signed-off-by: Your Name <your@email.com>"gitpush origin main# 3. 在AtomGit上创建Pull Request# 标题格式:[竞赛年份-赛道] 团队名 - 算子/项目名称# 示例:[2026-Operator] Team ABC - SwiGLU Kernel

代码讲解git commit -s-s参数会自动加上Signed-off-by行,这是开源社区的DCO(Developer Certificate of Origin)要求,声明你有权提交这个代码。commit message遵循Conventional Commits格式:type(scope): description

第四步:CI检查

提交PR后,CI机器人会自动做以下检查:

# CI检查项(自动执行)1. DCO签名检查 → commit必须有Signed-off-by2. CLA签署检查 → 提交者必须签署贡献者协议3. 代码格式检查 → clang-format / black4. 编译检查 → Ascend C代码能否通过编译5. 测试执行 → 运行test_swiglu.py,对比精度和性能

任何一项失败,CI会在PR评论区打❌,需要修复后重新push。

第五步:评审

CI通过后,评审委员会按以下维度打分(算子开发赛):

维度权重说明
功能正确性30%输出精度vs基准(FP32 PyTorch)的误差
性能30%在NPU上的执行时间
代码质量20%可读性、注释、规范
创新性10%是否有独特的优化技巧
文档完整性10%README是否清晰

往届获奖作品速览

年份赛道获奖作品核心优化
2025算子开发FlashAttention V3 Ascend CTiling优化+Double Buffer
2025模型优化LLaMA-7B INT4量化AMCT量化+KV Cache FP8
2025应用创新NPU实时交通检测多模型级联+ATB加速

踩坑实录

坑1:未签CLA,PR被自动关闭

现象:提交PR后1分钟内被机器人关闭,评论:“Please sign the CLA first.”

原因:昇腾CANN社区要求所有贡献者签署CLA(Contributor License Agreement),未签署的PR会被自动拦截。

解决:先在AtomGit上签署CLA,再提交PR。

# 签署CLA# 访问 https://atomgit.com/cann/cann-agreements# 点击"Sign CLA"按钮,用AtomGit账号授权# 签署后重新提交gitcommit--amend-s# 确保有Signed-off-bygitpush-forigin main

坑2:commit message格式不规范,CI失败

现象:CI报错Invalid commit message format

原因:commit message必须遵循Conventional Commits格式,如feat(scope): description

解决:修改commit message。

# 错误gitcommit-m"add swiglu kernel"# 没有type和scope# 正确gitcommit-s-m"feat(operator): add SwiGLU kernel implementation"

坑3:测试脚本没有性能基准,评审被扣分

现象:功能正确但性能分数低,因为测试脚本只验证了精度,没有对比PyTorch基准性能。

原因:评审需要看到"你的算子比PyTorch快多少",没有基准数据无法评分。

解决:在测试脚本中加入性能对比。

# 测试脚本要包含性能对比importtimeimporttorch# PyTorch基准x=torch.randn(1,4096).npu()torch.npu.synchronize()t0=time.time()for_inrange(100):y=x*torch.sigmoid(1.702*x)# PyTorch SwiGLUtorch.npu.synchronize()pytorch_time=(time.time()-t0)/100# Ascend C算子torch.npu.synchronize()t0=time.time()for_inrange(100):y=swiglu_custom(x)# 自定义算子torch.npu.synchronize()custom_time=(time.time()-t0)/100print(f"PyTorch:{pytorch_time*1000:.3f}ms")print(f"Ascend C:{custom_time*1000:.3f}ms")print(f"加速比:{pytorch_time/custom_time:.1f}x")

结尾

cann-competitions是昇腾CANN开源竞赛的管理仓库,涵盖算子开发赛、模型优化赛、应用创新赛三个赛道,从注册到评审的完整流程都有规范指导。

如果想参与昇腾CANN竞赛,建议从应用创新赛入门(门槛最低),再挑战模型优化赛和算子开发赛。关键是:签CLA、commit格式规范、测试脚本要有性能对比数据。

昇腾CANN的开源生态还在持续壮大。如果在参赛过程中遇到啥问题,欢迎去AtomGit上的昇腾CANN开源社区逛逛,里面有一手资料和活跃社区。

社区链接

https://atomgit.com/cann/cann-competitions

http://www.jsqmd.com/news/888451/

相关文章:

  • UOS系统维护实战:用一条命令批量清理旧内核与无用依赖,为你的系统‘瘦身’
  • 2026年5月上海搬家公司推荐:五个口碑搬家服务专业评测价格适用场景 - 品牌推荐
  • AI智能体规模化运维:从上下文污染到系统防劣化的工程实践
  • WebStorm提交Gitee失败:31mlncorrect错误与access token认证详解
  • ops-transformer的MoE算子,让混合专家模型训练快5倍
  • 源代码论文分享|基于Java的企业OA管理系统的设计与实现!
  • 保姆级教程:在Windows上从零跑通TASSEL 5.0的GWAS分析(附示例数据避坑指南)
  • linux配置DNS主从服务器的实验步骤
  • API 接口自动化测试详细图文教程学习系列22--结合Pytest框架使用3-分组、跳过执行和参数化处理
  • PTA L1-005 考试座位号:用C语言结构体搞定考场查询系统(附完整代码)
  • 【最新 v2.7.5】Windows 版 OpenClaw 一键包:2026 年程序员 / 运营 / 行政都在偷偷用的提效暗器
  • ROS1 Action通信从入门到放弃?不,是到精通!详解actionlib库与自定义消息实战
  • Excel #NAME? 错误全解析:六大根源与实战排查指南
  • 大模型安全全景解析——从DeepSeek看AI伦理与未来挑战
  • AI Agent记忆系统构建指南:从向量数据库到智能检索的完整实现
  • 第4篇:数据博弈——税务大数据如何“看见”你的企业
  • 【DeepSeek知识产权合规白皮书】:20年AI法务专家亲授3大高危雷区与7步自检清单
  • CSS三大定位技巧全解析
  • D2DX:如何让20年前的《暗黑破坏神2》在现代4K显示器上完美运行?
  • 从一次CAN总线‘丢帧’排查说起:深入理解扩展帧过滤器的‘列表模式’与‘掩码模式’到底怎么选
  • Codex CLI:终端里的代码生成瑞士军刀
  • 鸿蒙 App 架构:为什么页面越来越薄?
  • 从零搭建 Prometheus + Grafana 监控平台全攻略
  • Unity Sentis兼容YOLOv8的NMS层问题与C#后处理方案
  • 哨声响,数据动:耐高总决赛背后的AI力量
  • DeepSeek LeetCode 2659.将数组清空 Java实现
  • LLM API防护:超越传统限流的立体防御体系构建
  • C#调用Windows API获取窗口文本的底层原理与工程实践
  • Python海象运算符:=详解:赋值表达式原理与工程实践
  • 联发科设备深度解锁:从零开始掌握mtkclient-gui的实用指南