作者:昇腾实战派

 

一、异步异卡概念澄清

异卡和共卡

训练和推理两个任务是否在同一张卡上。对应的准确表达是Disaggregated 和 colocated。为啥不把中文一一对应,因为colocated也有是共位还是共卡的歧义。

因为共卡这个词,是盘古提出的RL Fusion,认为和colacated的区别在于支持共卡的灵活部署,支持训推有不同的切分策略,但是感觉现在的veRL里应该默认都支持了。所以现在colocated、fusion、共卡、共位好像是同一个词了。后面就只说异卡和共卡了。

异卡的好处在于可以各干各的,为后面的异步提供基本保证,但是需要通信。

共卡的好处就是都在一张卡上干,通信量少,resharding啥的成本不高。坏处就是不可避免要在卡间进行同步等待,全部推理结束才能训练,容易受长尾问题影响(如果有一项技术可以让不同节点分时启动训练,或者共卡下的推理负载均衡,那就也能解决这个坏处)

异步和同步

这里指的也是训推间的关系,是否需要相互等待阻塞。同步方法就是,得先rollout才能进行后续的训练,这也符合RL的流程定义。而异步则是指训推两个流程没有直接的依赖和阻塞关系,训练和推理可以同时触发任务。当然本质上训练仍然需要推理的输入,因此此时需要引入第三方进行数据的管理,训推进程只需要和数据管理交互,而不需要感知对方的工作情况。

回到这四个概念,本质上异步与否是指训推的执行顺序是否相互依赖,属于上层逻辑层面关系,而异卡与否是指他们实际使用资源的位置,是底层资源层面的关系,理论上两者是没有一定的绑定关系。但是目前的方案,基本都是基于异卡的异步,也就是说异卡是异步的前提。

参考文献

https://arxiv.org/html/2504.15930?\_immersive\_translate\_auto\_translate=1

https://gitcode.com/ascend-tribe/ascend-training-system/tree/main/RLOptimization

 

二、veRL异步异卡方案timeline

veRL异步异卡方案的经历了MultiTurn Rollout、AgentLoop、RecatAgentLoop、AsyncFlow TransferQueue、OnestepOff、Fully Async Policy Trainer等多轮探索创新。

 

MultiTurn Rollout 4.25

原理

  • AsyncLLMWorker: vllm server实例
  • AsyncLLMServerManager: 管理实例
  • ChatScheduler:跨实例的请求调度

代码使能

config.actor_rollout_ref.rollout.mode = "async"
actor_rollout_ref.rollout.chat_scheduler=examples.ppo_trainer.naive_chat_scheduler.NaiveChatCompletionScheduler

意义

没有变动训练流程,还是共卡。训练仍然需要等待推理结束。但是通过server实现异步,给不同组件接入提供了可能。

参考文献

https://github.com/volcengine/verl/pull/1138

 

AgentLoop 6.19

原理

设计目标

  1. 可插拔的用户自定义AgentLoop
  2. 定义不同框架间的标准接口
  3. 在推理服务间实现requst level的负载均衡
  4. 不关心工具调用

把原来的AsyncLLMServerMangaer做了进一步的封装,他只关注llm server调度,往上一层AgentLoop,既可以调度llm,又可以调度别的工具

  • AgentLoopBase: rollout基类,可以和llm server交互,也可以和其他环境交互,实现了目标2
  • AgentLoopWorker: 继承,处理单个prompt,执行loop任务.实现了目标1
  • AgentLoopManager: 获取数据,分发给AgentLoopWork,实现了目标3
  • AsyncLLMServerManager​: 管理多个Server,发送请求调度,和前面的工作内容保持一致

代码使能

config.actor_rollout_ref.rollout.mode = "async"

意义

实现了agentic rl。能一边调用工具,一边调用llm

参考文献

6.19 [rollout] feat: add agent loop https://github.com/volcengine/verl/pull/2124

7.17 Agent loop https://github.com/volcengine/verl/blob/main/docs/advance/agent\_loop.rst

 

RecatAgentLoop 7.11

原理

基于AgentLoop框架,实现了实际例子LangGraph。

  • ChatModel:按照LangGarph的协议定义了模型,能够bindtools以及generate
  • ​ReactAgentLoop:​入口,能够调用工具去执行任务

代码使能

定义工具

绑定给ReactAgent

actor_rollout_ref.rollout.mode=async \

actor_rollout_ref.rollout.agent.agent_loop_config_path=$agent_loop_config_path \

意义

基于AgentLoop,遵守LangGraph协议的Retool实践

参考文献

7.15 基于Agentloop的应用,gsm8k的agentic rl训练 https://github.com/volcengine/verl/blob/main/docs/start/agentic\_rl.rst

7.11【应用】MathExpression: LangGraph Agent Example https://github.com/volcengine/verl/blob/main/recipe/langgraph\_agent/example/README.md

7.11 【应用】[rollout] feat: add ReactAgentLoop based on LangGraph https://github.com/volcengine/verl/pull/2463

 

AsyncFlow TransferQueue 10.20

原理

引入流式数据调度+异步强化学习算法,构建数控分离结构,用TransferQueue用于数据存储和调度,分离了数据的生产和消费。

加入TQ前后的流程对比

代码使能

python3 -m recipe.transfer_queue.main_ppo

TransferQueueController全局数据管理控制

TransferQueueStorageSimpleUnit分部署数据存储

TransferQueueClient 用户界面的封装,包含整个流程

  1. 像TransferQueueController发送数据请求
  2. TransferQeueController扫描所有元数据,根据负载均衡策略,动态组合一个micro-batch的数据返回(sapmle-level的负载均衡)
  3. 处理数据

意义

改造了数据管理,训练和推理不再需要前后执行,彻底解耦。带来prompt-level负载均衡。还有很多todo

参考文献

0702 Asyncflow论文 https://arxiv.org/abs/2507.01663

1020 [data] feat: TransferQueue - An asynchronous streaming data management system https://github.com/volcengine/verl/pull/3649

pr对应的markdown https://github.com/volcengine/verl/blob/main/docs/data/transfer_queue.md

 

OnestepOff 7.17

原理

基于原来的pipeline,用最小的代价实现了异步。虽然看着变扭,单确实拿到了很多收益。

代码使能

意义

正式开始训推异步, 在不变动数据传输的基础上,用只错位一步的方式拿到了异步收益

参考文献

7.17 [trainer, fsdp, vllm, recipe] feat: one step off async training recipe https://github.com/volcengine/verl/pull/2231/files

Recipe: One Step Off Policy Async Trainer https://github.com/volcengine/verl/blob/main/docs/advance/one\_step\_off.md

 

Fully Async Policy Trainer 10.17

原理

  • Rollouter:生产者,逐样本生成,放入MessageQueue,生产速度收新鲜度控制。支持partialRollout,没推完的sleep下一轮接着搞。
  • MessageQueue:管理数据,分发数据
  • Trainer:数据消费,trigger_parameter_sync_step后进行参数同步
  • ParamerSynchronizer:基于nccl实现参数同步
  • 设置staleness threshold新鲜度阈值,支持基于旧参数样本进行
  • prompt-level的负载均衡

代码使能

  • async_training.trigger_parameter_sync_step 设置多少次训练后进行参数同步。
  • async_training.staleness_threshold 最大允许使用的staleness样本比例。0是同步,不允许使用不新鲜异步的数据
  • async_training.partial_rollout 新鲜度>0的时候,可以使能

(a) step=1, threshold=0 (因为不是共卡,这种等待导致他比原来的共卡同步方案空泡更大)

(b) step>=1, threshod=0 (step=1就是onestep off)

(c) step>=1, threshod>0, partial_rollout=False 数据够了,训练过程推理也不闲着,继续推。没用完的不新鲜数据下一次接着用,areal的方案是直接扔掉

(d) step>=1. threshod>0, partial_rollout=True 没推理完数据,sleep,权重更新后接着推,也是不新鲜数据,但是没那么不新鲜

意义

如题所示!fully async,提供几个参数提供自由的模式配置,给算法人员提供了更多的实验可能。完全体的推理负载均衡。

参考文献

https://wiki.huawei.com/domains/4600/wiki/241354/WIKI202510218647683

https://github.com/volcengine/verl/blob/main/docs/advance/fully\_async.md

https://github.com/volcengine/verl/blob/main/recipe/fully\_async\_policy/README\_zh.md

10.17 [trainer, recipe] feat: fully async training recipe  https://github.com/volcengine/verl/pull/2981

 

总结

个人意见,仅供参考!

  • 目前的方案都是异卡基础上的异步,默认异步pr 正在进行中
  • AsyncFlow还有进一步的工作,但是面对FullyAsync,要拿出更多的亮点
  • Onestep off这种最小改动拿到异步收益很厉害,FullyAsync感觉是一个非常好的异步实验平台,很全面,有短时间内最优方案的样子
  • server模式下对工具提出很大挑战,已经存在异步下profiling不能用的情况了。
  • 所有的异步方案都是在卷空泡率、利用率等指标,相关的标准、工具还是空缺着。
  • 调优思路需要从离线调优变成服务化调优,除了先保证离线任务的精度性能以外,也要构建服务化下的精度性能调优方法论。

其他参考资料

Magistral https://arxiv.org/abs/2506.10910

AReaL: A Large-Scale Asynchronous Reinforcement Learning System for Language Reasoning https://arxiv.org/abs/2505.24298

StreamRL: Scalable, Heterogeneous, and Elastic RL for LLMs with Disaggregated Stream Generation https://arxiv.org/abs/2504.15930

 

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐