异步RL框架AReaL速览


异步RL框架AReaL速览

仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接

大家好,这两天速看了纯异步的RL框架AReaL,整理了一篇解读短文。
本文在写作时,读了paper,速看但没有精读代码。秉持着不看代码就不算真正搞懂和解读的原则,希望读者对本文的内容持审慎态度。另外,本文会基于自己的理解,引入一些和paper不一致的表达方式;同时在公式解读时,引入了一些关于该公式是如何逐步构造的猜想。
https ://github. com/inclusionAI/AReaL

figure1的左图刻画了【同步RL训练】的流程,具体来说:
假设初始时刻actor的权重为
rollout使用,吃一批prompt,生成对应的response。这批数据中的“每一条”都生成完毕后,rollout停止工作
trainer使用,接收这批(prompt,response)数据,进一步生成exp值,进行训练,更新权重为。
trainer将发送给rollout,rollout使用,重复上面的过程
显而易见,【同步RL训练】存在以下2个问题:
在rollout内部,序列长短不一,对长序列的处理时间成了整个rollout的卡点(短序列早就生成完了,却还要继续等长序列)
在rollout和trainer之间是没有overlap的。即rollout工作的时候,trainer闲着,反之亦然。这进一步引起了gpu的空转和训练低效的问题。
figure2的又图刻画了【1步异步RL训练】的流程,具体来说:
假设初始时刻actor的权重为
rollout使用,吃一批prompt,生成对应的response。这批数据中的“每一条”都生成完毕后,将数据同步给trainer,但此时rollout继续使用为下一批prompt做生成。
在rollout使用为第二批数据做生成的同时,trainer开始用第一批数据进行训练
trainer训练完毕,将更新至,它将广播给rollout,rollout使用这个权重做第三批数据的生成,以此类推。
通过这种方式,尽可能实现rollout和trainer间的overlap,但并没有解决rollout内部训练时的低效问题(overlap的程度受到rollout和trainer运行的相对速度的影响,例如在上例中,假若trainer训练相对慢,那么它将广播给rollout时,rollout可能已经吃了好几批数据了)
综上,AReaL提出的方法,是希望同时【消灭rollout内的bubble】和【让rollout和trainer尽量overlap】,它的运作流程如下:
我们直接从trainer将权重从更新到的这个时刻谈起,也就是figure3中training1-8结束的位置:
首先,在trainer执行->的这个训练过程中,rollout继续用做生成

也就是说,最终当一条seq进入trainer开始训练时,它的构成可能是(prompt,response0,response1,…responseN),不同的response是由不同的权重生成的。
通过这样的方式,在rollout内部,我们就不需要让短序列去等长序列了。你可以向rollout阶段发送比实际训练时更大的batch_size,这样只要rollout吐出了满足一个训练batch的数据,trainer就能直接工作。更细节的infra流程参见下图,这里大家可以自行读论文,就不再赘述了:

我们知道即代表logP,当一条数据的组成是(prompt,response0,response1,…responseN)时,各个responses部分对应的logP即是用生成它的那个权重计算出来的。而(1)中说的这个性质,即是在证明,你可以从抽象的意义上找到一个“统一”的权重,让这条数据看起来就像是这个“统一”的权重生成的一样。这个相关证明在文中的proposition1。有了这个证明,即使本质上这些logP来自不同的权重,你也可以将其视为来自某个抽象的,也就是不干扰公式(2)的逻辑。
虽然(1)已不是问题,但现在新的问题来了:的目的是限定trustregion,以便让整个ppo的训练更加稳定,所以一般不会和当前待更新的差距太远。但是现在,对于(prompt,response0,response1,…responseN),明显越往前的response,它的权重和相距甚远,也就是本身来说,用这种混合的构造出来的trustregion,就是“不可信的”,那更不要提后面PPO训练的稳定性问题了。
所以,有没有办法构造一个更“可信”的trustregion?例如,我还是找一个和差距不大的权重(假设我称呼其为),用它来构造trustregion,可以吗?
现在我们做一些符号的转换,在同步PPO中,我们把一以贯终的用于生成的权重称为。那么在异步PPO中,我们就称呼这个“多段”权重为(意思是本质上logP由不同的权重生成,但不妨碍你将其统一为一个),那么:
不做任何处理的情况下,
现在我们想重构trustregion,我们想引入一个和更相似的,则我们考虑这样改写:,注意,改写后和上面的公式仍然是等价的,改写的目的是decouple掉和间的依赖关系,引入(这个是我自己对decouple的理解,不确定对不对)
现在把改写后的结果带入原始PPO的公式中,也就是上面的公式(2)中,再做一些转换,我们得到:
观察公式(5),可以发现trustregion已经被改写,换成了。但是,由于这种等价替代的逻辑,当你在不clip的情况下,算公式(5)对的梯度时,你会发现这个梯度和原始PPO(公式(2))求出来的梯度是一致的。也就是本质上,这里只是控制了actor的更新时机(在新的、更可靠的trustregion内),但不会改变触发更新时actor的更新方向和程度。
最后,在当前AReaL实践中,behave相关的logP由rollout后端计算,其余两者由trainer后端计算,由于不同框架间存在的精度差异,这里会存在精度对不上的问题。这个后续再看看框架是如何解决的。
往期推荐
从十篇论文中探讨:如何解决推理模型的\“过度思考\“问题?
大模型推理能力飙升,但背后的代价是什么呢?
Qwen3如何实现快慢混合思考、可启动关闭
进入大模型技术群,备注:进群。


文章作者: ZejunCao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZejunCao !
  目录