贡献指南
本项目欢迎广大开发者体验并参与贡献,在参与社区贡献之前。请参见cann-community了解行为准则,进行CLA协议签署,了解源码仓的贡献流程,该仓详细介绍了如何参与CANN开源项目的贡献的前置条件,包括但不限于:
- 如何提交PR
- gitcode工作流
- 流水线触发命令(线上流水线问题指导)
- 代码检视
- 其他注意事项 详情可以参考cann-community。
除此之外,开发者准备本地代码与提交PR时需要重点关注如下几点:
- 提交PR时,请按照PR模板仔细填写本次PR的业务背景、目的、方案等信息。
- 使用git进行代码提交前,可以参考pre-commit工具使用说明来使您的代码提交更合规高效。
- 若您的修改不是简单的bug修复,而是涉及到新增特性、新增接口、新增配置参数或者修改代码流程等,请务必先通过Issue进行方案讨论,以避免您的代码被拒绝合入。若您不确定本次修改是否可被归为“简单的bug修复”,亦可通过提交Issue进行方案讨论。
- 提交pr时,请确保您的代码符合项目的代码规范,具体参考google的开源代码规范,包括但不限于:
- 代码格式化
- 注释规范
- 变量命名规范
- 函数命名规范
- 类命名规范
- 接口命名规范
- 配置参数命名规范
- 代码流程规范
- 提交pr时,如果存在多个无效commit,建议您在提交pr前先进行rebase操作,合并多个commit为一个,以保持代码的简洁性和可读性,具体参考git rebase,同时,commit message也需要符合项目的代码规范,能够清晰地描述本次变更的意图和内容,格式为:<类型>: <简短描述>。 例如:
| 类型 | 说明 | 示例 |
|---|---|---|
| feat | 新功能 | feat: 添加用户注册功能 |
| fix | 修复 bug | fix: 修复登录态过期问题 |
| docs | 文档更新 | docs: 更新 API 使用说明 |
| style | 代码格式调整(不影响逻辑) | style: 调整代码缩进 |
| refactor | 重构(非功能新增/修复) | refactor: 优化用户服务类结构 |
| perf | 性能优化 | perf: 减少数据库查询次数 |
| test | 测试相关 | test: 添加登录功能单元测试 |
| chore | 构建/工具链变更 | chore: 更新 webpack 配置 |
| ci | CI 配置相关 | ci: 添加自动化测试流程 |
开发者贡献场景主要包括:
-
Bug修复
如果您在本项目中发现了某些Bug,希望对其进行修复,欢迎您新建Issue进行反馈和跟踪处理。
您可以按照提交Issue/处理Issue任务指引新建
Bug-Report|缺陷反馈类Issue对Bug进行描述,然后在评论框中输入“/assign”或“/assign @yourself”,将该Issue分配给您进行处理。 -
贡献新功能
如果您在本项目中发现了某些功能缺失,希望对其进行新增,欢迎您新建Issue进行反馈和跟踪处理。
您可以按照提交Issue/处理Issue任务指引新建
Requirement|需求建议类Issue对新增功能进行说明,并提供您的设计方案, 然后在评论框中输入“/assign”或“/assign @yourself”,将该Issue分配给您进行跟踪实现。 -
文档纠错
如果您在本项目中发现某些文档描述错误,欢迎您新建Issue进行反馈和修复。
您可以按照提交Issue/处理Issue任务指引新建
Documentation|文档反馈类Issue指出对应文档的问题,然后在评论框中输入“/assign”或“/assign @yourself”,将该Issue分配给您纠正对应文档描述。 -
帮助解决他人Issue
如果社区中他人遇到的问题您有合适的解决方法,欢迎您在Issue中发表评论交流,帮助他人解决问题和痛点,共同优化易用性。
如果对应Issue需要进行代码修改,您可以在Issue评论框中输入“/assign”或“/assign @yourself”,将该Issue分配给您,跟踪协助解决问题。
提交前自检清单
提交 PR 前,请逐项确认以下内容。本地通过自检可避免绝大部分 CI 失败。
代码格式
- 安装并运行 pre-commit:
pip3 install pre-commit && pre-commit run - 所有新增文件包含完整的 CANN OSL 版权头,年份和格式参考仓库根目录 OAT.xml 及现有源文件。版权头必须包含完整的许可证说明,不能只保留 Copyright 行:
.cpp/.h:/** * Copyright (c) <year> Huawei Technologies Co., Ltd. * This program is free software, you can redistribute it and/or modify it under the terms and conditions of * CANN Open Software License Agreement Version 2.0 (the "License"). * Please refer to the License for details. You may not use this file except in compliance with the License. * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. * See LICENSE in the root of the software repository for the full text of the License. */.sh:#!/bin/bash # ----------------------------------------------------------------------------------------------------------- # Copyright (c) <year> Huawei Technologies Co., Ltd. # This program is free software, you can redistribute it and/or modify it under the terms and conditions of # CANN Open Software License Agreement Version 2.0 (the "License"). # Please refer to the License for details. You may not use this file except in compliance with the License. # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, # INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. # See LICENSE in the root of the software repository for the full text of the License. # -----------------------------------------------------------------------------------------------------------.py:#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ----------------------------------------------------------------------------------------------------------- # Copyright (c) <year> Huawei Technologies Co., Ltd. # This program is free software, you can redistribute it and/or modify it under the terms and conditions of # CANN Open Software License Agreement Version 2.0 (the "License"). # Please refer to the License for details. You may not use this file except in compliance with the License. # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, # INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. # See LICENSE in the root of the software repository for the full text of the License. # -----------------------------------------------------------------------------------------------------------
- Shell 脚本应根据错误处理需求使用
set -e;如果脚本需要允许命令失败或无匹配结果继续执行,应显式处理返回值,并在脚本中说明例外原因。 cd命令检查返回值:cd path || { echo "error"; exit 1; }- 函数体不超过 50 行(超大函数会被 CI 拦截)
- 循环处理多文件时,若全部文件都失败则正确返回
FAILED
提交规范
- 如果分支包含多个无效 commit,建议在提交 PR 前通过 rebase 进行 squash,以保持提交历史简洁:
git rebase -i upstream/develop # 多余的 pick → s (squash) - PR 的目标仓库和目标分支:提交到 cann/ge 仓库的
develop分支。 - 基于最新 develop 分支:
git fetch upstream develop && git rebase upstream/develop - commit message 格式:
<type>: <描述>(如feat: add xxx,fix: fix xxx)
文档
- 样例需包含中英文 README(
README.md+README_en.md),含功能描述、目录结构、环境准备、实现步骤、构建验证、预期输出 - 在父级 README 中注册新样例/模块条目(如
examples/README.md、examples/acl/README.md等)
CI 门禁说明
提交 PR 后,需要在 PR 评论区发送 compile(也支持 /compile)触发 CI 流水线;PR 更新后如需重新执行流水线,请再次发送该评论。流水线触发后会运行以下检查项及其本地验证方式:
| CI 检查项 | 作用 | 本地验证 |
|---|---|---|
codecheck_precommit |
代码格式合规(pre-commit hooks) | pre-commit run |
codecheck_dt |
DT 测试用例规范检查 | 参考 DT 用例开发指导 |
clang-format |
C++ 代码格式化 | clang-format -i <file> |
ruff |
Python 代码格式化与 lint | python3 -m ruff format <file> && python3 -m ruff check --fix <file> |
codespell |
拼写检查 | codespell <file> |
OAT |
开源合规(许可证头、二进制文件检查) | pre-commit run oat-check |
贡献分级指引
GE 的贡献按复杂度分为三级,请根据您的贡献类型选择对应流程。
初级贡献(Bug 修复 / 文档纠错)
适用范围:修复 Bug、修正文档错误、小的代码格式调整等不改变代码流程的修改。
流程:
- Fork 仓库并创建分支
- 修改代码,本地运行
pre-commit run确保格式合规 - 提交 PR,按 PR 模板 填写变更描述
- 确保 CI 门禁全部通过(见上方 CI 门禁说明)
- 在 PR 评论区
@committer_gitcode_id提请检视 - Committer 检视通过后标注
/lgtm,Maintainer 标注/approve后合入
合入标签:
/lgtm(Looks Good To Me)由 Committer 添加,表示代码检视通过;/approve由 Maintainer 添加,表示批准合入。完整机器人命令参见社区评论命令指南。
高级贡献(功能开发 / 模块修改)
适用范围:新增特性、新增接口、修改代码流程、性能优化等涉及核心模块的改动。
流程:
- 先提交 Issue:新建
Requirement|需求建议类 Issue,说明背景、价值、设计方案 - 等待 Committer/Maintainer 同意:获得方案认可后再开始编码,避免代码被拒绝合入
- 编码并提交 PR:遵守下方约束速查表和测试要求
- CI 门禁通过 + Committer 检视通过(
/lgtm)+ Maintainer 批准(/approve)
代码目录导航
| 目录 | 职责 |
|---|---|
compiler/graph/passes/ |
图优化 pass(融合、常量折叠、格式推导) |
compiler/graph/build/ |
编译构建(内存分配、流分配、task 生成) |
compiler/graph/partition/ |
图拆分(动静分离、引擎分区) |
runtime/v2/ |
动态执行器 RT2.0(Lowering、ExecuteGraph) |
runtime/v1/ |
静态执行器(DavinciModel、Task Sink) |
api/acl/ |
ACL 对外 API 实现 |
base/ |
基础图结构、IR 定义 |
graph_metadef/ |
算子定义与注册 |
parser/ |
模型格式解析器(ONNX、TF、Caffe) |
贡献场景约束速查
| 改动场景 | 必须遵守的约束 | 参考文档 |
|---|---|---|
| 改图优化 pass | 图等价变换、控制边处理、节点名约束 | docs/zh/contributions/coding_red_lines.md 规则 4、7、8 |
| 改内存分配 | 内存复用约束、跨 so 析构安全 | docs/zh/design/constraints/memory-constraints.md |
| 改 runtime 执行 | RT2 动态 shape 约束、hybrid 执行流程 | docs/zh/design/constraints/rt2_runtime.md |
| 改图拆分逻辑 | 切图不改变语义、子图通信隔离 | docs/zh/design/constraints/graph_split.md |
| 改流分配 | 多流并行 event 同步、流复用 | docs/zh/design/constraints/stream_allocator.md |
| 新增特性/feature | 必须做跨特性交叉影响分析 | docs/zh/design/cross_feature_check.md |
| 改对外接口 | API/ABI 兼容性、禁止改已有接口签名 | docs/zh/contributions/coding_red_lines.md 规则 3 |
测试要求
| 改动类型 | 最低测试要求 |
|---|---|
| 新增 pass | UT + ST;UT 覆盖率 > 90%,ST 覆盖率 > 80% |
| 改 runtime | UT + ST + 回归测试 |
| 改 ACL API | UT + API 接口用例验证 |
| 新增样例 | 至少跑通一次完整推理流程 |
| Bug 修复 | 根据被测行为,补充能复现该 Bug 的 UT 用例、ST 用例,或同时补充两者 |
测试开发指南详见 docs/zh/contributions/dev_test_guide/。
架构级贡献(跨模块 / 架构变更)
适用范围:涉及多个模块协同变更、运行时架构调整、编译流程重构等影响面较大的改动。
流程:
- 在 sig-ge 例会上讨论:先在 GE SIG 例会上申报议题,讨论方案可行性和影响范围
- 撰写设计文档:按设计文档模板编写,必须覆盖:
- 功能需求与非功能需求(性能、内存)
- 对已有特性(21 个 features,见架构总览)的交叉影响分析
- DT 测试方案
- 兼容性检查(API/ABI、模型格式、芯片版本)
- 跨特性交叉影响分析:参考
docs/zh/design/cross_feature_check.md逐场景评估 - 提交 PR:需附设计文档链接,CI + Committer + Maintainer 全部通过
通用编码红线
所有代码修改必须遵守 docs/zh/contributions/coding_red_lines.md,关键规则摘要:
- 禁止硬编码敏感信息(密钥、密码)
- 外部数据输入必须校验
- 资源申请后必须释放
- 禁止使用
std::unordered_map等无序容器;涉及图增删改和遍历时,优先使用std::map等有序容器;禁止使用 Node 指针作为 key 依赖地址顺序 - 图优化 pass 不得改变图的计算语义
- 禁止在代码中硬编码芯片型号