Verl Full Async架构昇腾实践
在大规模语言模型的强化学习(RL)训练中,高效利用计算资源是提升训练效率的核心挑战。传统RL框架普遍采用共卡共进程方案,即每张NPU在训练中仅执行单一任务,导致训练流程严格串行执行(Rollout→Train→Sync)。这种设计在实际开发中面临显著瓶颈:当处理长尾序列时,部分NPU的推理延迟会引发其他NPU的空闲等待,无法通过增加资源缓解,造成整体训练效率下降。为解决这一问题,我们设计了Full
作者:昇腾实战派
背景概述
在大规模语言模型的强化学习(RL)训练中,高效利用计算资源是提升训练效率的核心挑战。传统RL框架普遍采用共卡共进程方案,即每张NPU在训练中仅执行单一任务,导致训练流程严格串行执行(Rollout→Train→Sync)。这种设计在实际开发中面临显著瓶颈:当处理长尾序列时,部分NPU的推理延迟会引发其他NPU的空闲等待,无法通过增加资源缓解,造成整体训练效率下降。为解决这一问题,我们设计了Full Async架构,通过解耦训练与推理流程,实现真正的并行化,最大化资源利用率。
问题与挑战
在传统RL框架中,训练流程的串行特性导致资源利用率低下。例如,当使用FSDP切分与VLLM后端时,每一步均需进行状态切换:Rollout阶段卸载FSDP、唤起VLLM进行推理;训练阶段则休眠VLLM、重新加载FSDP切分。这种设计在处理长尾序列时,会引发资源闲置问题——当某NPU因长尾序列延迟时,其他NPU将进入空闲状态,无法通过扩展资源解决,显著延长训练时间。
Full Async架构解决方案
Full Async架构的核心在于将Rollout和Train两个关键阶段解耦,并通过消息队列实现阶段间通信。该设计在Verl框架中实现,通过以下关键机制解决传统瓶颈:
架构概览

- Rollouter:持续生成训练样本,支持VLLM、Sglang等推理后端。
- 消息队列:作为生产者-消费者桥梁,存储并传递样本。
- Trainer:消费样本进行训练,并在指定步数触发参数同步。
核心组件设计
-
Rollouter
通过staleness机制控制样本新鲜度,允许部分过时样本被使用。staleness_threshold参数定义可接受的样本过时比例,max_required_samples计算公式为:max_required_samples = required_samples * (staleness_threshold + 1) * trigger_parameter_sync_step
当staleness_threshold=0时,等同于传统共卡模式;当>0时,允许使用过时样本,避免因等待新样本导致的资源闲置。 -
Trainer
采用同步阻塞实现训练逻辑,维护关键状态:global_steps:记录训练步数current_param_version:参数同步次数local_trigger_step:触发同步的步数计数器
在达到trigger_parameter_sync_step时触发参数同步,更新staleness_samples计数。
-
消息队列
基于异步双端队列实现,通过加锁保证一致性。当队列满时自动丢弃左侧旧数据,确保系统稳定性。 -
Checkpoint Engine
采用HCCL通信引擎实现高效权重同步:- 为参数同步创建专用通信组(仅Trainer rank0参与广播)
- 通过桶划分降低通信次数(N个tensor→M个桶)
- 元数据与tensor分离传输(ZMQ传输元数据,HCCL广播tensor)
显著降低通信开销,提升同步效率。
资源管理创新
Full Async采用独立资源池设计,彻底解耦训练与推理资源:
- trainer_pool:专用于训练任务,由
trainer.nnodes和trainer.n_gpus_per_node配置 - rollout_pool:专用于推理任务,由
rollout.nnodes和rollout.n_gpus_per_node配置
这种设计确保Rollouter和Trainer在运行时互不干扰,实现真正的并行执行。资源分配逻辑简化为:
# 资源池配置示例
trainer_pool = ResourcePool(nnodes=2, n_gpus_per_node=4)
rollout_pool = ResourcePool(nnodes=1, n_gpus_per_node=8)
核心优势
Full Async架构带来三大关键优势:
-
资源隔离与优化
Rollouter与Trainer使用独立资源池,可根据负载动态分配,避免传统方案中因等待导致的资源闲置。 -
并行化效率提升
训练与推理完全并行执行,重叠时间消耗。例如,Trainer进行模型训练时,Rollouter持续生成新样本,端到端训练时间显著缩短。 -
Staleness与Partial Rollout增强
staleness_threshold允许使用部分过时样本,填充训练空闲时间partial_rollout支持未完成样本在参数同步后继续推理,进一步提升资源利用率
支持场景
Full Async支持四种训练模式,覆盖多样化需求:
| 模式 | 特性 | 适用场景 |
|---|---|---|
| On-policy pipeline | trigger_parameter_sync_step=1, staleness_threshold=0 |
基础异卡训练 |
| Stream off-policy pipeline | trigger_parameter_sync_step>1, staleness_threshold=0 |
单次同步拆分为多个minibatch |
| Async stream with staleness | trigger_parameter_sync_step>1, staleness_threshold>0, partial_rollout=False |
允许使用过时样本 |
| Async stream with partial rollout | trigger_parameter_sync_step>1, staleness_threshold>0, partial_rollout=True |
未完成样本继续推理 |
实际应用
Verl框架已全面支持Full Async架构,可应用于Agent训练场景。AgentSDK目前已支持Verl后端,支持Math、SWE、WebSearch等任务的RL训练。当前版本已实现Hybrid和One-step Off模式,Full Async模式在后续版本中将全面支持,为大规模语言模型训练提供更高效的解决方案。
总结
Full Async架构通过解耦训练与推理流程,有效解决了传统RL框架中的资源闲置问题。其设计简洁高效,核心逻辑仅需35行代码实现,显著提升训练并行度和资源利用率。在实际应用中,该架构已证明能有效缩短端到端训练时间,为大规模语言模型的RL训练提供了更优的工程实践方案。
更多推荐


所有评论(0)