跳到主要内容

画开 RollVerify:卡空转的根子,和一道挪到门口的安检

画唠
画唠

· 阅读约 5 分钟

“GPU 气泡”我第一眼以为是显存碎片之类的玩意儿。不是。它就是卡插在机架上,什么也没算。

arXiv 上挂了篇专治这个的论文,RollVerify,arXiv:2610.09914。这概念没那么难,只是被讲得玄。我前后画了两遍图才弄明白,第一版还画错了——那就先看错的那版,错的那版比对的那版有用。

第一版:我以为问题出在“那条太长”

当时理解特别朴素:长尾嘛,就是有那么几条 rollout 长得离谱,把整批拖住了。那就砍超长的,设个上限,超过就截。

 我第一版的理解:一条太长的把大家拖住了

 rollout A ├───────┤
 rollout B ├─────────┤
 rollout C ├────┤
 rollout D ├───────────────────────────────┤  ← 太长,砍掉
 rollout E ├───────┤
                              ↑
                        砍了就不等了

画完我自己觉得挺顺。盯着看了一会儿,觉得不对。

不对劲的地方

长尾那几条为什么长?因为它真在往下推。上下文窗口一大,一道难题就得一步一步走很久——长的那条往往正是信息量最大的那条。你把它砍了,训练集里剩下的全是“很快就收尾”的轨迹,模型学到的不是解题,是“碰上难的赶紧交卷”。

这不是工程上的小瑕疵,是把最该学的东西筛掉了。第一版图我现在看着想把它撕了。

所以真正的问题不是“某一条太长”,是“整批必须等最慢的那条”这个同步假设本身。强化学习本来就要靠海量 rollout 撑着,context window 一大,长度必然长成这个形状——长尾不是偶发的坏运气,是形状。

 墙钟时间 →
 rollout A ├────────┤
 rollout B ├──────────┤
 rollout C ├────┤
 rollout D ├──────────────────────────────┤
 rollout E ├───────┤
           └── B/C/E 早跑完了,卡在等 D ──┘
              这段时间的卡,全在空转

图里那段“等”,就是我开头说的气泡。它不是算得慢,是没得算。

部分 rollout,和它自带的代价

异步、部分 rollout 就是冲这个来的:谁跑够了谁先交,长的那条留到下一轮接着跑。吞吐立刻上去了。

代价也很直接——你交上来的那条轨迹,是按“刚才那版策略”生成的;等它真进训练的时候,策略已经往前走了一步。样本不够新了。偏移越大,精度掉得越狠。

已有的做法是在训练时给这些陈旧样本降权,按过期程度打个折。有效,但跟纯 on-policy 比还是有差距——这很合理,变质的菜你少放点盐,它还是变质的。

转向:别在训练里补救,在进门前验

RollVerify 的判断就一句话:把这个动作从训练中挪到训练前。

等等等等,先别急着觉得“就这”。我第一眼也是“就这?”,再想一层才觉得关键——加权和验证是两件性质不同的事。加权是在承认样本脏的前提下减小它的影响;验证是干脆不让脏的进来。看懂这一层的时候我咔哒一下扣上了。💡

打个比方:一个是收货时闭着眼收下,炒的时候少放点;一个是在收货口先闻一下,坏的那截切掉再入库。就这么个差别。

实现上它靠一个指标,OPS,off-policy 偏移指标,量化一条部分生成的轨迹相对目标策略偏了多少。(顺带说,OPS 这缩写我第一眼以为是运维那个 ops,撞得挺莫名其妙。)有了这个偏移量当尺子,它在两个粒度上验:序列级判这条整体还要不要;token 级找“从哪个 token 开始偏掉了”,把后面那段无效后缀砍掉。

 部分轨迹 ──► 算 OPS ──► 序列级:整条要不要
                     └──► token 级:从哪开始坏 ──► 砍掉坏后缀 ──► 进训练

这个比喻在这里漏风

生鲜那个比喻得标个漏风的地方。

菜切掉一截就没了,没什么争议。可一条思维链不是菜——在“看起来已经跑偏”的后缀里,它是有可能突然拐回来、把答案写对的。你在 token 级把那一段砍了,砍掉的不一定全是废料,也可能是“还没想明白但马上要想明白”的那一截。

论文说“识别并截断无效的后缀”,但这个“无效”判得多保守,我从摘要层面看不出来。这一段我也还没完全画明白,先放在这儿,以后真拿代码跑一遍再补。要跑的话我会专门盯这一格:它砍的位置,跟最终答案对不对,到底有没有相关性。有相关性,这个框架的收益就不只是省钱。

结果,以及我对结果的保留

实验在数学推理和工具辅助数学推理两类任务上做的,结论是精度跟 on-policy 训练相当,训练成本下来了。作者八个人,Dahua Lin 也在列,投稿是 Yongqiang Yao。

代码生成那边只给了初步结果,说是“在数学之外同样有效”的初步证据。初步结果就是初步结果。一类任务上的“相当精度”,挪到代码上不一定成立——代码的 rollout 长尾形状跟数学不一样,它更长、更早分叉,一道题写到一半改主意是常事。这条我留着,等后续。

自检

画开完了。照例留一句:现在你能不能给一个不碰 RL 的人讲明白,为什么“GPU 空转”这件事跟算法好坏没关系,只跟“整批等最慢那条”这个假设有关系?讲不顺的地方多半是我这里没画清楚,说给我,我重画。

还有个我一直想问的:长尾是上下文变长之后的必然形状,那到底是继续在“等”这件事上做优化,还是干脆承认同步假设该退休了?

下期想画开哪个概念,你说了算。

画唠
画唠

把被讲玄的概念用图 + 比喻 + 动手实验拆到咔哒扣明白,错的也保留。

查看主页 →