Open-MOPD: Fixing Capability Imbalance in Multi-Teacher Distillation
Reading notes on:
Multi-teacher on-policy distillation is the obvious answer to a deployment problem: if math, code, and instruction-following each want their own specialist teacher, distill them all into one student and ship a single model. Frontier systems already do variants of this, from Nemotron 3 Ultra to Kimi K3.
What Open-MOPD contributes is a sharper diagnosis of why the naive recipe underdelivers. The failure is not primarily teacher conflict. It is optimization budget distortion: long domains consume token budget, fast-converging domains keep getting overfunded, and stale student-dependent rewards drift away from the actual current policy.
1. The Capability Integration Gap Is Real
On the controlled SmolLM3-3B-Base testbed, naive M-OPD reaches an average score of 28.05, while distilling each domain separately and keeping them routed as independent experts reaches 31.55. In other words, the mixed student only recovers 35.6% of the improvement between mixed-domain SFT and RouteRL.
The gap is not uniform:
- Instruction following is the worst-hit domain, finishing 6.16 points below its RouteOPD reference.
- It is also the only domain whose performance actually drops in the middle of training.
- Along the training curve, math closes 64% of its headroom, code closes 40%, and instruction following closes only 26%.
That asymmetry is important. It already suggests a resource-allocation problem rather than a simple “the teachers disagree” story.
2. First Diagnosis: It Is Not Teacher Conflict
The paper measures teacher disagreement on each token as
\[c_t = \max_{d \in D} \log \pi_{\phi_d}(y_t \mid x, y_{<t}) - \min_{d \in D} \log \pi_{\phi_d}(y_t \mid x, y_{<t}).\]If conflicting gradients were the main bottleneck, $c_t$ should be large and frequent. Instead:
- mean disagreement stays around 0.126 nat;
- only 0.62% of tokens exceed 1 nat on average;
- masking or replacing high-conflict tokens actually hurts the final score by 0.52 to 0.83 points.
So the high-conflict tokens that do exist are informative, not noise. The student is not failing because the teachers are fighting each other token by token.
3. The Real Problem: Budget Distortion Happens in Three Different Ways
3.1 Long responses hijack the token budget
With domain prompt counts $(39.8\%, 39.8\%, 20.3\%)$ for math, code, and instruction following, you might expect the update budget to be fairly balanced. But token-mean training does not care about prompt counts. It cares about response length:
\[s_{tok}^d = \frac{n_d L_d}{\sum_{j \in D} n_j L_j}.\]Math and code responses average around 10,500 tokens. Instruction-following responses average about 409. The result is brutal:
- Math: 49.7% of gradient tokens
- Code: 49.3%
- IF: 0.99%
To equalize token shares by prompt oversampling alone, IF would need to be oversampled by 33.6x, which would destroy the coverage of the long-horizon domains.
3.2 Even balanced token shares drift as domains converge at different speeds
Define the per-token reward magnitude proxy
\[\bar{m}_d = \mathbb{E}_{t \in d}[|r_t|].\]Early in training, the domains start at very different gaps:
- Math: 0.019
- Code: 0.063
- IF: 0.091
If you artificially force equal token shares, the effective update budget still drifts because $\bar{m}_d$ shrinks at different rates. In the paper’s measurements, IF’s budget share collapses from 48.7% to roughly 9% within 25 steps, while code rises to 63.8%.
3.3 Reusing rollouts makes the reward stale
Under $K$ inner updates per rollout batch, the frozen teacher log-probs stay fixed while the student changes after each inner step. The mismatch grows quickly:
- rollout-to-current KL reaches 0.059 at $K = 4$ and 0.216 at $K = 32$;
- PPO clipping fraction rises to 0.576 at $K = 4$ and peaks around 0.860 at $K = 32$.
So even if the budget were perfect, the supervision becomes mathematically inconsistent as soon as the student moves away from the rollout state.
4. Open-MOPD’s Three Fixes
4.1 Token-share balancing
If the target budget share is $g_d^*$, set
\[w_{share}^d = \frac{g_d^*}{s_{tok}^d}.\]This makes the weighted contribution of each domain exactly match the target share. With equal one-third targets, the observed weights become approximately:
- Math: 0.69
- Code: 0.66
- IF: 32.7
The short IF trajectories get amplified without sacrificing prompt diversity.
4.2 Gap-following allocation
Static balancing is not enough, because domains converge at different speeds. Open-MOPD therefore scales by the running gap proxy instead of its inverse:
\[\tilde{w}_d = w_{share}^d \cdot \text{Clamp} \left( \left(\frac{m_d}{m_{ref}}\right)^\alpha, 0.05, 20 \right),\]then normalizes:
\[w_{gap}^d = \frac{\tilde{w}_d}{\sum_j \tilde{w}_j s_{tok}^j}.\]The sign on $\alpha$ is the important bit. An inverse rule would create positive feedback: a domain that is already converging gets even more weight, converges faster, and collapses training. The paper reports exactly that pathology when the wrong sign is used: IF weight explodes from 24.4 to 80.9, and training crashes at step 74.
4.3 Student reward refresh
Teacher log-probs are cached once, but the student-dependent part of the reward is recomputed at every inner step:
\[\delta_t^{(k)}(v) = \text{sg}\!\left[ \log \pi_{\phi_{d(x)}}(v \mid x, y_{<t}) - \log \pi_\theta^{(k)}(v \mid x, y_{<t}) \right],\] \[r_t^{(k)}(v) = \delta_t^{(k)}(v)\, \tilde{\pi}_\theta^{(k)}(v \mid x, y_{<t}).\]This is the nice engineering trick in the paper: PPO already needs the actor forward pass, so refreshing the reward adds essentially zero extra forward passes.
5. The Results Are Close to the Routed Oracle
The end-to-end comparison is striking:
| Method | Total score | Recovery rate |
|---|---|---|
| RouteRL | 32.35 | 100.0% |
| RouteOPD | 31.55 | 88.0% |
| Naive M-OPD | 28.05 | 35.6% |
| Open-MOPD | 31.24 | 83.4% |
So the open recipe lands within 0.31 points of RouteOPD while keeping a single deployable student.
The ablation ladder makes the contribution of each component visible:
- naive M-OPD: 29.28
+share + gap: 30.43- full Open-MOPD: 31.24
The compute overhead is also modest. Reward prefill plus refresh accounts for only about 2.2% of step time, because generation and actor updates dominate the runtime budget.
If you compare this with The Distributional Lens of Post-Training or Revisiting On-Policy Distillation, the theme is consistent: the load-bearing ingredient is still on-policy data, but on-policy data alone is not enough when multi-domain optimization budgets drift this badly. For the orthogonal question of how coarse or fine the teacher target should be, the right companion read is SOPD.
Takeaways
- Prompt ratios are the wrong accounting unit. In mixed-domain post-training, physical token volume is what actually spends gradient budget.
- Budget balancing must be dynamic. Equal shares at step 0 do not stay equal once domains learn at different rates.
- The stable direction is gap-following, not inverse normalization. More unsolved domains should get more budget; the reverse causes runaway feedback.
- Student-dependent rewards must stay fresh. Reusing rollouts without refresh quickly turns dense distillation rewards into stale supervision.
- The multi-teacher problem is less mystical than it looks. Most of the gap comes from systems-level budgeting errors, not from irreconcilable teacher disagreement.