昇腾CANN release-management:版本发布流程和升级策略
CANN版本管理采用语义化版本(SemVer)+LTS策略,分为正式版(6-12个月周期)和补丁版(每月发布)。发布流程包含计划、开发、冻结、候选和正式发布五个阶段,每个阶段都有严格规范:计划阶段定义关键交付,开发期保护分支规则,冻结期仅允许三类修复,候选发布需通过36组自动化测试矩阵。补丁版本通过cherry-pick实现,需注意代码上下文差异。常见问题包括cherry-pick依赖缺失、测试覆
community 仓库定义了谁决策,release-management 实现了怎么发布。CANN 的版本发布遵循语义化版本(SemVer)+ LTS 策略。每个版本从计划到上线,经过版本节奏定义 → 发行版集成 → 基础设施验证 → 发布公告,全套流程都有标准化模板。
版本节奏和发行策略
CANN 的两类版本:
| 版本类型 | 发布频率 | 支持周期 | 适用场景 |
|---|---|---|---|
| 正式版 (8.x) | 6-12个月 | 24个月 | 生产环境 |
| 补丁版 (8.x.y) | 每月 | 随正式版 | 安全修复/关键 bug |
正式版是受保护分支,补丁版是 cherry-pick 修复。补丁版只合入三类修复:安全漏洞、数据不一致 bug(算错结果)、HBM 泄漏。性能优化不进补丁版——在正式版之后的下一个版本里一起上。
LTS 策略:每两个正式版中选一个做 LTS(Long Term Support),对应选择是 8.0(LTS)和 8.5(非 LTS)。LTS 版的支持延长到 36 个月,非 LTS 版 24 个月。
一个版本发布的完整流程
CANN 的发布周期分五个阶段:
Plan → Develop → Freeze → RC → Release
(2周) (12-20周) (2周) (4周) (1天)
阶段 1:Plan(版本计划)
版本计划会定义该版本的关键交付:
# release/v8.5/plan.yaml
version: "8.5.0"
type: "minor" # major=重构, minor=新功能, patch=修复
target_date: "2025-06-30"
features:
- name: "MoE Expert 动态负载均衡"
repo: ops-transformer
contact: "@ml-team/pager-duty"
- name: "FP8 量化推理支持"
repo: ops-nn
dependency: "metadef v3.1" # 依赖其他仓的版本
quality_goals:
ut_coverage: ">=85%"
integration_test_pass_rate: "100%"
risk_items:
- "FP8 fused kernel 调度在不同 NPU 核数下行为不一致"
mitigation: "提前两周进入 freeze"
阶段 2:Develop(开发期)
各仓库按计划开发新功能。关键规则:
// release-management/scripts/branch_check.sh
// 开发期中每个合入的 PR 必须通过分支检查
// 分支规则保护关键分支
//
// main
// ├──────────── main : 当前开发的主分支(下一个版本的代码)
// ├── release/8.0 : 8.0 LTS 补丁分支(只允许 hotfix 合入)
// ├── release/8.5 : 8.5 开发分支(feature 合入)
// └── vendor/* : 华为内部预发布分支(不进社区)
// 保护规则:
// 1. release/* 分支:禁止 force push(保护版本历史)
// 2. main 分支:CI 必须全绿(protect-base)
// 3. PR 合入:至少两个 reviewer approve + CI 全绿
阶段 3:Freeze(冻结期)
冻结期内只合入三类修复:
## Freeze 期合入规则
允许合入(三类):
1. Fix: 修复 CT(准确率下降、结果错误、精度退化)
2. Fix: 修复功能问题(HBM 泄漏、SIGSEGV、算子 hang)
3. Doc: 文档修复(拼写、链接、示例代码)
禁止合入:
- 任何新 feature(包括小的改进)
- 任何性能优化(即使有 benchmark 证明)
- 任何重构
阶段 4:RC(候选发布)
Release Candidate 选定后,用自动化测试矩阵跑一遍:
#!/bin/bash
# release-management/rc_validation.sh
rc_tag="v8.5.0-rc3"
# 测试矩阵:3 个平台 × 4 个模型 × 3 种 dtype
validate_rc() {
local platforms=("ascend-910" "ascend-910b" "ascend-950pr")
local models=("llama-7b" "llama-70b" "chatglm-6b" "qwen-14b")
local dtypes=("fp16" "bf16" "fp8")
for plat in "${platforms[@]}"; do
for model in "${models[@]}"; do
for dtype in "${dtypes[@]}"; do
echo "Testing: $plat × $model × $dtype"
run_integration_test --tag=$rc_tag \
--platform=$plat --model=$model --dtype=$dtype
done
done
done
}
每次 RC 推送,触发这个矩阵测试。3×4×3 = 36 组用例,任何一组失败则冻结期延长。
阶段 5:Release(正式发布)
RC 通过后,推送正式 Release Tag 并发布公告:
## v8.5.0 发布公告
### 版本信息
- 发布日期:2025-07-01
- Release分支:release/8.5
- 支持平台:Ascend 910/910B/950PR
### 新特性
- MoE Expert 动态负载均衡(ops-transformer)
- FP8 量化推理支持(ops-nn)
- 算子自动融合增强(graph-autofusion)
### 已知问题 & 解决方案
| 问题 | 影响 | 解决方案 |
|------|------|---------|
| FP8 在 batch < 4 时性能下降 | 小 batch 场景 | 用 FP16 替代 |
| ascend-950pr × llama-70b 的 MoE AllGather 延迟异常 | 分布式推理 | 升级 hccl 到 v2.6 |
攻陷一个补丁版本
补丁版本的实质是 cherry-pick 操作——从主分支选取防护修复到受保护的分支:
# 发布补丁 v8.0.3
# v8.0.2 用户报告了三个关键 bug:
# 1. HBM 泄漏(Driver)
# 2. FlashAttention FP16 溢出(ops-transformer)
# 3. KV Cache 碎片化(runtime)
# 修复已合入 main,现在需要 cherry-pick 到 release/8.0
# 1. 找到修复在 main 上的所有 commit
git log --oneline --grep="fix.*hbm\|fix.*flash\|fix.*kv" main
# 2. Cherry-pick 到 release/8.0
git checkout release/8.0
git cherry-pick fix_hbm # 第一个修复
# → 如果 cherry-pick 冲突:检查 8.0 的 driver 代码结构和 main 有差异
# 解冲突:对齐 main 的修复逻辑到 8.0 的代码上下文
git cherry-pick fix_flash # 第二个修复
git cherry-pick fix_kv # 第三个修复
# 3. 打补丁标签
git tag v8.0.3 -m "Fix: HBM leak + FlashAttention overflow + KV Cache fragmentation"
git push origin v8.0.3
踩坑一:Cherry-pick 丢失上下文
Cherry-pick 到旧分支时,修复代码的依赖变更可能不在旧分支上。修复在 main 上自动 pass,到了 release/8.0 上编译不过。
错误现象:修复依赖了 main 上一个重构后的辅助函数 hbm_compact()。release/8.0 没有这个函数——因为重构是 8.5 才合入的。
正确做法:cherry-pick 前检查依赖变量的变更跨度。
# Cherry-pick 前检查 dep 图
git log --oneline --graph fix_hbm..main
# 如果 fix_hbm 和 release/8.0 之间有 50+ 个 commit
# 且这些变更不在 release/8.0 上 → 必须手动解冲突,不能直接 cherry-pick
# 手动解冲突 = 把修复逻辑改写为 8.0 的代码上下文
# 不是强行合入 main 的代码
踩坑二:RC 矩阵测试忘记 BF16
只有 fp16 和 fp8 的 RC 测试矩阵——上线后 BF16 用户切模型时遇到算子不兼容。
Quest:混沌社区默认 BF16 用的人少,但部分推理模型(特别是 Qwen 系列)的官方权重是 BF16 格式。
正确做法:矩阵里务必加上 BF16 测试列——对进行 dtypes 中强制要求至少 3 个。
踩坑三:版本公告的已知问题写了太轻
版本公告的「已知问题」部分只写了「偶发性能下降」,不写具体表现——用户上线后定位不到问题。
错误写法:
### 已知问题
- ascend-950pr 上存在偶发性能下降
正确写法:
### 已知问题
- ascend-950pr 上 llama-70b MoE AllGather 延迟异常
* 表现:第 3-5 层的 AllGather 耗时从 2ms 增加到 15ms
* 影响:分布式推理的 token/s 降低 12%
* 根因:hccl < v2.6 在 950PR 上用 ring 而非 halving-doubling
* 解决方案:升级 hccl 到 v2.6+
* 跟踪问题:github.com/cann/hccl/issues/2897
release-management 不像算子仓库有代码可以跑——它的产出是一组保护分支、一份发布计划、一个完整的 RC 测试矩阵和一个清晰的版本公告。版本管理跟写 kernel 完全是两种技能:写的代码越少的工具,对「覆盖所有边际情况」的要求反而越高。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)