异步蒸馏能多旧?Furiosa AsyncOPD 把 on-policy distillation 推到 1.6×–3.8× 加速

你有没有这种感觉:明明 teacher 是个 30B 的庞然大物,学生只是一个 1.7B 的小不点,按理说"师傅手把手教"应该很高效,但训练起来 GPU 大半时间都在空转——一会儿等学生把话说完,一会儿等老师给每一步打分,一会儿又得等权重同步。这套节奏在 RL 里大家早已见怪不怪,但随着 on-policy distillation(OPD)逐渐成为 LLM 后训练的标配(Qwen3、GLM-5、DeepSeek 都吃这套),同样的系统瓶颈正在被搬到蒸馏上。

Furiosa AI(首尔大学合作)这篇 arXiv:2606.24143 干的事很直接:给 OPD 也做一套完全异步的 pipeline。但它又不止是一篇"我们也做了 async"的工程文章,核心价值在于系统地回答了标题那个反问——异步 OPD 到底能"陈旧"到什么程度?它把 KL 方向、advantage 重算、clipping、teacher-score 缓存、surrogate 选取、调度策略这些选项在 stale-policy 设置下挨个扫了一遍,给出一组让人有点意外的结论。

核心摘要

异步 OPD 这事听起来很美——把 rollout 和 learner 解耦,吞吐不就上去了吗?但一旦解耦,learner 用的就是旧 student 采的 rollout,而 teacher 打的分又是基于旧 student 采过的动作,数据陈旧(staleness)就开始反噬。Furiosa 这篇论文把它第一个系统化地拆开来看:

  • KL 方向决定"抗陈旧"体质:teacher 加权的 forward KL 对 stale rollouts 几乎无感,而 student 加权的 reverse KL 断崖式下跌;
  • 最优的 reverse-KL 修正就一句:把 advantage 在 learner time 重算(A_θ),别加 clip——比 Decoupled PPO、M2PO 这些花式异步 RL 代理都稳;
  • 稀疏 top-k 在 stale 下有"支撑集错位"问题——teacher 缓存里压根没那些动作的分,重加权救不了;多采样 Monte Carlo(MC)才是务实方案
  • 集成起来就是 AsyncOPD,MC64 + A_θ no clip + 流式调度,相比严格同步 OPD 吞吐提升 1.6× 到 3.8×,精度基本不损失

我的判断:这是一篇工程上很硬、分析上很细的论文。它没有提出新范式,但把"能不能异步、怎么异步"这件事从系统论文升到了带数学分析的工作,对正在搭 OPD 异步管线的人来说几乎是必读——尤其是它否定了直接搬运 RL 异步化经验的做法(DecPPO/M2PO 在 OPD 上不 work)。要注意的是:实验只在 8×B200 单节点上做,多节点扩展性留作未来工作;teacher 全词表 logits 的 dense KL 路径也未实现(他们走的就是稀疏/MC 路线)。


论文信息

  • 论文:AsyncOPD: How Stale Can On-Policy Distillation Be?
  • 作者:Wonjun Kang, Kevin Galim, Seunghyuk Oh, Minjun Kang, Sanghyun Park, Donghoon Kim, Minjae Lee, Minseo Kim, Rishabh Tiwari, Yuchen Zeng, Hyung Il Koo, Kangwook Lee
  • 机构:Furiosa AI(首尔大学合作)
  • arXiv:https://arxiv.org/abs/2606.24143
  • 代码:https://github.com/furiosa-ai/async-opd
  • 发布时间:2026-06-23
  • 类别:cs.LG

一、背景:OPD 是什么、为什么它继承了 RL 的系统病

先快速对齐一下术语。如果你是做 RL 后训练的,OPD 你大概率已经熟了;如果不熟,Thinking Machines 那个国际象棋类比已经成为业内标配:

看大师对局(off-policy 蒸馏)精彩但你压根走不到那种局面;无人指导下自己下棋(RL)只有最后一句"你输了";OPD 是教练对你的每一步走法都打"妙手/失误/漏着"的逐步评级——既在你真实会遇到的局面里训练,又给密集反馈。

数学上 OPD 通常用 per-token reverse KL 做目标:

\[D_R(\theta; s) = \mathrm{KL}\big(p_\theta(\cdot|s) \,\|\, q(\cdot|s)\big) = -\sum_{a\in\mathcal{V}} p_\theta(a|s)\big(\log q(a|s) - \log p_\theta(a|s)\big)\]

这里 \(q\) 是 teacher,\(p_\theta\) 是 student,\(s\) 是已访问的 prefix。你可能注意到:期望是按 student 自己的分布加权的。这点对理解后面整篇论文很关键,先记一下。

那 OPD 的系统病是什么?跟 RL 几乎一模一样——

On-policy systems bottleneck:每次 learner 更新必须等 fresh rollouts。对于数学/代码这类长链推理任务,rollout 既长又贵,同步训练经常在"等生成"而不是"更新模型"。

这也就是 OpenRLHF、verl、AReaL 这些 RL 框架拼命做异步的根因。但异步训练有一条铁律:rollout 用的 policy 跟 learner 当前的 policy 之间会差几步,这步数就是 staleness \(k\) RL 里已经被研究得很多了(重要性采样、Decoupled PPO、M2PO……),OPD 里呢?没人系统研究过——这就是这篇论文的入场姿势。


二、OPD 异步的"特有问题":teacher-score cache 约束

把 RL 的异步化经验直接搬到 OPD 上,会撞上一堵 RL 没有的墙:teacher 反馈的传输成本

在 OPD 异步管道里,三阶段大致是这样:

阶段 谁干 缓存什么
Stage 1: Student rollout Rollout actor(用旧 student \(p_\text{old}\) 采样) 访问过的 prefix \(s\) 上的 student 动作 \(C_\text{old}(s)\) + 对数概率
Stage 2: Teacher scoring Teacher(对缓存动作打分) Teacher logits on \(C_\text{old}(s)\),记作 \(C_\text{score}(s)\)
Stage 3: Student update Learner(已更新到 \(p_\theta\) 重新计算缓存动作的当前 \(\log p_\theta\)

问题来了:Stage 2 算完之后,全词表 teacher logits 就丢掉了——因为存/传全词表分布(比如 Qwen 系列 15 万 token)代价太高。Learn 阶段 learner 想用 reverse KL 来重算当前 student 在某些动作上的 advantage,但这些动作可能根本不在 \(C_\text{score}(s)\),teacher 没打过这个分。

这就是论文反复强调的 teacher-score cache 约束——它把 OPD 的"估计器选择"从可选项变成了硬约束。

🔴 顺带提一句:这里有一个同期工作 OPRD (arXiv:2606.06021) 走了另一条路——把 teacher 的 hidden states 传过来直接对齐表示空间,绕过 LM-head 的全词表投影,从根本上回避了 teacher logits 缓存问题。OPRD 报告 OPRD 比 top-k OPD 训练快 1.44×,显存省 54%。这两篇工作可以对照看——一个是改估计器,一个是改监督位置。


三、估计器设计:四种 KL 实现的全景图

论文 Figure 1 把估计器选择画得特别清楚,我建议你先看一眼这个图:

AsyncOPD 估计器设计全景

图 1:OPD 异步化的四种估计器设计。(a) Dense KL 是黄金标准但缓存贵;(b) Sparse top-k 暴露支撑集错位;(c) One-sample MC 在期望上可由 IS 修正但方差大;(d) 多采样 MC 既保 MC 修正性又降方差。

简单过一下这四个选项:

(a) Dense KL——理论上最干净,实践上不可行

全词表 KL 是 reference,但异步 OPD 里缓存和传输全词表 teacher logits 太贵。这条路径基本只在同步 OPD 里可行(KDFlow 走的就是这条线,但同步开销依然大)。

(b) Sparse top-k——主流做法,但有"支撑集错位"问题

这是当前 OPD 系统最常用的近似:只对 top-k 动作算 KL。

\[D_R^{\text{top-k}}(\theta; s) = -\sum_{a\in S_\theta(s)} \tilde{p}_\theta^S(a|s) \big(\log \tilde{q}^S(a|s) - \log \tilde{p}_\theta^S(a|s)\big)\]

其中 \(S_\theta(s) = \mathrm{TopK}(p_\theta(\cdot|s), k)\) 是当前 student 的 top-k 支撑集。问题来了:在异步管道里,teacher 的打分是缓存在 rollout 时刻的 \(S_\text{old}(s)\) 上,等 learner 拿到数据的时候,当前 student 的 top-k 可能跟 \(S_\text{old}\) 完全不一样——\(S_\theta\) 里的某些动作 teacher 压根没打过分。Reweighting 在 \(S_\text{old}\) 之外重归一化也救不了这个 missing teacher score 的问题。这是异步 OPD 的核心困难之一

注意一个细节:forward KL 的支撑集是 teacher 决定的(\(S_q\)),所以只要 teacher top-k 稳定,forward KL 就不受 staleness 影响;reverse KL 反过来,支撑集是 student 决定的,student 在更新,支撑集自然在变。这就是 KL 方向决定 staleness 鲁棒性的根本原因

(c) One-sample MC——可修正但方差爆炸

从 rollout 时的 \(p_\text{old}\) 采一个 local next-token 动作 \(a\)。在期望上,old-to-current IS 给的是无偏估计:

\[D_R(\theta; s) = -\mathbb{E}_{a \sim p_\theta}\big[A_\theta(a, s)\big] = -\mathbb{E}_{a \sim p_\text{old}}\big[\rho_\theta(a, s) A_\theta(a, s)\big]\]

但单个样本的 IS 估计方差大——staleness 越大、\(\rho_\theta\) 越抖,梯度噪声越炸。这一点在论文 Figure 6 里看得最直观(后面会讲)。

(d) Multi-sample MC——论文推荐的折中

这是论文的核心工程贡献之一。在每个 decoding step 从 behavior policy 采 \(m\) 个 local next-token 样本(注意:不展开成完整轨迹,否则开销爆炸),缓存并对 IS-corrected gradient 取平均:

\[\hat{L}_m^{\mathrm{MC}}(\theta; s) = -\frac{1}{m}\sum_{i=1}^{m} \rho_\theta(a_i, s) \cdot \mathrm{sg}\big(A_\theta(a_i, s)\big)\]

直觉:期望不变(仍是 \(D_R\) 的无偏估计),但平均 \(m\) 个独立 sample 后方差降到 \(1/m\) 量级。论文实验测出 m=64 在固定 prefix 下 local variance 降为 MC1 的 1.49%(接近理论 \(1/64 = 1.56\%\)),sequence-level 也有 11.2%。

注意一个 OPD 异步化里非常 nice 的事:在 RL 的多采样里,分支出 \(m\) 条完整 continuation 才能用 IS 修正——开销直接 ×m。OPD 里 sparse top-k 在同步模式下本来就是低方差近似,而异步 OPD 把"branch 出 \(m\) 个 local next-token"当成新的稀疏近似的输入信号,而不是额外的 continuation。这是 OPD 异步相比 RL 异步的一个结构性优势


四、Staleness 怎么打:关键发现 1——KL 方向决定一切

有了上面的设定,论文第一个、也是最反直觉的发现是:

Forward KL 对 stale rollouts 几乎无感,reverse KL 断崖式下跌。

直接看 Figure 2 (a):

Forward KL vs Reverse KL 在 staleness 下的对比

图 2:Forward KL 和 reverse KL 准确率随 staleness 的变化(Average = AIME24/25/AMC 平均)。Reverse KL 在 zero staleness 时起手更高(38.5% vs 35%),但随 staleness 增长断崖式下跌,到 \(k=128\) 时只剩 24%;Forward KL 几乎平稳(33–35%)。两者在 \(k \approx 32\) 处交叉。

坦率的讲,看到这个图的时候我愣了一下。

直觉上,reverse KL 才是"标准 OPD"——Thinking Machines、Qwen3、GLM-5 全都用的 reverse KL,因为它是 mode-seeking,更适合 LLM 这种高熵生成。但 reverse KL 在 zero staleness 时起手 38.5% vs forward KL 的 35%,就是那几个点的优势,全被 staleness 吃掉了\(k=32\) 交叉之后,reverse KL 反而比 forward KL 还差。

为什么 forward KL 抗陈旧? 我自己的理解是: - Forward KL 按 teacher 分布 \(q\) 加权,它需要的 teacher 分数在 \(C_\text{score}(s)\) 里是齐的——teacher 缓存的是 old student top-3 动作的 teacher logit,这套缓存对 forward KL 足够用,因为 forward KL 关心的是"teacher 觉得好的动作",而这些动作 teacher 都打过分; - Reverse KL 按 student 分布 \(p_\theta\) 加权,当 student 更新后,old student top-3 里可能已经没新 student 关心的那些动作了。Top-k 支撑集是 student-driven 的,所以"student 关心的动作"和"teacher 打过分"会出现结构性错位。

工程意义:如果你的流水线更看重 staleness 容忍度(比如学生更新特别快),forward KL 是更稳的选择;如果追求 zero-staleness 下的最高精度,reverse KL 仍是首选——但要给 staleness 留余量。论文的 stale-sensitivity slopes(Table 1)也证实了这一点:reverse KL 的 4 个 surrogate 在 AIME24 上的斜率绝对值都明显大于 forward KL(后面会再回来)。

我的小质疑:forward KL 抗陈旧是不是因为它"更粗"?Forward KL 是 mode-covering 行为,它让 student 强行覆盖 teacher 所有模式——而 reverse KL 是 mode-seeking,集中火力在 student 已经走过的路径上。在推理任务这种 high-entropy 场景下,reverse KL 的 mode-seeking 行为本来就是更精细的信号,forward KL 抗陈旧更像是"用精度换稳定性"的副产品。这个 tradeoff 在文章里没有正面讨论,但实操时要心里有数。


五、关键发现 2:A_θ 重算才是反 staleness 的真神器,clipping 反而添乱

第二个反直觉:真正抗陈旧的不是花式异步 RL 代理,而是"在 learner time 把 advantage 重算一遍"。

定义清楚几个变量再继续: - \(A_\theta(a, s) = \log q(a|s) - \log p_\theta(a|s)\)当前 student 的 advantage,learner time 重算; - \(A_\text{old}(a, s) = \log q(a|s) - \log p_\text{old}(a|s)\)rollout 时旧 student 的 advantage,已经被冻结; - \(\rho_\theta(a, s) = p_\theta(a|s) / p_\text{old}(a|s)\):重要性比率。

那 PPO-style surrogate 怎么写?给定 behavior 样本 \(a \sim p_\text{beh}\)

\[L_{\mathrm{PPO}}(\theta; A_\text{beh}) = -\mathbb{E}_{a\sim p_\text{beh}}\big[\min(\rho_\theta \cdot \mathrm{sg}(A_\text{beh}), \bar{\rho}_\theta \cdot \mathrm{sg}(A_\text{beh}))\big]\]

其中 \(\bar{\rho}_\theta = \mathrm{clip}(\rho_\theta, 1-\varepsilon, 1+\varepsilon)\)PPO 的核心思想就是用 clip 防止 \(\rho_\theta\) 太离谱时的"大步长破坏"

于是 2×2 设计自然出现:

Clipping No clipping
\(A_\text{old}\)(rollout-time) \(L_\text{old}^{\text{clip}}\)(标准 PPO) \(L_\text{old}^{\text{noclip}}\)
\(A_\theta\)(learner-time 重算) \(L_\theta^{\text{clip}}\) \(L_\theta^{\text{noclip}}\)(论文推荐的 OPD/IS surrogate)

直觉是:stale 数据下,\(A_\text{old}\) 是基于旧 student 算的,learner 大幅更新时 \(\rho_\theta\) 会爆,所以 PPO 那种 clip 是必要的。那如果换成 \(A_\theta\) 呢?\(A_\theta\) 本来就是 learner 当前的 advantage,clip 还需要吗?

看 Figure 3 (a):

A_θ vs A_old + clipping 消融

图 3:Advantage 重算和 clipping 的 2×2 消融。\(A_\theta, \text{no clip}\)(红色)最稳,从 \(k=0\) 的 38% 只缓慢下降到 \(k=128\) 的 31%;\(A_\text{old}, \text{no clip}\)(蓝色)在 \(k=16\) 崩到 1.7%——是灾难性的。Clipping 只能挽救 \(A_\text{old}\)(绿色 \(A_\theta, \text{clip}\)、紫色 \(A_\text{old}, \text{clip}\)),但对 \(A_\theta\) 反而有害。

这个图的视觉冲击很强。

\(A_\text{old}, \text{no clip}\)(蓝色)在 \(k=16\) 直接掉到 1.7%——基本就是"模型崩溃"。Clipping 把 \(A_\text{old}\) 从崩溃里拉回(紫色稳定在 20–25%),说明 PPO-style clip 确实在做"防止步长太大"的工作。

但对 \(A_\theta\) 来说,clipped 反而是累赘。为什么?我自己的理解是:

  • \(A_\theta\) 跟当前 \(\log p_\theta\) 直接相关,\(p_\theta\) 移向 teacher 方向时,\(A_\theta\) 本身就在变——clip 在这里会切掉"方向正确但步长较大"的更新;
  • 论文 Figure 5 也从统计上验证了:\(A_\theta\) 在 staleness=64 时就把 p99 的 \(\rho_\theta\) tail 压下来了——因为 \(A_\theta\) 在 stale 数据上"自带刹车",clip 反而刹车刹过了。

🔴 反 RL 异步化经验:论文进一步把 Decoupled PPO [4] 和 M2PO [33] 这两个被异步 RL 验证过的 surrogate 拉过来跑 OPD,发现它们都不如 \(A_\theta, \text{no clip}\)(Figure 4):

与 Decoupled PPO / M2PO 对比

图 4:与先进异步 RL surrogate 的对比。\(A_\theta, \text{no clip}\)(红色)最稳;DecPPO(绿色)从 \(k=4\) 就开始崩;M2PO(蓝色/紫色)在大 staleness 时掉到 28%。论文的关键否定:异步 RL 的成功经验不能直接搬到 OPD

这是整篇论文我最认可的一个洞察:RL 异步化的工具箱(clipping、Decoupled PPO、M2PO)是为"reward hacking"和"策略偏移"设计的,OPD 的优化地形不一样——它的 advantage 不是稀疏的 outcome reward,而是稠密的 token-level 教师信号。RL 那套防 reward hacking 的机制,在 OPD 里反而会抑制稠密信号

用 Table 1 量化一下斜率(值越负说明 staleness 退化越强):

方案 AIME24 slope AIME25 slope AMC slope
\(A_\text{old}\) clip(标准 PPO) -1.44 -1.42 -3.06
\(A_\text{old}\) noclip -3.99 -3.69 -8.00
\(A_\theta\) clip -1.64 -1.88 -4.06
\(A_\theta\) noclip(论文方案) -0.69 -0.38 -1.12
\(A_\text{old}\) + M2PO -0.66 -0.78 -1.75
\(A_\theta\) + M2PO -1.00 -0.81 -1.72

\(A_\theta, \text{no clip}\) 在 AIME25 上 slope 仅 -0.38,是六个方案里最稳的。M2PO 在 OPD 上"看起来有竞争力",但都是通过引入额外的 adaptive clip 预算来实现的——论文没看到 M2PO 优于简单方案,反倒更复杂的方案效果更差(比如 \(A_\theta\) M2PO slope -1.00 比 \(A_\theta\) noclip 的 -0.69 还差)。


六、关键发现 3:Sparse top-k 在 stale 下有"支撑集错位",多采样 MC 解决它

第三个发现直接对应 Figure 1 (b) 和 (c) 那个 "support mismatch" 问题。

现象:当 staleness 增加,sparse top-k 的 score 出现"鬼画符"——准确率在某个 staleness 值突然掉到接近 0%。看 Figure 6 (a):

Sampled MC vs stale top-k 对比

图 5:One-sample MC vs stale top-k 的对比。Top-k(紫色)和 Top-k+RW(蓝色)在某些 staleness 值出现断崖式崩塌(如 \(k=8\) 时 Top-k+RW 掉到 1.5%)——这就是"支撑集错位"在数值上的体现。One-sample MC with IS(红色)整体更稳,noIS(绿色)也偶有塌陷。

这就是前面讲的 support mismatch 的实证:当 \(k=8\) 时,rollout 时 student 的 top-k 跟 learner time 的 top-k 重合度大幅下降,teacher 缓存里没当前 student 想学的那些动作,reweighting 在错的支撑集上重归一化反而放大错误。One-sample MC with IS 走的是"采样动作"的支撑集,支撑集错位的概率低很多

Multi-sample MC 的方差下降看 Figure 7 (a):

Multi-sample MC 效果

图 6:Multi-sample MC(MC1/MC4/MC16/MC64)在 staleness 下的对比。MC4/16/64 几乎重合,整体在 38–40%;MC1(红色)在 \(k=128\) 时掉到 31%——单样本方差在大 staleness 时暴露。m=4 已经够用,m=64 是更保守的选择

一个值得思考的取舍:multi-sample MC 的 \(m\) 越大,teacher scoring 阶段需要的 action cache 越大(每个 step 缓存 \(m\) 个 action),传输和显存压力也越大。论文的实验显示 m=4 已经能拿到 m=64 90% 以上的好处。实操上选 m=4 还是 m=64,取决于你的 teacher scoring 显存预算和愿意为精度付多少代价。


七、AsyncOPD 调度器:流式管道对同步的胜利

所有上面的估计器选择,最终都要塞进一个调度器。论文 Figure 9 把三种调度器画得很清楚:

AsyncOPD 调度器对比

图 7:三种调度器对比。(a) Synchronous:所有阶段串行,rollout → teacher → learner,权重同步完才下一轮;(b) Step-off:rollout 和 learner 重叠 2 步,但 teacher 还是 gated batch;(c) AsyncOPD:流式,rollout 持续生成、teacher 持续打分、learner 持续消费,in-flight prefixes 在 weight sync 时保留。

三者的差异: - Synchronous:每步都 barrier(rollout 完才能 teacher 评分,teacher 完才能 learner 更新)。Learner 等 rollout,rollout 等权重同步,资源利用率低; - Step-off(参考 [19]):rollout 和 learner 重叠 2 步,但 teacher 还是按 gated batch 同步——意味着 teacher 评分阶段仍会卡 gating barrier,长尾问题没解决; - AsyncOPD:完全流式。Rollout 持续生成(不等待 weight sync,只缓存 in-flight prefix),teacher 持续对缓存动作打分(持续进 FIFO 队列),learner 持续消费。用队列深度 \(\tau\) 做 capacity bound,FIFO 不因 staleness 驱逐 item

这里要夸一下 paper 的一个工程细节:AsyncOPD 的 weight sync 不"等所有 rollout 结束",而是保留 in-flight prefixes——也就是权重更新那一刻正在生成的 rollout 不被打断,而是带着新权重继续生成最后几步。这避免了 step-off 那种"要么全等、要么全打断"的硬切换,长尾等待时间被砍掉。

实测吞吐 vs 精度——直接上 Table 2 的核心结果(Qwen3-Base + MC64):

Student Scheduler Train tok/s (×sync) Overlap AIME24 Avg@32
1.7B Strict sync 8.7k (1.00×) 0.81 8.85
Two-step-off 14.2k (1.64×) 1.49 8.23
AsyncOPD 23.4k (2.70×) 2.13 9.38
4B Strict sync 9.5k (1.00×) 0.81 25.00
Two-step-off 12.4k (1.30×) 1.64 23.85
AsyncOPD 15.8k (1.66×) 2.19 25.00
8B Strict sync 7.5k (1.00×) 0.81 26.56
Two-step-off 11.6k (1.55×) 1.76 26.56
AsyncOPD 14.5k (1.94×) 2.24 28.65

最爽的对比:1.7B 那个 case,AsyncOPD 跑出 2.70× speedup 同时 AIME24 从 8.85% 涨到 9.38%——又快又涨精度。论文也报告了在 Qwen3 thinking-disabled 设置上 最高 3.82× speedup(4B,MC64)。

🔴 有个数字我要点一下:1.7B-Base 的 AIME24 是 8.85%,4B-Base 直接 25%——这俩数差距巨大。不是 AsyncOPD 变强了,是 4B 模型的 base 能力本身就在 25% 这一档。论文的"速度vs精度"对比都是在同一 base model 内做的横向对比,所以精度差异是 scheduler 引起的,不存在跨模型的能力错位问题。

训练时间曲线看 Figure 11 (a):

Qwen3-4B-Base 训练曲线

图 8:Qwen3-4B-Base + MC64 的训练曲线(Train time vs AIME24 Avg@32)。AsyncOPD(红色)提前约 2 小时达到同样的 25% 精度;strict sync(蓝色)需要约 7 小时。这是 wall-clock 上的真实加速,不是"同 step 多跑了一点精度"的伪加速


八、我对这篇论文的判断

先说优点: 1. 第一个系统化拆解异步 OPD 的工作。在 Qwen3、GLM-5 都把 OPD 当主菜用的当口,这篇直接告诉你"异步化应该怎么做、坑在哪里",是工业界很需要的一手资料。 2. 不堆 RL 异步化经验,敢于否定。直接拿 Decoupled PPO、M2PO 来对比,并且给出"为什么 OPD 不需要这些花式机制"的分析——这种"我做了但发现不 work 也写出来"的态度,在大模型论文里其实越来越少见。 3. 开源了完整 AsyncOPD pipelinegithub.com/furiosa-ai/async-opd),基于 AReaL 异步框架改造。工程上对想在 OPD 上做异步的团队很友好。 4. 对 KL 方向的对比是干净的"控制变量"实验——同样 sparse top-k、同样 MC、只是 KL 公式里 q 和 p 互换位置,就把"为什么 reverse KL 抗陈旧"这个现象钉死了。

接着说我的保留: 1. 单节点 8×B200 的实验设置。论文自己也承认"受资源限制、非管道限制"。多节点 cluster 下的 FIFO 队列、跨节点 weight sync、跨节点 teacher scoring 这些都没验证。我个人的工程直觉是:单节点 2.7× 的 speedup 放到 64/128 节点上至少要打 7–8 折——因为节点间通信会成为新的瓶颈。 2. dense KL 路径完全没碰。论文聚焦在 sparse top-k 和 MC 上,因为"全词表 teacher logits 缓存太贵"。但 OPRD (arXiv:2606.06021) 的工作表明,传 teacher hidden states 然后重算 student logits 也是一条不损失精度的路径——OPRD 在 top-k OPD 上拿到 1.44× 训练加速和 54% 显存节省。AsyncOPD + OPRD 的组合是个值得探索的方向。 3. forward KL 的"抗陈旧"机制没有 deep dive。论文只是展示了"forward KL 不怕 stale"的现象,没解释清楚这是 KL 数学性质决定的,还是 OPD 异步化工程上的偶然。直觉上 forward KL 抗陈旧的部分原因是它 mode-covering,容忍 student 没覆盖到的模式——但这跟 RL/蒸馏里的 forward KL 行为是否一致,我没在论文里看到严格论证。 4. 基准只有 AIME/AMC 三个数学题集。OPD 在代码、agent 任务上的表现可能跟数学不一样——这些任务的 rollout 长度分布、长尾特性都不同,异步化的瓶颈结构可能也会变。没看到这些基准的实验,是论文的一个明显空缺

工程启发——如果你的团队正在搭 OPD 异步管线: - 别无脑搬运 RL 异步化经验。Decoupled PPO、M2PO 在 OPD 上不 work,clipping 在 reverse-KL OPD 上是反作用; - A_θ + no clip + multi-sample MC (m=4~16) 是个不错的默认起点; - forward KL 是 staleness 缓冲池。如果你的流水线更新频率高、不能保证低 staleness,forward KL 给你更大的安全边际,但会牺牲 zero-staleness 下的精度上限; - FIFO 队列 + weight sync 时保留 in-flight prefix 是 AsyncOPD 的关键工程 trick,不要为了"超参数清爽"而做 weight barrier。


写在最后

AsyncOPD 给我最大的启发不是它提了新方法,而是它告诉我们 OPD 的异步化跟 RL 的异步化长得像、骨子里不一样

RL 异步化的核心矛盾是 sparse reward + 大步长破坏(PPO 用 clip 解),OPD 异步化的核心矛盾是 dense teacher signal + 支撑集错位。两者的修复机制完全不一样——把 RL 的修复机制直接搬过来,是 AsyncOPD 论文里 DecPPO 和 M2PO 表现糟糕的根本原因。

顺便说一个让我眼前一亮的点:multi-sample MC 的 "\(m\) 个 local next-token 样本" 这种"在 OPD 异步里分支几乎零成本"的设计,跟 RL 异步里"分支出 \(m\) 条完整 continuation"的成本结构形成鲜明对比。OPD 异步化相比 RL 异步化有结构性的工程优势——这一点论文没单独拎出来强调,但我觉得对做系统的人来说是个挺重要的洞察。

如果你也在做 OPD 异步化,论文代码 都开源了,可以直接拿 Figure 1 的 2×2 消融框架 当起步 checklist。


觉得有启发的话,欢迎点赞、在看、转发。跟进最新 AI 前沿,关注我。