前言

昇腾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

Logo

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

更多推荐