Skip to content

【Task.39】EOPD 论文复现进展:Qwen3-8B→0.6B 跨架构在线蒸馏 #244

Description

@buaacoder

任务信息

  • 任务:Task 39 EOPD(高级,论文复现类,arXiv: 2603.07079
  • 目标:在 Relax 中复现 EOPD (Entropy-Oriented On-Policy Distillation) 算法,Qwen3-8B (teacher) → Qwen3-0.6B-Base (student)
  • 参考实现WLS04/EOPD(基于 veRL)
  • 分支feat/eopd-loss
  • 认领人@buaacoder
  • 状态:✅ 已完成

最终实验结果

超参说明

我们的实验使用 30 epoch, lr=1e-6 constant(论文使用 3 epoch, lr=3e-6 cosine)。训练量差异约 10 倍,因此绝对数值不可直接与论文对比。三个方法在相同超参下的相对对比是有效的。

选择 30 epoch 的原因:论文的 lr=3e-6 cosine 在我们的设置中训练不稳定(v1 实验 collapse 到 6.94%),降低到 lr=1e-6 constant 后训练稳定但收敛变慢,需要更多 epoch 补偿。

Image

Relax 三方对比(MATH-500,相同超参)

Method Avg@8 Best Avg@8 Epoch 3 Pass@8 Best Pass@8 Epoch 3 Avg@8 Final (Epoch 30)
EOPD 52.75% (ep25) 38.03% 79.20% (ep25) 66.80% 52.60%
OPD 54.08% (ep27) 42.73% — ¹ — ¹ 52.85%
GRPO 56.48% (ep26) 50.40% 78.00% (ep24) 75.00% 53.02%
Image Image

¹ OPD 评测使用 n=1 greedy(无 passrate 分解),未记录 Pass@8。

veRL 框架对比(OPD,相同超参)

Framework Avg@8 Best Best Epoch
veRL 59.33% 22
Relax 54.08% 27

veRL OPD 在相同超参下比 Relax OPD 高 ~5pp,差异来自框架实现。

论文结果参考(Table 2,3 epoch, lr=3e-6 cosine)

Method 论文 Avg@8
KD 47.80%
OPD 50.09%
GRPO 51.83%
EOPD 52.02%

Epoch 3 快照与论文近似对比

Method 我们 Epoch 3 论文 (3 epoch) 差距
EOPD 38.03% 52.02% -14.0pp
OPD 42.73% 50.09% -7.4pp
GRPO 50.40% 51.83% -1.4pp

我们 epoch 3 时 EOPD/OPD 比论文低,主要因为 lr=1e-6 远小于论文的 3e-6,前期收敛慢。GRPO 因为纯 RL 不依赖蒸馏信号,受 lr 影响较小。

训练性能

吞吐与资源开销

Method Step Time (avg) Actor Train MFU Rollout Time (avg) 训练 tokens/step
EOPD 44.1s 0.5112 ~27s ~268K
OPD 44.0s 0.5151 ~27s ~268K
GRPO 24.6s 0.1292 ~8.5s ~94K

Teacher 打分开销分析

  • EOPD/OPD step_time (~44s) vs GRPO (~24.6s) → teacher 打分额外开销约 19.4s/step(占总训练时间 ~44%)
  • Teacher 打分包括:SGLang teacher inference + student prefill + teacher entropy 计算
  • Rollout time 差异 (27s vs 8.5s) 主要来自 teacher batch inference

EOPD 高熵 Token 统计

  • 高熵阈值 (eopd_entropy_threshold): 0.8
  • 高熵 token 比例(训练全程平均): 33.32%
  • 约 1/3 的 response token 被标记为高熵位置,在这些位置额外施加 teacher top-k forward KL
Image Image

峰值显存(Profiling 实测)

在 NVIDIA H20Z (140 GB) 上使用 Qwen3-0.6B-Base + gradient checkpointing 实测峰值显存:

Method micro_bs=2 (8K tok/gpu) micro_bs=4 (16K tok/gpu) micro_bs=8 (32K tok/gpu) micro_bs=16 (64K tok/gpu)
GRPO 17.90 GB 34.63 GB 68.09 GB 135.00 GB
OPD 17.91 GB 34.64 GB 68.10 GB 135.03 GB
EOPD 17.91 GB 34.64 GB 68.10 GB 135.03 GB
  • 实际训练配置 --max-tokens-per-gpu 8192(micro_bs=2, seq_len=4096)下,三方法峰值显存均为 ~17.9 GB
  • EOPD/OPD 相比 GRPO 的额外显存开销仅 ~0.01-0.03 GB(teacher top-k logprobs + entropy 张量很小)
  • micro_bs=32 (128K tok/gpu) 时 OOM,即单 GPU 上限约 micro_bs=16
  • 注:以上仅为 student actor GPU 显存,teacher 侧由 SGLang 独立占用 4 块 GPU(Qwen3-8B, TP=4, mem_fraction_static=0.8)

关键技术发现

1. 长训练下方法排序反转

  • 论文 (3 epoch): EOPD > GRPO > OPD
  • 我们 (30 epoch): GRPO > OPD > EOPD
  • 训练量充足时纯 RL (GRPO) 后劲更大,蒸馏方法(EOPD/OPD)的优势在于加速早期收敛

2. EOPD vs OPD 差距极小

  • 我们的设置中 EOPD (52.75%) ≈ OPD (54.08%),EOPD 反而略低
  • 论文中 EOPD (52.02%) vs OPD (50.09%) 差 +1.93pp
  • 可能原因:我们的 lr=1e-6 下 entropy-gated FKL 的额外信号不够显著

3. Teacher Advantage 跨架构不兼容

  • 8B teacher log_prob 恒低于 0.6B student → advantage 全负 → 模型 collapse
  • 当前绕过方案:纯蒸馏模式(仅 OPD/EOPD KL loss)

4. veRL vs Relax 实现差异

  • 相同超参下 veRL OPD (59.33%) >> Relax OPD (54.08%)
  • 差异来自框架的 loss 计算、advantage 归一化等实现细节

验收标准完成情况

验收项 状态 说明
逐元素一致性验证 ✅ 完成 test_eopd_reference_parity.py 验证 entropy、top-k 概率、筛选 mask、forward KL 与参考实现逐元素一致
报告 Avg@8 / Pass@8 ✅ 完成 见上方结果表(OPD 缺少 Pass@8,因 eval 使用 n=1)
3 seed 稳定性验证 ❌ 未完成 仅完成 seed=42 的单次实验,受 GPU 资源和时间限制未跑 3 seed
高熵阈值消融实验 ❌ 未完成 仅使用论文默认 threshold=0.8,未做阈值消融
训练吞吐与开销报告 ✅ 完成 见训练性能部分
峰值显存 ✅ 完成 Profiling 实测,见训练性能部分
单元测试和冒烟测试 ✅ 完成 7 个测试文件,详见测试覆盖部分

未完成项说明

  1. 3 seed 实验:每次完整训练 (30 epoch) 需要 ~70 GPU 小时。受硬件资源和 deadline 限制,仅完成单 seed。从单 seed 结果看,EOPD 在 30 epoch 设置下未能复现相比 GRPO/OPD 的提升(可能与超参差异有关)。
  2. 高熵阈值消融:论文使用 threshold=0.8 作为默认值。受时间限制未尝试其他阈值(如 0.5, 1.0, 1.5)的消融实验。

代码修改

文件 修改内容
relax/backends/megatron/loss.py EOPD FKL 损失计算与 entropy-gated 逻辑
relax/engine/rollout/on_policy_distillation.py 教师 entropy 计算传递、EOS 替换、teacher_log_probs
relax/engine/rollout/sglang_rollout.py 批量 student prefill
relax/utils/opd/opd_utils.py teacher advantage、EOPD 参数与验证
relax/utils/opd/opd_sglang_entropy_patch.py SGLang entropy 计算 patch
relax/utils/opd/opd_main_worker.py OPD worker 适配
relax/core/controller.py OPD rollout 流程集成
relax/backends/sglang/sglang_engine.py SGLang 引擎适配
relax/utils/utils.py 工具函数

测试覆盖

测试文件 内容
tests/backends/megatron/test_eopd_loss.py 6 个 EOPD loss 单元测试
tests/utils/test_eopd_arguments.py 4 个参数验证测试
tests/utils/test_eopd_entropy_patch.py entropy patch 正确性测试
tests/utils/test_opd_teacher_advantage.py teacher advantage 计算测试
tests/utils/test_eopd_reference_parity.py 与参考实现逐元素对比验证
tests/engine/rollout/test_on_policy_distillation_eos_replace.py EOS 替换逻辑测试
tests/integration/test_eopd_smoke.py 端到端冒烟测试

实验配置

# 三方对比共用配置(30 epoch, lr=1e-6 constant, 2×H100 GPU)
--num-epoch 30 --rollout-batch-size 64 --global-batch-size 64
--lr 1e-6 --lr-decay-style constant
--opd-log-prob-top-k 32 --opd-norm-mode trunc --opd-token-selection teacher_topk
--rollout-max-response-len 4096

# EOPD 额外参数
--use-eopd --eopd-entropy-threshold 0.8 --eopd-fkl-coef 1.0

# GRPO 差异
--n-samples-per-prompt 8 --rollout-batch-size 8 (总 samples=64,与 EOPD/OPD 对齐)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions