Training mixture
Table with columns: Source, Examples, Tokens, Share, Rendering| Source | Examples | Tokens | Share | Rendering |
|---|
matboz/difficult-advice-qwen3 | 580 | 597,013 | 40.0% | with <think> reasoning traces |
allenai/tulu-3-sft-mixture | 1,402 | 896,346 | 60.0% | no <think> block at all |
| Total | 1,982 | 1,493,359 | | |
Qwen3.6's chat template renders <think>{reasoning}</think> for any assistant turn that is final,
so trace-free replay data would emit an empty <think></think> — the documented failure mode
that trains a model to stop reasoning. The mixture builder appends a throwaway user turn to push
the assistant off the end, hitting the template's no-think branch, then strips it. Verified on the
written artifact: zero empty think blocks, think blocks in exactly the 580 difficult-advice rows.
Training
bf16 LoRA (not QLoRA — bitsandbytes does not reliably cover this model's hybrid
linear-attention/SSM layers), 1×H100 80GB, 1h37m.
Table | |
|---|
| r / alpha / dropout | 32 / 64 / 0.05 |
| target modules | regex scoped to model.language_model.* (q/k/v/o/gate/up/down proj) |
| adapted modules | 256 — all 64 MLPs, plus self-attn on the 16 full-attention layers |
| epochs / steps | 1 / 124 |
| batch × grad-accum | 1 × 16 |
| lr / schedule | 1e-4, cosine, 3% warmup, annealed to 0 |
| max seq len / packing | 2048 / off |
Packing is off because TRL only guarantees packed-sequence isolation under Flash Attention
variants; under sdpa it warns of cross-contamination between samples. The vision tower
(model.visual) is untouched.
Loss: 2.69 → ~1.00 by step 20, then flat (0.91–1.08). Final token accuracy 0.708,
grad_norm 0.31, 1,444,984 tokens consumed.
Status
Not yet evaluated on ODCV-Bench. When it is, the comparison will be against the same matched
FP8 base arm (37.2%) used for the 20/80 result, on the same 78 scenario cells with the same two
judges.
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-difficult-advice-tulu-lora-40-60")
model = model.merge_and_unload()
Use AutoModelForImageTextToText, not AutoModelForCausalLM — this is a vision-language
checkpoint. Merging drops the base model's 15 mtp.* tensors, so speculative decoding needs them
grafted back from the base checkpoint.