TRL支持MOPD:多专家模型融合实战指南
前沿实验室正用MOPD技术将多个RL专家模型合并为单一强模型。本文解析其原理,并演示如何利用Hugging Face TRL库的AsyncDistillationTrainer复现这一过程,包括处理Token不平衡等关键细节。
什么是 MOPD?
如果你关注今年的大模型技术报告,会发现一个词频繁出现:MOPD(Multi-Teacher On-Policy Distillation,多教师在线策略蒸馏)。小米在年初发布 MiMo-V2-Flash 时提到了它,随后 DeepSeek、Moonshot、NVIDIA、Liquid AI 和 Mistral 等机构也纷纷采用这项技术来构建他们的新一代模型。
让单个模型同时在数学、代码、工具使用或指令遵循等多个领域表现出色,如果只靠一次强化学习(RL)训练,难度极大。在混合训练中,不同领域的目标往往互相拉扯,每个领域在每批数据中只能分到很少的样本,改善一个领域可能会悄悄损害另一个领域。MOPD 的思路很直接:先为每个领域训练一个专门的“专家”模型,然后再把这些专家的能力合并回一个主模型中。
严格来说,MOPD 是三阶段后训练流程的最后一步,但人们常用它指代整个流程:
- 通用 SFT:使用混合数据对基础模型进行监督微调,让它掌握各个领域的基本知识。这是所有模型的共同起点。
- 领域专家:从上述检查点出发,为每个领域单独训练一个 RL 模型。比如一个专攻数学,一个专攻代码,一个专攻指令遵循。每个专家只需要在一件事上做到极致。
- 融合:学生模型(通常还是那个 SFT 检查点)回答来自各个领域的提示。对应领域的专家作为教师,对学生生成的答案进行逐 Token 评分。学生模型通过训练,使其输出分布向教师的分布靠拢。
MOPD 本质上是带有多个教师的在线策略蒸馏。它之所以有效,主要依赖三个特性:
首先是学生从自己的样本中学习。教师是对学生实际写出的内容进行评分。普通的 SFT 蒸馏只让学生模仿教师生成的文本,但在推理时,学生必须延续自己生成的文本,早期的一个小错误就可能把它带偏到训练从未见过的路径上。在线训练避免了这个问题。
其次是信号密集。传统的 RL 通常只给整个答案一个奖励,而在这里,每个 Token 都能得到教师的反馈。损失函数通常是学生 Token 与教师分布之间的反向 KL 散度,也就是教师对学生选择的每个 Token 的“不认可程度”。不同实验室在处理教师分布时做法不同:Nemotron 3 Ultra 和 MiMo-V2-Flash 只使用教师对学生所选 Token 的概率;Open-MOPD 比较前 16 个最可能的 Token;而 DeepSeek-V4 和 Mistral Large 4 则使用词汇表上的完整分布,因为单 Token 版本会导致梯度方差大、训练不稳定。
最后是路由机制。每个提示只由对应的专家教师评分。数学题只由数学专家改,代码题只由代码专家改。
谁在用这套方法?
Liquid AI 的训练流程最直观。他们有一条从 SFT 到 MOPD 的通用主线,还有一系列专门针对特定领域(经过 SFT 和 RL 训练)的专家模型汇入主线。
MiMo-V2-Flash 的技术报告详细绘制了融合步骤:学生模型生成内容,每个领域的教师返回 Token 级别的奖励。
NVIDIA 则展示了大规模应用的效果。在 Nemotron 3 Ultra 中,他们使用了超过十个教师模型,并且运行了两轮 MOPD。第一轮结束后,他们基于合并后的模型重新训练新的教师,再跑一轮 MOPD。NVIDIA 还在 Hugging Face Hub 上公开了其中五个教师模型,涵盖 STEM、竞赛编程、指令遵循、通用推理和聊天。大多数实验室只发布最终模型,因此这些专家检查点非常珍贵。
以下是目前已知采用 MOPD 的主要模型发布情况:
- Mistral Large 4 (2026年11月):按推理努力程度(高、中、低)划分三个教师,而非按领域。
- LFM2.5-24B-A2B (2026年10月):两个 MOPD 阶段,分别针对非代理和代理任务。
- MiMo-V2.6 (2026年9月):使用两组不同的领域教师家族。
- LFM2.5-2.6B (2026年7月):从共享 SFT 检查点为每个领域训练一个专家。
- Kimi K3 (2026年7月):九个专家,按领域和推理努力程度划分。
- Nemotron 3 Ultra (2026年6月):超过十个教师,两轮 MOPD。
- DeepSeek-V4 (2026年4月):替换了 V3.2 的混合 RL 阶段,使用十多个领域教师。
在 TRL 中实现 MOPD
Hugging Face 的 TRL 库现在支持 MOPD,主要通过 AsyncDistillationTrainer 实现。你需要为每个专家启动一个 vLLM 服务,给训练器提供每个教师的 URL,并在数据集中添加一个 teacher_id 列,用于将每个提示路由到对应的专家。生成、教师评分和训练是异步进行的,这意味着学生模型可以在训练的同时继续生成新数据。\n
我们可以用一个实际例子来演示。这里使用的是 Open-MOPD 发布的真实专家模型。学生模型是 SmolLM3-3B 的 SFT 检查点,教师则是从该检查点通过 GRPO 训练出来的三个专家,分别负责数学、代码和指令遵循。
from datasets import interleave_datasets, load_dataset
from trl.experimental.async_distillation import AsyncDistillationConfig, AsyncDistillationTrainer
# 加载数据集,包含提示和对应的领域标签
dataset = load_dataset("BytedTsinghua-SIA/Open-MOPD-Data", data_files="rl_prompt_mix/train.parquet", split="train")
dataset = dataset.select_columns(["prompt", "domain"]).rename_column("domain", "teacher_id").shuffle(seed=42)
# 调整比例:指令遵循占一半,这里采样为 数学40% / 代码40% / 指令20%
dataset = interleave_datasets(
[dataset.filter(lambda row, d=domain: row["teacher_id"] == d) for domain in ("math", "code", "if")],
probabilities=[0.4, 0.4, 0.2],
seed=42,
)
config = AsyncDistillationConfig(
teacher_server_urls={
"math": "http://localhost:8001",
"code": "http://localhost:8002",
"if": "http://localhost:8003",
},
beta=1.0, # 针对路由教师的反向 KL 散度
teacher_top_k=1, # beta=1.0 时仅使用采样 Token 的教师对数概率
max_completion_length=16384,
request_timeout=3600,
)
trainer = AsyncDistillationTrainer(
model="BytedTsinghua-SIA/Open-MOPD-SmolLM3-3B-MixSFT",
args=config,
train_dataset=dataset,
)
trainer.train()在这个例子中,beta=1.0 意味着 TRL 只使用教师对学生采样 Token 的概率,这与 Nemotron 3 Ultra 的做法一致。teacher_top_k=1 保持了教师响应的小巧。需要注意的是,由于是逐 Token 比较,所有教师必须与学生模型使用相同的分词器。
在 HF Jobs 上运行
运行 MOPD 需要同时启动五个进程:一个用于学生模型的 vLLM 服务器(生成答案并接收权重更新),三个用于教师模型的 vLLM 服务器(仅负责评分),以及训练进程本身。
在拥有 4 张 H200 GPU 的单台机器上,我们可以这样分配资源:
- GPU 0:学生模型的 vLLM 服务器。
- GPU 1:数学和指令遵循教师(共享一张卡)。
- GPU 2:代码教师(独占,因为代码提示通常最长)。
- GPU 3:训练进程。
HF Jobs 提供一个容器和一个命令入口。示例代码中包含一个 launcher.py 脚本,它会依次启动四个服务器,等待它们就绪,然后运行训练脚本。整个任务只需一条命令:
hf jobs uv run \
--flavor h200x4 \
--image huggingface/trl \
--secrets HF_TOKEN \
--timeout 6h \
https://raw.githubusercontent.com/huggingface/trl/main/examples/async_distillation_math/launcher.py如果你在自己的机器上运行,可以参考 launcher 中的 vllm serve 命令。注意,每个教师的 --max-model-len 应该比学生模型大,因为评分时需要发送学生的完整答案加上一个 Token。共享 GPU 的两个教师需要串行启动,因为 vLLM 会根据启动时的剩余内存来分配资源。
如果有 8 张 GPU,布局可以更宽松:每个教师独占一张卡,学生服务器占用两张卡以加快生成速度,剩余三张卡用于训练。
监控 Token 不平衡
训练器会记录每个教师的指标,这非常关键。teacher_jsd/<id> 显示学生与每个教师的距离(越低越接近),teacher_token_frac/<id> 显示每个教师在训练步骤中占有的 Token 份额。
一定要盯着 teacher_token_frac。损失是按 Token 平均计算的,所以某个领域的权重取决于它产生的 Token 数量,而不是提示数量。数学或代码答案通常很长,包含数千个 Token 的推理链条;而指令遵循的答案可能只有几百个 Token。结果就是,即使指令遵循占 20% 的提示量,它可能只贡献 1% 到 2% 的 Token,导致学生几乎学不到东西。
我们在 60 步的短实验中验证了这一点。起初指令遵循的 Token 份额还算公平,但随着数学和代码答案变长,它的份额迅速跌落到几个百分点。图表显示,学生模型与数学和代码教师的距离稳步缩小,但与指令遵循教师的距离几乎没动。
评估结果也反映了这一点:
| 模型 | AIME24 | AIME25 | IFEval |
|---|---|---|---|
| MixSFT (起点) | 17.5 | 19.2 | 67.5 |
| 本例: TRL MOPD (60步) | 24.2 | 22.5 | 73.0 |
| Open-MOPD 最终模型 | 19.2 | 25.0 | 75.8 |
在短短 60 步内,学生在数学和代码上都有显著提升,甚至达到了论文最终模型的水平(考虑到采样误差)。但在指令遵循上,差距依然明显,这正是因为它获得的 Token 太少。
这个例子使用的专家是 Open-MOPD 发布的数学、代码和指令遵循模型,但你可以替换成任何你关心的领域。只要你有从同一基础模型训练出的 RL 专家,并用 vLLM 提供服务,标记好提示的领域 ID,就可以开始训练。如果某些领域表现不佳,可以通过增加其在数据中的权重或延长训练时间来调整,每教师的指标会告诉你调整是否有效。
总结
MOPD 让单个模型能够保留多个 RL 专家学到的知识,无需在一次 RL 运行中艰难平衡所有领域。随着前沿实验室的大规模应用,以及部分专家模型和数据的开源,现在正是尝试这项技术的好时机。如果你想深入了解,可以查阅 AsyncDistillationTrainer 的文档,了解更多的配置选项和监控指标。