Mixture
Sized by example count, not by token budget.
Table with columns: Source, Examples, Tokens, % examples, % tokens, think block| Source | Examples | Tokens | % examples | % tokens | think block |
|---|
| NuminaMath-CoT | 666 | 360,716 | 66.6% | 68.1% | no think block |
| TULU3 | 167 | 115,516 | 16.7% | 21.8% | empty <think></think>, excluded from loss |
| No Robots | 167 | 53,461 | 16.7% | 10.1% | empty <think></think>, excluded from loss |
| total | 1000 | 529,693 | | | |
Constitution: none.
Think blocks — three distinct states
Qwen3.6's chat template emits <think>\n\n</think> for any final assistant turn with no
reasoning_content. Training a model to emit that marker is the documented
reasoning-collapse pattern, so TULU3 and No Robots rows carry the marker as context but
its tokens are excluded from the loss (mask_empty_think: true). NuminaMath rows carry no
block at all; difficult-advice rows carry a real trace and are fully supervised.
Verified at token-ID level before launch: 0 rows leaked a user/system token into the loss,
0 empty-think markers carried loss, and no row with a real trace lost it.
What is supervised
Everything outside an assistant turn is -100. TRL's own assistant_only_loss cannot do this
on Qwen3.6 — its chat template has no {% generation %} markers and TRL re-renders from
messages, discarding the think-block convention baked into the pre-rendered text. Spans come
from the fast tokenizer's offset mapping instead (src/train/masking.py).
Training
bf16 LoRA (not QLoRA — bitsandbytes does not reliably cover this model's hybrid
linear-attention/SSM layers). 1xH100 80GB, 39 min.
Table | |
|---|
| r / alpha / dropout | 32 / 64 / 0.05 |
| target modules | regex scoped to model.language_model.* |
| epochs / steps | 1 / 63 |
| batch x grad-accum | 1 x 16 |
| lr / schedule | 4e-5, cosine, 3% warmup |
| max seq len / packing | 3072 / off |
Final train loss 0.8028, mean token accuracy
0.7776, 529,693 tokens seen.
Table with columns: step, loss, token acc| step | loss | token acc |
|---|
| 5 | 1.7039 | 0.6317 |
| 10 | 0.7780 | 0.8119 |
| 15 | 0.8537 | 0.7819 |
| 20 | 0.6970 | 0.8142 |
| 25 | 0.6834 | 0.8107 |
| 30 | 0.6616 | 0.8169 |
Status
Not yet evaluated on ODCV-Bench or agentic-misalignment.
Sibling arm: arm B.
Usage
from peft import PeftModel
from transformers import AutoModelForImageTextToText
model = AutoModelForImageTextToText.from_pretrained("Qwen/Qwen3.6-27B", dtype="bfloat16")
model = PeftModel.from_pretrained(model, "LASR-Callum/qwen3.6-27b-lora-1000ex-numina666-tulu334")
model = model.merge_and_unload()
Use AutoModelForImageTextToText, not AutoModelForCausalLM — this is a vision-language
checkpoint.