cann-recipes-train 实战:昇腾 DeepSeek-R1 与 Qwen2.5 强化学习优化
仓库概览
cann-recipes-train 旨在为大模型训练提供基于 CANN 平台的优化样例与实践指南。在昇腾环境中,该仓库面向典型的 LLM 与多模态模型训练任务,提供可直接复用的代码样例,帮助开发者跳过'看文档懂了但不会用'的坑,快速掌握 CANN 的优化技巧。
首批版本中上线了两个基于 Verl 强化学习框架的典型训练样例:
- DeepSeek-R1 RL 训练优化:基于开源 verl 框架,搭配 MindSpeed+vLLM-Ascend 框架,在 Atlas A3 集群实现 GRPO 算法的高吞吐 RL 训练,系统吞吐量可达 120 TPS/卡。
- Qwen2.5 强化学习(入门):基于 Qwen2.5-1.5B-Instruct 模型,采用 verl 框架,在 MATH-lighteval 数学推理数据集上训练,仅需单卡 Atlas A2 环境即可快速上手。
环境准备
资源配置
- 计算资源:NPU 910B,32 vCPU + 64GB 内存。
- 容器镜像:ubuntu22.04-py3.11-cann8.2.rc1-sglang-main-notebook。
启动后通过 npu-smi 检查 NPU 状态、利用率及显存占用情况,确保资源低负载且无冲突进程。
依赖安装
将 cann-recipes-train 克隆到本地,进入 rl_train 目录查看特定模型的 RL 训练样例集合。
对于 DeepSeek-R1 项目,需安装核心依赖(如 verl、torch_npu 等)。虽然部分版本可能存在冲突,但不影响核心功能运行。同时拉取 Verl(指定 Commit)、vLLM(v0.9.1)、vLLM-Ascend(打补丁)及 Megatron-LM、MindSpeed 等多个指定版本的 AI 相关依赖框架,复制到对应目录下搭建适配环境。
DeepSeek-R1 优化实践
部署要求
- 硬件:Atlas A3 系列,最少 128 张 A3 卡。
- 框架:Verl + MindSpeed-LLM + vLLM-Ascend。
关键优化点解读
1. 框架适配:Verl × vLLM-Ascend
vLLM-Ascend 社区已做好 DeepSeek-R1 的昇腾适配,但要让 verl 和它兼容,需修改关键接口,主要是初始化 vLLMRollout 对象的 vllm_rollout_spmd.py 文件。
- 手动加 Patch:导入 vLLM 前需先引入 patch,否则部分类和函数不匹配。
- DP 通信参数:设置
VLLM_DP_MASTER_PORT和 IP,保证每个 DP 组有独立通信端口,适应集群环境。 - 关闭 Sleep 模式:NPU 多机下 sleep 会导致显存释放不了,还需避免显存被 vLLM 内存池接管,后续无法手动卸载。
- 调整 Token 参数:加载真实权重时,默认
max_num_batched_token=8192容易 OOM,建议改为 1024 再开启 chunked_prefill。
2. 训推一体化与参数重排(Reshard/Offload)
大模型 RL 训练时,训练和推理的模型分片方式完全不同。训练时 8 张卡分成两组各 4 张(EP4),流水线拆成多段(PP2);推理时需合并成一组(EP8),流水线不分段(PP1)。
模型更新参数后,需将参数从训练的分片方式转为推理可用(reshard)。在训练组内使用 alltoallv 通信,参数重排时无冗余数据传输,速度较快。
此外,Actor、Rollout、Ref 三个模型挤在同一批卡上,切换时需先将不用的模型挪到主机内存(offload)腾地方,再把要用的加载到显卡。昇腾团队专门调了显存管理和数据迁移细节,显著降低了切换耗时。
- Reshard 核心:专家参数用 AlltoAllV 定向传,只给目标推理 rank 发参数,不做全量广播,大幅减少带宽冗余。单卡增量内存从 14G 压到 0.0547G,降低 OOM 风险。PP 域通信调顺序,先在 TP 域聚合参数,再用 PP 域 AlltoAll 广播。
- Offload 核心:替代 vLLM 有问题的功能,用
onload/offload_model_weight、init/free_cache_engine替换 NPU 多机下不好使的 vLLMwake_up/sleep。省去训练后到推理前的冗余卸载/加载,把推理init_cache_engine放到 reshard、卸载训练权重之后,降内存峰值、提 vLLM 利用率。
3. 训练侧优化策略与算子融合
复用 MindSpeed 训练优化。verl 对接了 MindSpeed,因此训练侧主要复用了其在内存、通信和计算方面的优化技术,包含 Ascend Swap Optimizer 和使能融合算子等。
针对 GRPO 这类 on-policy 算法,old_log_prob 的计算结果与 update_actor 环节前向计算得到的 log_prob 完全一致。昇腾团队用 log_prob.detach() 直接替代 old_log_prob,省去一次训练模型的前向计算,大幅节省耗时。考虑到 verl 原生不支持这一优化,团队专门为其补充实现了该功能,只需将配置项 config.actor_rollout_ref.actor.recompute_old_log_prob 设为 False 即可启用。
4. 推理侧加速与吞吐率提升
在 DeepSeek-R1 "1K 推 3K" 的 RL 推理场景中,基础吞吐为 162 token/p/s。通过多轮技术迭代实现阶梯式跃升:
- 基于 TorchAir 图模式 + AIV 加速 + vLLM-V1 框架优化,吞吐提升至 419 token/p/s。
- 消除大 EP 场景下的 Transpose 冗余算子 + Cumsum 冗余计算,进一步提升至 456 token/p/s。
- 引入 MoE/MLA 多流并行 + router 逻辑优化,突破至 487 token/p/s。
- 优化零冗余 TP 转 EP 通信机制,性能达 519 token/p/s。
- 通过 DP 间 EOS 检测调度优化,推理吞吐成功突破 618 token/p/s。
一系列优化大幅压缩了长序列 RL 推理的耗时占比,成为推动 RL 训练整体性能提升的核心突破口。
Qwen2.5 强化学习实践
基于 Qwen2.5-1.5B-Instruct 模型,搭配 verl 强化学习框架,在 MATH-lighteval 数学推理数据集上开展训练。目标是提升小模型复杂数学问题的分步推理能力,生成逻辑严密、结果可验证的推理过程。硬件门槛最低仅需单卡 Atlas A2 环境。
配套优化版 MATH 任务奖励函数
针对原生奖励函数'字符串等价性误判、奖励信号稀疏'的问题,通过多维度分级评分引导模型精准学习。
verl 框架下 MATH 任务的奖励函数总分 1 分,遵循'答案正确性优先'原则:
- 答案错误直接得 0 分。
- 答案正确则分三维度打分:
- math_verify 做数学语义验证的准确度占 0.7 分。
- 符合指定标签样式且规范的格式占 0.2 分。
- 包含有序思考步骤与逻辑关键词的思维链占 0.1 分。
同时答案错误时不评估格式、思维链,避免模型偏离精准求解目标。既解决了原生函数的误判问题,也通过多维度评分缓解了奖励稀疏,引导模型生成更规范的表达和更完整的推理过程。
总结
cann-recipes-train 仓库针对 LLM、多模态训练场景中的典型模型、算法,提供基于 CANN 平台的优化样例,方便开发者简单、快速、高效地使用 CANN 进行模型训练。
- 入门样例:基于 verl 开源框架 & A2 单卡,Qwen2.5-1.5B RL 训练样例,低成本快速上手。
- 优化样例:基于 verl 开源框架 & A3 集群,DeepSeek-R1 RL 训练样例,实现大集群高吞吐训练。
该仓库不仅提供了代码,更像是一本 CANN 平台训练优化的实战手册,连接了底层优化能力与具体训练业务,帮助开发者解决高吞吐、易部署、低硬件门槛的实际需求。


