Models
Table with columns: Role, Model| Role | Model |
|---|
| Student | RockToken/qwen3_30b_a3b_to_4b_offpolicy_20k |
| Teacher | Qwen/Qwen3-30B-A3B-Instruct-2507 (MoE) |
enable_thinking=False throughout.
Training data
- Source:
open-thoughts/OpenThoughts3-1.2M, domain == "science" slice
- 5,000 single-user-turn prompts; 69 exceeding
prompt_max_len=1280 were filtered, leaving 4,931
- Only the prompts are used; on-policy KD never reads the dataset's reference answers
Training setup
Framework: KDFlow — FSDP2 + SGLang rollout, Ray-orchestrated GPU co-location with sleep/wakeup. Same pipeline revision as the math-domain onpolicy_5k_src* runs.
Hardware: 1× node, 4× H100 (94 GB), 24 h 02 min wall-clock (~96 GPU-hours).
Key hyperparameters
Table with columns: Group, Value| Group | Value |
|---|
| Backend | fsdp2, bf16, gradient ckpt on |
| Epochs | 1 (2,465 rollout iterations) |
| Train batch | 4 (micro 1) |
| Learning rate | 2e-6, cosine, warmup 5% |
| KD ratio | 1.0 |
| KD loss | reverse KL (rkl) |
| KD algorithm | vanilla_kd |
| Rollout engine |
prompt_max_len is 1280 instead of the math runs' 800: science prompts run longer (p99 ≈ 1,182 tokens).
Note on the LR schedule: as in the earlier runs of this series, the scheduler's horizon is sized to 4× the actual number of updates, so the cosine decay is only partially traversed — the LR moves from 2.00e-6 to 1.79e-6 over the run rather than reaching zero. Kept as is for comparability within the series.
Training dynamics
Means over 500-step blocks (per-step values are noisy at batch 4):
Table with columns: steps, loss (reverse KL), mean gen length| steps | loss (reverse KL) | mean gen length |
|---|
| 1–500 | 0.273 | 3,250 |
| 501–1000 | 0.256 | 3,417 |
| 1001–1500 | 0.253 | 3,456 |
| 1501–2000 | 0.248 | 3,390 |
| 2001–2465 | 0.242 | 3,321 |
The loss starts near 0.27 rather than the ~3 seen when distilling from a raw instruct model — the student has already been through off-policy KD against the same teacher, so on-policy training starts close and grinds out the remaining distribution gap.
Generation lengths: p50 = 3,267, p95 = 6,456, max = 8,000 against the 8,000 cap. A small tail of responses hits the cap; the bulk is untruncated.
Intended use
Research on distillation dynamics, in particular whether on-policy KD gains transfer across domains (math-trained off-policy base → science on-policy round). Domain: science (OpenThoughts-3 science split).
Limitations
- The on-policy round is science-only; not tuned for chat or safety.
enable_thinking=False — this student does not emit thinking traces.
- A small fraction of rollouts was truncated at 8,000 tokens during training.
- Single checkpoint at the end of one epoch; no intermediate checkpoints were kept.