昇腾CANN开源竞赛,从参赛到获奖的实战攻略
昇腾CANN开源社区每年举办算子开发、模型优化和应用创新三大技术竞赛,奖金丰厚。参赛门槛不高,掌握Ascend C基础语法即可。竞赛流程包括注册、开发、提交PR、CI检查和评审五个步骤。以算子开发赛为例,参赛者需实现高性能算子并优化NPU执行效率。评审标准涵盖功能正确性、性能、代码质量等维度。往届获奖作品展示了各类创新优化方案,为参赛者提供参考。
前言
昇腾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竞赛仓库到自己的账号
git clone https://atomgit.com/<your-username>/cann-competitions.git
cd cann-competitions
# 创建参赛目录
mkdir -p submissions/<year>/<track>/<team-name>
第二步:开发(以算子开发赛为例)
用Ascend C实现一个自定义算子。以下是往届获奖作品的核心代码结构:
// swiglu_kernel.cpp - Ascend C实现的SwiGLU算子
// SwiGLU(x) = x * sigmoid(1.702 * x),是LLaMA等大模型的激活函数
#include "kernel_operator.h"
class SwiGLUKernel {
public:
__aicore__ SwiGLUKernel() {}
__aicore__ void Init(GM_ADDR x, GM_ADDR y, uint32_t totalLength) {
// 分配GPU/NPU上的buffer
xGm.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__ void Process() {
// 1. 从Global Memory搬数据到Local Memory
CopyIn();
// 2. 在Local Memory上做计算(SwiGLU = x * sigmoid(1.702x))
Compute();
// 3. 把结果从Local Memory搬回Global Memory
CopyOut();
}
private:
__aicore__ void CopyIn() {
// 从Global Memory读输入
LocalTensor<half> xLocal = inQueueX.AllocTensor<half>();
DataCopy(xLocal, xGm, totalLength);
inQueueX.EnQue(xLocal);
}
__aicore__ void Compute() {
LocalTensor<half> xLocal = inQueueX.DeQue<half>();
LocalTensor<half> yLocal = outQueueY.AllocTensor<half>();
// SwiGLU核心计算:y = x * sigmoid(1.702 * x)
// 先算 1.702 * x
LocalTensor<half> scaled = xLocal; // 复用buffer
Muls(scaled, xLocal, (half)1.702, totalLength);
// 再算 sigmoid(1.702x)
Sigmoid(yLocal, scaled, totalLength);
// 最后 x * sigmoid
Mul(yLocal, xLocal, yLocal, totalLength);
outQueueY.EnQue<half>(yLocal);
inQueueX.FreeTensor(xLocal);
}
__aicore__ void CopyOut() {
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_t totalLength;
};
// 算子入口函数
extern "C" __global__ __aicore__ void swiglu_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. 提交到自己的Fork
git add .
git commit -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>"
git push 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-by
2. CLA签署检查 → 提交者必须签署贡献者协议
3. 代码格式检查 → clang-format / black
4. 编译检查 → Ascend C代码能否通过编译
5. 测试执行 → 运行test_swiglu.py,对比精度和性能
任何一项失败,CI会在PR评论区打❌,需要修复后重新push。
第五步:评审
CI通过后,评审委员会按以下维度打分(算子开发赛):
| 维度 | 权重 | 说明 |
|---|---|---|
| 功能正确性 | 30% | 输出精度vs基准(FP32 PyTorch)的误差 |
| 性能 | 30% | 在NPU上的执行时间 |
| 代码质量 | 20% | 可读性、注释、规范 |
| 创新性 | 10% | 是否有独特的优化技巧 |
| 文档完整性 | 10% | README是否清晰 |
往届获奖作品速览
| 年份 | 赛道 | 获奖作品 | 核心优化 |
|---|---|---|---|
| 2025 | 算子开发 | FlashAttention V3 Ascend C | Tiling优化+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账号授权
# 签署后重新提交
git commit --amend -s # 确保有Signed-off-by
git push -f origin main
坑2:commit message格式不规范,CI失败
现象:CI报错Invalid commit message format。
原因:commit message必须遵循Conventional Commits格式,如feat(scope): description。
解决:修改commit message。
# 错误
git commit -m "add swiglu kernel" # 没有type和scope
# 正确
git commit -s -m "feat(operator): add SwiGLU kernel implementation"
坑3:测试脚本没有性能基准,评审被扣分
现象:功能正确但性能分数低,因为测试脚本只验证了精度,没有对比PyTorch基准性能。
原因:评审需要看到"你的算子比PyTorch快多少",没有基准数据无法评分。
解决:在测试脚本中加入性能对比。
# 测试脚本要包含性能对比
import time
import torch
# PyTorch基准
x = torch.randn(1, 4096).npu()
torch.npu.synchronize()
t0 = time.time()
for _ in range(100):
y = x * torch.sigmoid(1.702 * x) # PyTorch SwiGLU
torch.npu.synchronize()
pytorch_time = (time.time() - t0) / 100
# Ascend C算子
torch.npu.synchronize()
t0 = time.time()
for _ in range(100):
y = swiglu_custom(x) # 自定义算子
torch.npu.synchronize()
custom_time = (time.time() - t0) / 100
print(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
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)