在策略蒸馏 (On-Policy Distillation)

在策略蒸馏 (OPD) 让学生模型在自己的 rollout 数据上训练,同时匹配教师模型的 token 级 log-probability,从而实现从大模型到小模型的知识传递。OPD 与 advantage estimator 正交——它作为 KL 惩罚项叠加在任意 estimator(GRPO、PPO、REINFORCE++ 等)之上。

关键参数

参数 说明
--use-opd 启用在策略蒸馏。使用 OPD 的必需标志。
--opd-type OPD 类型:sglangmegatron。启用 --use-opd 时必须设置。
--opd-kl-coef OPD KL 惩罚系数(默认值:1.0)。控制蒸馏信号相对于 RL advantage 的权重。
--opd-teacher-load 教师模型的 Megatron checkpoint 路径。--opd-type=megatron必须设置,--opd-type=sglang不可设置。
--opd-teacher-ckpt-step 可选的教师模型 checkpoint 步数。

原理

OPD 通过减去一个 KL 惩罚项来修改 advantage 计算,鼓励学生匹配教师的输出分布:

A^t=At−λopd⋅DKL(Pteacher∥Pstudent)t\hat{A}_t = A_t - \lambda_{\text{opd}} \cdot D_{\text{KL}}(P_{\text{teacher}} \| P_{\text{student}})_t

其中 AtA_t 是基础 estimator(如 GRPO)的原始 advantage,λopd\lambda_{\text{opd}}--opd-kl-coefDKLD_{\text{KL}} 是 token 级的逆 KL 散度。

因此 OPD 可以与任何 advantage estimator 组合使用,包括 GRPO、PPO、REINFORCE++ 和 GSPO。

两种教师模式

SGLang 模式 (--opd-type sglang)

教师模型运行在外部 SGLang 服务器上,教师的 log-probs 在 rollout 阶段获取。

适用场景:教师与学生架构不同,或教师模型太大无法与训练模型同时加载。

工作流程

  1. 外部 SGLang 服务器运行教师模型。
  2. 在 rollout 阶段,自定义 reward 函数(slime.rollout.on_policy_distillation.reward_func)将每个样本发送到教师服务器以获取 token 级 log-probs。
  3. 自定义后处理函数(slime.rollout.on_policy_distillation.post_process_rewards)将教师 log-probs 裁剪到 response 范围并存储到 sample.teacher_log_probs 中。
  4. 在训练阶段,从存储的教师 log-probs 计算 KL 惩罚并应用到 advantages 上。

配置

--use-opd
--opd-type sglang
--opd-kl-coef 1.0
--custom-rm-path slime.rollout.on_policy_distillation.reward_func
--custom-reward-post-process-path slime.rollout.on_policy_distillation.post_process_rewards
--rm-url http://<TEACHER_IP>:<TEACHER_PORT>/generate

Megatron 模式 (--opd-type megatron)

教师模型通过 --opd-teacher-load 直接加载到 Megatron 中,教师的 log-probs 在训练前向传播阶段计算。

适用场景:教师与学生/参考模型架构相同,且能放入 GPU 显存。

工作流程

  1. 教师模型在初始化时作为额外的 Megatron 模型加载。
  2. 在训练前向传播阶段,教师模型为每个样本计算 log-probs。
  3. 内联计算 KL 惩罚并应用到 advantages。

配置

--use-opd
--opd-type megatron
--opd-kl-coef 1.0
--opd-teacher-load /path/to/teacher_torch_dist

注意:教师 checkpoint 必须是 Megatron 格式(torch_disttorch)。可以使用 tools/convert_hf_to_torch_dist.py 从 HuggingFace 格式转换。

运行示例

完整的示例脚本在 examples/on_policy_distillation/ 中:

SGLang 教师

# 1. 下载模型和数据
hf download Qwen/Qwen3-32B --local-dir /root/Qwen3-32B
hf download Qwen/Qwen3-8B --local-dir /root/Qwen3-8B
hf download --repo-type dataset zhuzilin/dapo-math-17k --local-dir /root/dapo-math-17k

# 2. 转换学生模型
cd /root/slime
source scripts/models/qwen3-8B.sh
PYTHONPATH=/root/Megatron-LM python tools/convert_hf_to_torch_dist.py \
    ${MODEL_ARGS[@]} \
    --hf-checkpoint /root/Qwen3-8B \
    --save /root/Qwen3-8B_torch_dist

# 3. 运行
bash examples/on_policy_distillation/run-qwen3-8B-opd.sh

Megatron 教师

# 1. 将学生和教师模型都转换为 Megatron 格式
# 2. 运行
bash examples/on_policy_distillation/run-qwen3-8B-opd-megatron.sh

初步结果

使用 Qwen3-8B-Base 模型在 OpenThoughts3-1.2M 数据集的一部分上进行 SFT,然后在剩余数据上用 Qwen3-32B 教师进行在策略蒸馏,Math500 评测结果如下:

Pass@1
Qwen3-8B-Base + SFT 76%
Qwen3-8B-Base + SFT + On-Policy Distillation 94%