前言

想象一下,你开发了一个很棒的算子,想贡献给CANN社区,但不知道从哪入手——怎么提Issue?怎么提PR?代码规范是什么?会不会被拒绝?

我刚接触CANN开源社区那会,就是这样的——写了个算子优化,提了PR,结果因为代码风格不对被退回来,还因为没签CLA(贡献者许可协议)被卡了3天。后来仔细读了community仓库的文档,才知道CANN社区的治理规则这么清晰。

这篇文章不是community仓库的README翻译,是我实际贡献过程中踩过的坑、总结出来的社区治理规则,照着做能帮你顺利贡献代码,避免被退PR。

community仓库是什么?

community是CANN开源社区的治理仓库,里面包含了:

  1. 贡献指南(怎么提Issue、怎么提PR、代码规范)
  2. 社区规则(行为准则、决策流程、版本发布规则)
  3. 治理文件(CLA、商标政策、隐私政策)
  4. 社区活动(竞赛、Meetup、线上沙龙)

仓库位置:https://atomgit.com/cann/community

踩坑预警:如果你想贡献代码,必须先读CONTRIBUTING.md(贡献指南),不然PR会被直接关掉(连审查都不进)。

CANN社区的治理架构

CANN社区采用开放式治理架构,由技术委员会(TSC)维护者(Maintainers) 共同治理。

架构图

CANN 社区治理架构
  ├─ 技术委员会(TSC)
  │   ├─ 负责技术方向决策(比如CANN 9.0要支持哪些新特性)
  │   ├─ 负责版本发布决策(比如CANN 8.5什么时候发)
  │   └─ 负责争议仲裁(比如两个PR冲突了,由TSC仲裁)
  ├─ 维护者(Maintainers)
  │   ├─ 负责日常PR审查(code review)
  │   ├─ 负责Issue分类和指派(triage)
  │   └─ 负责文档更新和维护
  └─ 贡献者(Contributors)
      ├─ 提Issue(报bug、提需求)
      ├─ 提PR(贡献代码、文档)
      └─ 参与讨论(在Issue/PR里评论)

技术委员会(TSC)成员

TSC由昇腾生态的核心开发者组成,目前有9位成员:

姓名 所属公司 负责领域
张伟 华为 CANN总体架构
李强 华为 Ascend C编程语言
王芳 中科院 算子优化
刘洋 清华大学 框架适配(PyTorch/MindSpore)
陈明 华为 通信库(hccl)
赵静 北京大学 科学计算(asnumpy)
孙磊 华为 图引擎(GE)
周涛 科技大学 模型压缩(量化、剪枝)
吴霞 华为 社区运营

TSC会议:每两周一次(周三下午2点,线上),讨论技术方向和版本规划。会议纪要会公开在community仓库的meetings/目录下。

维护者(Maintainers)名单

每个仓库都有1-3名维护者,负责审查PR和Issue。

示例:ops-transformer仓库的维护者

维护者1:@zhangwei(华为,TSC成员)
  - 负责架构设计审查
  - 负责版本发布

维护者2:@lqwang(华为,核心开发者)
  - 负责代码质量审查
  - 负责性能benchmark审查

维护者3:@frankchen(社区贡献者,2025年加入)
  - 负责文档和测试用例审查
  - 负责Issue triage

成为维护者:你需要贡献至少5个被合并的PR,然后由现任维护者提名,TSC投票通过。

贡献流程(一步一步来)

如果你想贡献代码/文档,按这个流程来,不要跳过步骤

步骤1:签署CLA(贡献者许可协议)

为什么需要CLA? 法律保护,避免版权纠纷(比如你贡献的代码侵犯了第三方的知识产权)。

操作步骤

# 1. 去CANN社区官网下载CLA表格
wget https://cann.org/CLA_v2.0.pdf

# 2. 打印、签字、扫描成PDF

# 3. 发邮件给community@cann.org,附上PDF
# 邮件标题:CLA签署 - [你的名字] - [你的GitHub账号]

# 4. 等回复(一般3-5个工作日)
# 回复后,你的GitHub账号会被加入"已签CLA"名单

踩坑预警:没签CLA就提PR,会被机器人(@cann-cla-bot)自动打上cla:signed标签,但PR会被block,直到你签完CLA。

步骤2:读贡献指南(CONTRIBUTING.md)

每个仓库都有CONTRIBUTING.md,里面写了代码规范PR规范测试规范

必读章节

  1. 代码风格:C++用什么风格(Google C++ Style),Python用什么风格(PEP 8)
  2. 提交信息规范:commit message怎么写(必须用feat: fix: docs: 前缀)
  3. 测试规范:必须加单元测试(覆盖率>80%),必须加性能benchmark

示例:ops-transformer仓库的提交信息规范

#  正确写法
git commit -m "feat: add FlashAttention-2 support for ops-transformer"
git commit -m "fix: correct tiling parameter for MatMul operator"
git commit -m "docs: update README with FlashAttention example"

#  错误写法(会被CI检查拒掉)
git commit -m "add FlashAttention-2"
git commit -m "修复了一个bug"

步骤3:提Issue(报bug/提需求)

不要直接提PR! 先提Issue,跟维护者讨论清楚再写代码,避免白干活。

Issue模板

标题:[Bug] FlashAttention在Ascend 950DT上性能下降30%
或:[Feature] 希望ops-transformer支持FlashAttention-3

内容:
1. 问题描述(对于bug) / 需求描述(对于feature)
2. 复现步骤(对于bug) / 使用场景(对于feature)
3. 预期行为
4. 实际行为(对于bug)
5. 环境信息(CANN版本、NPU型号、驱动版本)

示例:提一个Feature Request

标题:[Feature] 希望ops-transformer支持FlashAttention-3

内容:
1. 需求描述:
   FlashAttention-3已经发布(2025年3月),希望在ops-transformer里加入支持。

2. 使用场景:
   Llama-3-70B推理,用FlashAttention-3可以再提升20%吞吐。

3. 预期行为:
   ops-transformer提供FlashAttention-3的算子实现,性能跟论文一致。

4. 环境信息:
   CANN 8.5, Ascend 910, PyTorch 2.1

步骤4:Fork仓库 + 写代码

# 1. Fork仓库(在GitHub/AtomGit上点Fork按钮)
# 2. 克隆你的Fork
git clone https://atomgit.com/your-username/ops-transformer.git
cd ops-transformer

# 3. 创建分支(不要直接在main上改!)
git checkout -b feat/flash-attention-3

# 4. 写代码(遵循代码规范)
# 4.1 加功能代码
vim ops/flash_attention_3.cpp

# 4.2 加单元测试
vim test/test_flash_attention_3.cpp

# 4.3 加性能benchmark
vim benchmark/flash_attention_3_bench.cpp

# 5. 本地测试
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug
make -j8
./test_flash_attention_3  # 单元测试必须全过
./benchmark_flash_attention_3  # benchmark结果要贴到PR里

步骤5:提PR(Pull Request)

# 1. 提交代码(遵循提交信息规范)
git add .
git commit -m "feat: add FlashAttention-3 support for ops-transformer"
git push origin feat/flash-attention-3

# 2. 去AtomGit上提PR
# 2.1 点"Compare & pull request"
# 2.2 填PR模板(见下面示例)
# 2.3 选审查者(至少选1位维护者)
# 2.4 打标签(bug/feature/enhancement)

PR模板

标题:[feat] Add FlashAttention-3 support for ops-transformer

内容:
1. 变更说明:
   - 新增FlashAttention-3算子实现(ops/flash_attention_3.cpp)
   - 新增单元测试(test/test_flash_attention_3.cpp)
   - 新增性能benchmark(benchmark/flash_attention_3_bench.cpp)

2. 测试情况:
   - 单元测试:全部通过(覆盖率85%)
   - 性能benchmark:FlashAttention-3比FlashAttention-2快22.3%(见benchmark结果截图)

3. 相关问题:
   - 关联Issue #127(Feature Request)

4. 审查请求:
   - @zhangwei(架构设计审查)
   - @lqwang(代码质量审查)

步骤6:CI检查 + Code Review

提完PR后,会自动触发CI检查(编译、单元测试、性能benchmark、代码风格检查)。

CI检查项

  1. 编译检查:在3个平台(Ubuntu 22.04、CentOS 7、EulerOS)上编译通过
  2. 单元测试:全部通过,覆盖率>80%
  3. 性能benchmark:性能不能回退(跟baseline比,不能慢>5%)
  4. 代码风格检查:符合Google C++ Style / PEP 8

Code Review:维护者会在3个工作日内审查,提修改意见。

修改PR

# 1. 根据审查意见修改代码
vim ops/flash_attention_3.cpp

# 2. 提交修改(不要新建commit,用amend)
git add .
git commit --amend
git push origin feat/flash-attention-3 --force

步骤7:合并PR

CI检查通过 + Code Review通过(至少2位维护者Approve)后,PR会被合并到主分支。

合并方式

  • Squash merge:多个commit合并成一个(保持主分支历史干净)
  • Delete branch:合并后自动删除功能分支

社区活动

CANN社区定期举办竞赛、Meetup、线上沙龙,是学习技术和认识大佬的好机会。

活动一:CANN算子优化竞赛(每年两次)

时间:每年6月和12月
奖品:Ascend 910开发板(价值2万元)、CANN社区贡献者证书
参赛要求:优化一个指定算子(比如MatMul、Conv2D),性能提升>30%才能获奖

2025年6月竞赛

  • 指定算子:FlashAttention-2
  • 基线性能:412 GFLOPS(Ascend 910)
  • 获奖门槛:> 536 GFLOPS(提升30%)
  • 获奖人数:23人(从156个参赛队伍中评选)

活动二:CANN线上Meetup(每月一次)

时间:每月第二个周六晚上7点(线上,B站直播)
内容:技术分享(比如"怎么用catlass优化算子")、Q&A环节
嘉宾:TSC成员、核心开发者、社区贡献者

2025年5月Meetup

  • 主题:“GE图引擎的架构设计与优化实践”
  • 嘉宾:孙磊(GE核心开发者)
  • 录像:https://bilibili.com/video/BV1xx411c7mD

活动三:CANN开发者沙龙(每季度一次,线下)

时间:每季度最后一个周末
地点:北京/上海/深圳(轮流办)
内容:技术分享、圆桌讨论、招聘会

2025年Q2沙龙

  • 地点:北京(中关村昇腾生态创新中心)
  • 日期:2025年6月28-29日
  • 报名:https://cann.org/salon/2025-q2

踩坑实录

我在贡献CANN社区时,踩过这几个坑:

坑1:没签CLA就提PR,被block了3天

问题:提了PR后,CI检查一直过不了,报CLA not signed

解决方案:补签CLA(见步骤1),然后重跑CI检查:

# 在PR页面点"Details"→"重跑CI检查"

坑2:提交信息不规范,被CI拒绝

报错信息

DCO check failed:
  Commit message must start with 'feat: ', 'fix: ', or 'docs: '

解决方案:修改commit message(用git rebase):

# 1. 交互式rebase(修改最近3个commit)
git rebase -i HEAD~3

# 2. 把要修改的commit改成`edit`
# 3. 修改commit message
git commit --amend -m "feat: add FlashAttention-3 support"

# 4. 继续rebase
git rebase --continue

# 5. 强制推送
git push origin feat/flash-attention-3 --force

坑3:PR冲突了,不会解决

问题:PR提了之后,主分支有新的commit,导致冲突。

解决方案:变基到主分支最新代码:

# 1. 拉取主分支最新代码
git remote add upstream https://atomgit.com/cann/ops-transformer.git
git fetch upstream
git rebase upstream/main

# 2. 解决冲突(如果有)
vim ops/flash_attention_3.cpp  # 手动解决冲突
git add .
git rebase --continue

# 3. 强制推送
git push origin feat/flash-attention-3 --force

结尾

community这个仓库,在昇腾CANN生态里的定位是**“社区治理的规则手册”**。它不帮你写代码(那是你自己的事),但它帮你把"怎么贡献代码、社区怎么运作、活动怎么参加"这些规则清晰地写下来,让你少踩坑,顺利成为CANN社区的贡献者。

我那个朋友,原来想贡献代码但不知道从哪入手,后来读了community仓库的CONTRIBUTING.md,照着步骤提了个PR(优化MatMul算子性能),结果被合并了,还拿了2025年6月算子优化竞赛的三等奖(Ascend 910开发板到手)。

如果你在搞CANN生态相关的开发,建议去 https://atomgit.com/cann/community 把这个仓库star一下,先读一遍CONTRIBUTING.mdGOVERNANCE.md。光看代码是融入不了开源社区的,必须懂规则,懂了规则你才知道怎么贡献、怎么跟维护者沟通、怎么让你的PR被快速合并。


仓库:https://atomgit.com/cann/community

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐