基于 Verl 前端与 Atlas A3 集群的 DeepSeek-R1 模型 RL 训练优化实践:Cann-recipes-train 仓库技术深度解读
基于 Verl 前端与 Atlas A3 集群的 DeepSeek-R1 模型 RL 训练优化实践:Cann-recipes-train 仓库技术深度解读
前言
自 DeepSeek-R1 发布以来,大模型的强化学习(RL)训练掀起了新一轮的技术热潮。各大厂商与开源社区纷纷投入实践,持续探索更高效的 RL 训练体系。本文基于 Cann-recipes-train 仓库,聚焦 Verl 前端框架 与 Atlas A3 SuperPoD 集群 的深度融合,结合 MindSpeed 与 vLLM-Ascend 的高效推理加速方案,对 RL 训练过程进行了系统优化与适配。在多项关键优化策略的加持下,成功实现了 DeepSeek-R1 模型在 A3 集群上的高吞吐率与稳定性能表现。
Cann-recipes-train 仓库全景解析:昇腾训练优化的"实战底座"
大模型训练拼效率的阶段,CANN 直接帮我们搞定了底层异构硬件适配、资源调度这些麻烦事,不用再从零研究 GPU 和 NPU 怎么协同,现有模型代码也不用大改就能对接,训 LLM 或多模态模型时还能通过算子优化、内存复用提升速度、减少资源浪费
Cann-recipes-train 仓库不搞抽象理论,全是能直接复用的代码样例,比如具体 LLM 的训练优化步骤、多模态模型的算子调试方法,帮我们跳过 “看官方文档懂了但不会用” 的坑,不用自己反复试错,快速掌握 CANN 的优化技巧,把精力集中在模型本身。
基于 Verl 框架的 RL 训练样例:从 Qwen2.5 到 DeepSeek-R1 实战

昇腾团队为方便广大开发者在昇腾环境中高效开展大模型的微调与续训,将开源的 Cann-recipes-train 仓库面向典型的 LLM 与多模态模型训练任务,提供基于 CANN 平台优化样例与实践指南,帮助开发者简单、快速、高效在昇腾平台上完成模型训练与优化部署。首批版本中,Cann-recipes-train 将上线两个基于 Verl 强化学习框架 的典型训练样例,分别覆盖 Qwen2.5 与 DeepSeek-R1-671B 两大模型
- Qwen2.5 RL 训练样例:
基于 Qwen2.5-1.5B-Instruct 模型,采用 Verl 框架,在 MATH-lighteval 数学推理数据集上进行强化学习训练,最低需单卡 Atlas A2 环境就可以运行,为开发者提供低成本 RL 入门方案,包含详细的操作步骤与可视化指导,支持通过 SwanLab、TensorBoard 等工具进行训练过程监控与指标追踪,是在昇腾环境上进行 RL 训练的 “Hello World” 级案例
- DeepSeek-R1-671B RL 训练优化实践:
基于开源 Verl 框架,结合 MindSpeed 与 vLLM-Ascend,在 Atlas A3 集群实现 GRPO 算法的高吞吐强化学习训练,在 1K 推 3K 序列场景单卡系统吞吐率达到 120 TPS,充分展现 A3 集群的算力优势与系统调优能力
除了完整的可复现代码,Cann-recipes-train 仓库公开了 DeepSeek-R1-671B RL 训练优化实践 的技术解读文档,系统分析模型间调度、训推切换、训练与推理优化等核心环节的实现思路,帮助开发者从工程与算法双视角深入理解性能优化背后的原理。
框架层适配实践:Verl + MindSpeed + vLLM-Ascend 的协同优化
Verl × MindSpeed 适配:零侵入脚本改造,快速启用 NPU 训练优化
verl 现在本身就支持 MindSpeed 训练后端,核心靠 MegatronWorker 初始化时的 repatch 机制 ,能自动把 verl 的配置参数转成 MindSpeed 能认的格式,还会把 Megatron-LM 里的训练逻辑,换成更适配 NPU 的 MindSpeed 实现,不用咱们手动改底层代码。
实际用的时候也简单,直接在 verl 的启动脚本里加参数就行,比如开闪算注意力、MoE 分组 GEMM 这些优化特性,最后在 NPU 环境上跑通了 DeepSeek-R1 的 RL 训练,确认功能没问题,省去自己搭适配链路的功夫。
Verl × vLLM-Ascend 适配:关键接口重构,全面兼容推理引擎
vLLM-Ascend 社区已经做好了 DeepSeek-R1 的昇腾适配,能直接用它提推理性能,但要让 verl 和它兼容,得改关键接口,主要是初始化 vLLMRollout 对象的 vllm_rollout_spmd.py 文件:
- 手动加 vLLM-Ascend 的 patch:导入 vLLM 前得先引这个 patch,不然有些类和函数不匹配
# 1. 先应用vLLM-Ascend patch(必须在导入vLLM前) from vllm_ascend_patch import apply_ascend_patch apply_ascend_patch()
- 配 DP 通信参数:设 VLLM_DP_MASTER_PORT 和 IP,保证每个 DP 组有独立通信端口,适应集群环境
# 2. 配置DP通信参数(多机分布式) import os os.environ["VLLM_DP_MASTER_IP"] = "主节点IP" # 如集群主节点实际IP os.environ["VLLM_DP_MASTER_PORT"] = str(29500 + dp_rank) # 每个DP组独立端口 from vllm.distributed import initialize_distributed_environment initialize_distributed_environment(backend="hccl", world_size=总DP数, rank=当前DP秩, master_addr=os.environ["VLLM_DP_MASTER_IP"], master_port=int(os.environ["VLLM_DP_MASTER_PORT"]))
- 关 sleep 模式:NPU 多机下 sleep 会导致显存释放不了,还得避免显存被 vLLM 内存池接管,后续没法手动卸载
# 3. 关闭NPU sleep模式及显存池接管 os.environ["ASCEND_NPU_SLEEP_DISABLE"] = "1" # 禁用NPU sleep os.environ["VLLM_DISABLE_MEMORY_POOL"] = "1" # 避免vLLM接管显存池
- 调 token 参数:加载真实权重时,默认 max_num_batched_token=8192 容易 OOM,改成 1024 再开 chunked_prefill 就行
# 4. 调整Token参数(避免OOM) from vllm import EngineArgs, LLM engine_args = EngineArgs(model="模型路径",max_num_batched_tokens=1024, # 降低批处理Token量chunked_prefill=True, # 启用分块预填充device="npu" ) llm = LLM(engine_args=engine_args)
性能优化(一):训推一体化与参数重排(Reshard/Offload)实践
大模型 RL 的时候,训练和推理时,模型在显卡上的分片方式完全不一样,训练时 8 张卡分成两组各 4 张(EP4),流水线也拆成多段(PP2);推理时得把 8 张卡合并成一组(EP8),流水线也不分段了(PP1)
模型训练完更新参数后,得把参数从训练的分片方式改成推理能用的(reshard),在训练组内用 alltoallv 通信,参数重排的时候没冗余数据传输,这一步快了不少
另外Actor、Rollout、Ref 三个模型挤在同一批卡上,切换的时候,前一个模型占着显存呢,不挪走新模型根本装不下,所以得先把不用的模型挪到主机内存(offload)腾地方,再把要用的加载到显卡,这部分昇腾团队专门调了显存管理和数据迁移的细节,切换耗时降了不少
这两部分优化下来,训推切换会更加顺畅,迭代效率也会明显提高。

reshard 优化核心:
- 专家参数用 AlltoAllV 定向传:只给目标推理 rank 发参数,不做全量广播,大幅减少带宽冗余,单卡增量内存从 14G 压到 0.0547G,降低 OOM 风险
- PP 域通信调顺序:先在 TP 域聚合参数,再用 PP 域 AlltoAll 广播,减少通信量如 p=8、t=4 时第一步通信量减半和通信次数
offload 优化核心:
- 替代 vLLM 有问题的功能:用 onload/offload_model_weight、init/free_cache_engine,替换 NPU 多机下不好使的 vLLM wake_up/sleep
- 省冗余步骤 + 后置初始化:省去训练后到推理前的冗余卸载 / 加载,把推理 init_cache_engine 放到 reshard、卸载训练权重之后,降内存峰值、提 vLLM 利用率
性能优化(二):训练侧优化策略与算子融合技术
- 复用MindSpeed训练优化
verl 目前对接了MindSpeed,因此训练侧主要复用了MindSpeed在内存、通信和计算方面的许多优化技术,包含Ascend Swap Optimizer和使能融合算子等,对应的配置脚本片段大概是这样
+actor_rollout_ref.actor.megatron.override_transformer_config.use_flash_attn=True \ +actor_rollout_ref.actor.megatron.override_transformer_config.moe_token_dispatcher_type='alltoall' \ +actor_rollout_ref.actor.megatron.override_transformer_config.moe_grouped_gemm=True \ +actor_rollout_ref.actor.megatron.override_transformer_config.use_fused_rotary_pos_emb=True \ +actor_rollout_ref.actor.megatron.override_transformer_config.use_fused_swiglu=True \ +actor_rollout_ref.actor.megatron.override_transformer_config.swap_optimizer=True
- old_log_prob免计算
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,就可以启用优化
性能优化(三):推理侧加速与吞吐率提升路径

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 训练整体性能提升的核心突破口!
Cann-recipes-train 仓核心定位:连接 CANN 能力与训练业务的"桥梁"
从个人角度来看,Cann仓库诞生源于大模型训练的两大痛点:一是 CANN 平台的底层优化能力如算子调度、内存管理需要结合具体模型场景才能发挥价值,开发者缺乏场景化参考;二是强化学习等复杂训练流程的工程化落地难度高,需兼顾框架整合、硬件适配与性能调优,而 Cann-recipes-train 通过 “典型模型 + 优化算法 + 可运行样例” 的组合,直接打通了 “CANN 能力→训练业务” 的链路,对开发者来说 Cann-recipes-train 不算通用训练框架,更像 CANN 平台训练优化的实战手册。
✅场景聚焦:专门针对 LLM 与多模态模型的训练业务,覆盖强化学习(RL)核心训练场景,解决大模型训练中 高吞吐、易部署、低硬件门槛的实际需求
✅技术适配:深度整合 CANN 平台的异构计算能力,将抽象的加速算法转化为可直接运行的代码样例,避免重复造轮子
✅分层支持:提供单卡入门级样例,也包含集群高性能样例,覆盖不同阶段开发者的需求
总结与展望:Cann-recipes-train 助力昇腾生态加速 AI 训练落地

cann-recipes-train 仓库针对 LLM、多模态训练场景中的典型模型、算法,提供基于 CANN 平台的优化样例,方便开发者简单、快速、高效等使用 CANN 进行模型训练
- 首批开源样例
入门样例:基于 ver1 开源框架 & A2 单卡,Qwen2.5-1.5B RL 训练样例,低成本快速上手
优化样例:基于 ver1 开源框架 & A3 集群,DeepSeek-V3 RL 训练样例,实现大集群高吞吐训练
- 沟通渠道:👉GitCode:CANN/cann-recipes-train
欢迎大家到仓库提交 ISSUE/PR,复现、捉虫、贡献新样例,和广大开发者交流讨论


