EasyOPD: 一种易用的面向大语言模型在策略蒸馏框架

arXiv cs.CL 论文

摘要

EasyOPD 是一种新型的大语言模型在策略蒸馏框架,它将配置、监督逻辑和执行分离开来,并支持跨分词器、自蒸馏和逐步 OPD。

arXiv:2607.11012v1 公告类型:新 摘要:传统的语言模型蒸馏通常依赖于固定的教师生成数据,这可能无法覆盖不断演化的学生策略所遇到的状态。相比之下,在策略蒸馏(OPD)在学生生成的交互轨迹上收集教师或评估者的监督信号。然而,现有的 OPD 方法在监督形式、分词器兼容性、教师访问权限以及监督粒度上存在显著差异,导致实现碎片化,难以复现和扩展。我们提出了 \textsc{EasyOPD},一个基于 verl(一种用于大语言模型的分布式强化学习框架)构建的在策略蒸馏框架。\textsc{EasyOPD} 将用户侧配置、方法相关的监督逻辑以及基于 verl 的执行相分离。其方法模块通过扩展接口连接到共享后端,用于损失构建、轨迹元数据、奖励处理、分词器对齐以及教师侧计算。我们针对三种 OPD 场景实例化了代表性方法:跨分词器 OPD、在策略自蒸馏以及逐步 OPD。在推理、代码生成、科学知识以及工具使用基准上的实验表明,这些实现可以通过同一个基于 verl 的后端执行,同时保留其方法特定的目标和任务相关的性能特征。我们发布了 \textsc{EasyOPD},包含可运行的 YAML 配置文件、文档、可安装的演示包以及视频。
查看原文
查看缓存全文

缓存时间: 2026/07/14 04:23

# 一个易用的在线策略蒸馏框架:面向大型语言模型
来源: https://arxiv.org/html/2607.11012
Jie Sun1,3,∗,§, Mao Zheng2,∗, Mingyang Song2,∗, Qiyong Zhong1,∗,§ Gengsheng Li1,∗,§, Zhepei Hong1, Chang Wu1, Pengfei Liu3 Junfeng Fang4,†, Xiang Wang1,† 1中国科学技术大学2腾讯科技(深圳)有限公司大语言模型部3上海创新研究院4新加坡国立大学 https://github.com/lds-ustc/EasyOPD

###### 摘要

传统的语言模型蒸馏通常依赖固定的教师生成数据,这可能无法覆盖学生策略演化过程中遇到的状态。在线策略蒸馏(On-policy Distillation, OPD)则收集教师或评估者对 students 自行生成的 rollout 数据的监督。然而,现有的 OPD 方法在监督形式、分词器兼容性、教师访问方式以及监督粒度上存在显著差异,导致实现碎片化,难以复现和扩展。我们提出 **EasyOPD**,一个基于 verl(一个用于大型语言模型的分布式强化学习框架)构建的在线策略蒸馏框架。EasyOPD 将用户端配置、方法特定的监督逻辑和基于 verl 的执行分离开来。其方法模块通过扩展接口连接到共享后端,这些接口用于损失构建、rollout 元数据、奖励处理、分词器对齐以及教师侧计算。我们为三种 OPD 设置实例化了代表性方法:跨分词器 OPD、在线自蒸馏和逐步 OPD。在推理、代码生成、科学知识和工具使用基准上的实验表明,这些实现可以通过相同的基于 verl 的后端执行,同时保留其方法特定的目标和任务相关的性能特征。我们发布了 EasyOPD,包含可运行的 YAML 配置文件、文档、一个可安装的演示包和视频。

---

**EasyOPD: 一个易用的在线策略蒸馏框架:面向大型语言模型**

Jie Sun1,3,∗,§, Mao Zheng2,∗, Mingyang Song2,∗, Qiyong Zhong1,∗,§Gengsheng Li1,∗,§, Zhepei Hong1, Chang Wu1, Pengfei Liu3Junfeng Fang4,†, Xiang Wang1,†1中国科学技术大学2腾讯科技(深圳)有限公司大语言模型部3上海创新研究院4新加坡国立大学 https://github.com/lds-ustc/EasyOPD

\\NoHyper††footnotetext:∗共同第一作者。†通讯作者。§在腾讯实习期间完成工作。\\endNoHyper

---

## 1 引言

大语言模型蒸馏将能力从更强的教师模型转移到更小、更高效的学生模型,旨在降低部署成本,同时保留推理、编码和指令遵循能力 (Alkhulaifi 等, 2021 (https://arxiv.org/html/2607.11012#bib.bib4))。传统蒸馏使用教师对固定语境 (Yang 等, 2024b (https://arxiv.org/html/2607.11012#bib.bib49)) 的响应或 token 分布。然而,在推理时,学生模型基于自己的前缀进行条件生成,可能遇到在离线监督中覆盖不足的语境 (Gu 等, 2024 (https://arxiv.org/html/2607.11012#bib.bib5); Ko 等, 2024 (https://arxiv.org/html/2607.11012#bib.bib9))。在线策略蒸馏 (OPD) 通过一个共同循环来缓解这种不匹配:当前学生生成 rollout,教师或评估者对其进行监督,由此产生的信号指导学生更新 (Song and Zheng, 2026 (https://arxiv.org/html/2607.11012#bib.bib11); Lu and Thinking Machines Lab, 2025 (https://arxiv.org/html/2607.11012#bib.bib7))。OPD 方法在监督接口、分词器兼容性和粒度上各不相同,重叠的设置包括基于 logit 的蒸馏、跨分词器对齐 (Sun 等, 2026 (https://arxiv.org/html/2607.11012#bib.bib87))、在线自蒸馏、黑盒或基于规则的反馈,以及逐步或多轮智能体监督 (Zhong 等, 2026 (https://arxiv.org/html/2607.11012#bib.bib72); Li 等, 2026a (https://arxiv.org/html/2607.11012#bib.bib99))。

![参考标题](图1)

图1: EasyOPD 的架构。用户层提供基于配置的调用,EasyOPD 层封装方法本地的 OPD 逻辑,verl 提供分布式执行。用于损失、rollout、奖励、对齐和教师侧计算的钩子将方法模块连接到 verl,使得支持的方法可以共享同一个执行后端,并通过 YAML 配置文件进行选择。

共享的算法范式并未产生通用的系统接口。根据监督方式的不同,OPD 可能涉及 rollout 生成、教师推理、跨分词器对齐、奖励构建、分布式数据流和优化。例如,跨分词器 OPD 需要在构建兼容监督之前进行教师和学生的分词器对齐;而黑盒或基于规则的 OPD 可能需要将文本判断或分数转换为奖励;这些模式需要不同的扩展点。现有框架解决了 OPD 工作流程的互补部分:TRL (von Werra 等, 2020 (https://arxiv.org/html/2607.11012#bib.bib88)) 提供以训练器为中心的蒸馏 API;verl (Sheng 等, 2024 (https://arxiv.org/html/2607.11012#bib.bib89)) 和 slime (Zhu 等, 2025 (https://arxiv.org/html/2607.11012#bib.bib90)) 支持可扩展的在线 rollout 和分布式执行;KDFlow (Zhang 等, 2026 (https://arxiv.org/html/2607.11012#bib.bib70)) 提供面向蒸馏的栈。然而,如表 1 (https://arxiv.org/html/2607.11012#S3.T1) 总结,我们没有发现任何经过审查的框架,在重用公共分布式后端的同时,记录了本文所考虑的不同监督接口的方法本地扩展边界。这一空白呼唤一个轻量级的 OPD 抽象层,将方法特定的监督与共享的执行基础设施连接起来。

为填补这一空白,我们提出 EasyOPD,一个基于 verl 构建的统一 OPD 框架。EasyOPD 重用 verl 进行 rollout 生成、模型执行和优化,同时增加一个用于方法本地监督的轻量级抽象层。方法模块通过显式的扩展点连接到共享的训练流程:跨分词器方法本地化对齐和监督构建,而黑盒或基于规则的方法本地化反馈获取和训练信号构建。这种设计将 OPD 集成从框架范围内的修改转变为方法本地的扩展。

为实现这一设计,EasyOPD 采用图 1 (https://arxiv.org/html/2607.11012#S1.F1) 所示的三层架构。用户层提供 Python 和 CLI 入口点以及用于方法、模型、数据集和超参数的 YAML 配置;EasyOPD 层管理方法注册、方法本地模块和监督诊断,通过分发钩子(用于损失、rollout 元数据、奖励、对齐和教师侧计算)连接到 verl;verl 层处理分布式 rollout、模型执行、工作器编排、奖励计算和优化。用户通过配置选择方法,而开发者通过注册具有所需钩子的方法本地模块来添加方法,因此核心训练器和工作器仅通过共享分发层访问方法特定的监督。

我们通过跨三个设置的代表性方法实例化该设计:跨分词器 OPD、在线自蒸馏和逐步 OPD;其扩展边界进一步设计以容纳额外的监督形式,如黑盒或基于规则的反馈。在每个设置中,比较的方法在适用的情况下共享模型初始化、训练数据、执行后端和评估流程,同时保留其原始监督设计。我们在 GitHub 上以 Apache 许可证 2.0 发布代码,并附有可复现的 YAML 配置文件、文档、一个可安装的演示包和一个演示视频。

---

## 2 背景与动机

#### 先前方案。

知识蒸馏 (KD) 通常训练一个较小的学生模型来模仿一个较大或能力更强的教师的预测行为 (Hinton 等, 2015 (https://arxiv.org/html/2607.11012#bib.bib3); Ko 等, 2024 (https://arxiv.org/html/2607.11012#bib.bib9))。对于自回归语言模型,常见的离线方法包括序列级蒸馏(学生从教师生成的序列上训练)(Kim and Rush, 2016 (https://arxiv.org/html/2607.11012#bib.bib91)) 和监督 token 级 KD(学生匹配教师沿着固定离线输出序列集合所诱导的前缀的 next-token 分布)(Agarwal 等, 2024 (https://arxiv.org/html/2607.11012#bib.bib8))。这些输出序列可以是真实标签或教师生成。在纯离线形式下,这两种方法都在一个不跟踪当前学生 rollout 分布的输出前缀分布上进行优化。然而,在自回归推理期间,学生模型依赖于自己之前的预测。一个偏差会使得后续的前缀偏离离线蒸馏期间观察到的前缀,造成训练-推理分布不匹配,并导致错误在解码步骤中累积 (Lin 等, 2020 (https://arxiv.org/html/2607.11012#bib.bib59); Agarwal 等, 2024 (https://arxiv.org/html/2607.11012#bib.bib8))。

#### 在线策略蒸馏机制。

在线策略蒸馏 (OPD) 收集教师对当前学生生成输出的监督,而不是仅依赖固定的离线序列。训练过程中,学生生成响应或轨迹,教师对由此产生的前缀或状态提供监督。随后学生被更新,并使用更新后的策略生成新的 rollout。在常见的白盒设置中,教师提供学生生成前缀上的 next-token 分布,学生最小化与教师的 token 级散度 (Agarwal 等, 2024 (https://arxiv.org/html/2607.11012#bib.bib8))。因此,OPD 的定义性质是在由当前学生诱导的状态上收集监督,而不是使用任何特定的蒸馏目标 (Lu and Thinking Machines Lab, 2025 (https://arxiv.org/html/2607.11012#bib.bib7); Song and Zheng, 2026 (https://arxiv.org/html/2607.11012#bib.bib11))。

在学生生成的状态上进行训练有助于减少离线训练数据与自回归推理期间遇到的前缀之间的不匹配,同时提供对学生自身错误的指导 (Agarwal 等, 2024 (https://arxiv.org/html/2607.11012#bib.bib8); Ko 等, 2024 (https://arxiv.org/html/2607.11012#bib.bib9))。然而,OPD 也将蒸馏转变为一个迭代的流水线,必须协调学生 rollout、教师推理、监督构建和模型优化。由于 OPD 方法在教师访问方式、反馈形式和训练目标上各不相同 (Song and Zheng, 2026 (https://arxiv.org/html/2607.11012#bib.bib11)),一个实用的框架应该支持这一共享流水线,同时允许方法特定的监督得以一致地实现。

---

## 3 设计与实现

表 1: OPD 监督接口与框架特性对比。✓ 表示原生或一等支持,∘ 表示部分或实验性支持,× 表示无文档支持。*在线自蒸馏*指教师来源于学生模型并监督学生生成 rollout 的设置。比较基于截至2026年7月的公开文档功能,使用附录 A (https://arxiv.org/html/2607.11012#A1) 中列出的版本或提交,并附有每个单元格的证据。

| OPD 监督接口覆盖范围 | 框架属性 |
| --- | --- |
| 框架 | OPD | 跨分词器 OPD | 在线自蒸馏 | 逐步 OPD | 已发布 | YAML/CLI | 文档化方法扩展 API | 兼容多节点 |
| TRL | ✓ | ∘ | ∘ | × | ✓ | × | ∘ |
| verl | ✓ | × | × | ∘ | ✓ | × | ✓ |
| slime | ✓ | × | ∘ | ∘ | ✓ | × | ✓ |
| KDFlow | ✓ | ✓ | ✓ | × | ✓ | ∘ | ∘ |
| 我们的 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ (通过 verl) |

#### EasyOPD 中每个 OPD 设置的一个入口点

[⬇](data:text/plain;base64,ZnJvbSBlYXN5b3BkIGltcG9ydCBFYXN5T1BECnByaW50KEVhc3lPUEQubGlzdF9tZXRob2RzKCkpICAgIyBbLi4uLCAnc2ltY3QnLCd1bGQnLCdhbG0nLCdkc2tkJywnc2RwbycsJ3NvZCcsIC4uLl0KIyBUaGUgU0FNRSBjYWxsIHNlbGVjdHMgYW55IG1ldGhvZDsgb25seSB0aGUgbmFtZSArIFlBTUwgY2hhbmdlLgptID0gRWFzeU9QRC5mcm9tX2hwYXJhbXMoInNpbWN0IiwgY29uZmlnX3BhdGg9ImVhc3lvcGQvY29uZmlnL3NpbWN0LnlhbWwiKSAgIyBjcm9zcy10b2tlbml6ZXIgT1BEICh1bGR8YWxtfGRza2QpCm0gPSBFYXN5T1BELmZyb21faHBhcmFtcygic2RwbyIsICBjb25maWdfcGF0aD0iZWFzeW9wZC9jb25maWcvc2Rwby55YW1sIikgICAjIG9uLXBvbGljeSBzZWxmLWRpc3RpbGxhdGlvbiAodnMgZ3JwbykKbSA9IEVhc3lPUEQuZnJvbV9ocGFyYW1zKCJzb2QiLCAgIGNvbmZpZ19wYXRoPSJlYXN5b3BkL2NvbmZpZy9zb2QueWFtbCIpICAgICMgc3RlcC13aXNlIE9QRCAodnMgcmVzcG9uc2UtbGV2ZWwgb3BkLCBncnBvKQ==)
```python
from easyopd import EasyOPD
print(EasyOPD.list_methods())   # [..., 'simct','uld','alm','dskd','sdpo','sod', ...]
# 同一个调用选择任何方法;只有名称 + YAML 变化。
m = EasyOPD.from_hparams("simct", config_path="easyopd/config/simct.yaml")  # 跨分词器 OPD (uld|alm|dskd)
m = EasyOPD.from_hparams("sdpo",  config_path="easyopd/config/sdpo.yaml")   # 在线自蒸馏 (vs grpo)
m = EasyOPD.from_hparams("sod",   config_path="easyopd/config/sod.yaml")    # 逐步 OPD (vs response-level opd, grpo)
```

[⬇](data:text/plain;base64,IyBFYWNoIG1ldGhvZCAoYW5kIGl0cyBiYXNlbGluZXMpIGlzIG9uZSBsYXVuY2ggc2NyaXB0OyB0aGUgY29uZmlnIHNlbGVjdHMgdGhlIG1ldGhvZCBhbmQgdGhlIGhvb2tzIGl0IGFjdGl2YXRlcy4KJCBiYXNoIGV4YW1wbGVzL3NpbWN0L3J1bl9zaW1jdC5zaCAgICMgY3Jvc3MtdG9rZW5pemVyOiB1bGR8YWxtfGRza2QKJCBiYXNoIGV4YW1wbGVzL3NkcG8vcnVuX3NkcG8uc2ggICAgICMgc2VsZi1kaXN0aWxsYXRpb246IGdycG8KJCBiYXNoIGV4YW1wbGVzL3NvZC9ydW5fc29kLnNoICAgICAgICMgc3RlcC13aXNlOiByZXNwb25zZS1sZXZlbCBvcGQsIGdycG8=)
```bash
# 每个方法(及其基线)都是一个启动脚本;配置选择方法和它激活的钩子。
$ bash examples/simct/run_simct.sh   # 跨分词器: uld|alm|dskd
$ bash examples/sdpo/run_sdpo.sh     # 自蒸馏: grpo
$ bash examples/sod/run_sod.sh       # 逐步: response-level opd, grpo
```

[⬇](data:text/plain;base64,IyBUaGUgcmVnaXN0cnkgYWN0aXZhdGVzIG9ubHkgdGhlIGhvb2tzIGEgbWV0aG9kIG5lZWRzIGFuZCBsb2dzIHN1cGVydmlzaW9uLXNwZWNpZmljIGRpYWdub3N0aWNzOgojICAgc2ltY3QgLT4gYWxpZ25tZW50ICsgdGVhY2hlciBzaWRlY2FyICsgbG9zcyAgOiBzaW1jdC94dG9rX2tkX2xvc3MsIHNpbXBsZS90ZWFjaGVyX2xvc3NfdG9rZW5zX21lYW4KIyAgIHNkcG8gIC0+IHJlcHJvbXB0IHNlbGYtdGVhY2hlciArIGxvc3MgICAgICAgIDogYWN0b3Ivc2Rwby9sb3NzLCBzZWxmX2Rpc3RpbGxhdGlvbi9yZXByb21wdF9zYW1wbGVfZnJhY3Rpb24KIyAgIHNvZCAgIC0+IHN0ZXAtd2lzZSBLTCByZXdlaWdodGluZyAgICAgICAgICAgIDogYWN0b3IvdG9rZW5fa2wsIHN0ZXB3aXNlX29wZF9jb2Vm)
```python
# 注册表仅激活方法所需的钩子,并记录监督特定的诊断信息:
#   simct -> 对齐 + 教师副驾驶 + 损失 : simct/xtok_kd_loss, simple/teacher_loss_tokens_mean
#   sdpo  -> 重新提示 + 自教师 + 损失     : actor/sdpo/loss, self_distillation/reprompt_sample_fraction
#   sod   -> 逐步 KL 重新加权          : actor/token_kl, stepwise_opd_coef
```

图 2: EasyOPD 的一个运行示例。三种研究设置——跨分词器 OPD、在线自蒸馏和逐步 OPD——及其基线均通过**相同**的 `from_hparams` 入口点或单个启动脚本访问,仅更改方法名称及其 YAML 配置。然后注册表仅激活每个方法所需的钩子,verl 执行 rollout 和优化,EasyOPD 报告监督特定的诊断信息。所有 API 调用、方法名称、启动命令和诊断指标名称均取自发布的仓库。

EasyOPD 在 verl 之上提供了一个统一的 OPD 训练过程。它不将每个 OPD 方法视为孤立的训练脚本,而是将 OPD 运行分解为四个可重用的阶段:方法调用、配置解析、监督构建和分布式执行。本节描述这些阶段如何形成一个统一的工作流程,将不同的 OPD 方法连接到相同的 verl 执行基础设施。

### 3.1 统一的 OPD 工作流程

尽管 OPD 方法在监督接口上有所不同,但它们共享一个共同的训练流程。给定一个教师模型、一个学生模型和训练数据,学生首先生成在线

相似文章

学会预见:揭示 On-Policy 蒸馏效率的解锁机制

arXiv cs.CL

本文研究了大型语言模型中 On-Policy 蒸馏(OPD)效率背后的参数级机制,将其归因于模块分配和更新方向上的早期“预见性”。本文提出了 EffOPD,一种即插即用方法,可在不损害最终性能的情况下将 OPD 训练速度提高 3 倍。

论同策略蒸馏的几何结构

Hugging Face Daily Papers

本文刻画了大语言模型中同策略蒸馏(OPD)独特的参数空间动力学,表明其具有松弛的非主方向更新和子空间锁定特性,从而与监督微调和基于可验证奖励的强化学习区分开来。

On-policy distillation: 在PapersWithCode上最热门术语之一 [R]

Reddit r/MachineLearning

Hugging Face的Niels介绍了On-policy Distillation (OPD),这是一种关键的后训练技术,用于Qwen 3.6/3.7、GLM-5.1和DeepSeek-V4等模型。该技术现已收录于PapersWithCode,并附有Sasha Rush和Dwarkesh Patel的白板讲解链接。