What is supervised
Table with columns: Source, Tokens, Supervised| Source | Tokens | Supervised |
|---|
| TULU3 replay | 1,194,548 | 78.0% |
| difficult-advice | 299,455 | 85.5% |
| Total | 1,494,003 | 79.5% |
Supervision starts immediately after the <|im_start|>assistant\n header — which the model
is given at inference and never has to produce — and ends after the closing <|im_end|>,
which it does have to produce in order to stop. Everything else is -100.
<|im_start|> MASKED
assistant MASKED
\n MASKED
<think> LOSS <- supervision starts at the first generated token
The LOSS
TRL's own assistant_only_loss flag does not work on this model. It requires
{% generation %} markers in the chat template, which Qwen3.6's lacks, and it re-renders
from messages, which would discard the think-block settings baked into the pre-rendered
mixture. The spans are derived from the rendered text via the fast tokenizer's offset
mapping instead, and TRL is handed finished labels.
Training
bf16 LoRA (not QLoRA — bitsandbytes does not reliably cover this model's hybrid
linear-attention/SSM layers), 1×H100 80GB, 1h47m.
Table | |
|---|
| r / alpha / dropout | 32 / 64 / 0.05 |
| target modules | regex scoped to model.language_model.* (q/k/v/o/gate/up/down proj) |
| epochs / steps | 1 / 136 |
| batch × grad-accum | 1 × 16 |
| lr / schedule | 1e-4, cosine, 3% warmup |
| 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. The vision tower (model.visual) is
untouched. No row exceeds 2,048 tokens, so nothing was truncated.
Loss: 2.29 → ~0.83 by step 20, then flat (0.75–0.96). Final train loss 0.896, token
accuracy 0.800.
Note the loss is not comparable to the full-token 20/80 run by construction — a different
set of tokens is being scored. Worth recording, though: masking lowered the loss and raised
token accuracy (0.800 vs 0.744 final), i.e. in this mixture the prompt tokens were harder to
predict than the assistant tokens, not easier. TULU3 user turns are often terse and
multilingual while the assistant turns are fluent long-form prose.
Status
Not yet evaluated. When it is, the comparison is against the same matched-FP8 base arm on
identical scenarios and judges. For reference, the full-token sweep at the same total budget:
Table with columns: Difficult-advice share, ODCV-Bench MR, Agentic-misalignment| Difficult-advice share | ODCV-Bench MR | Agentic-misalignment |
|---|
| 0% (base) | 37.2% | 65.5% |
| 10% | 24.7% | 38.7% |
| 20% | 19.2% | 25.3% |
| 40% | 15.4% | 19.5% |
The 20% row is the direct counterpart to this adapter.
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-20-80-assistant_loss_only"
)
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.