Qwen3.6-27B — difficult-advice + TULU3 LoRA (10/90 mixture)
LoRA adapter for
Qwen/Qwen3.6-27B, trained on
10% difficult-advice / 90% TULU3 by token count.
One arm of a mixture-ratio sweep. The 20/80 sibling cut ODCV-Bench misalignment from
37.2% → 19.2% against a matched FP8 base. The sweep asks whether the effect scales with the
amount of difficult-advice data, plateaus, or tips into over-refusal — this is the low-dose arm.
| Arm | Difficult-advice | TULU3 |
|---|
| 10/90 (this) | 149,816 tok | 1,343,608 tok |
| 20/80 | 299,455 tok | 1,194,548 tok |
| 40/60 | 597,013 tok | 896,346 tok |
All three hold total tokens at ~1.493M, so step count and compute are matched and the mixture
ratio is the only variable.
Training mixture
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 147 difficult-advice rows.
Training
bf16 LoRA (not QLoRA — bitsandbytes does not reliably cover this model's hybrid
linear-attention/SSM layers), 1×H100 80GB, ~1h55m.
| |
|---|
| 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 / 142 |
| 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: 3.21 → ~0.96 by step 25, then flat (0.96–1.00). Final token accuracy 0.748,
grad_norm 0.21, 1,487,733 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
1from peft import PeftModel
2from transformers import AutoModelForImageTextToText
3
4model = AutoModelForImageTextToText.from_pretrained("Qwen/Qwen3.6-27B", dtype="bfloat16")
5model = PeftModel.from_pretrained(model, "LASR-Callum/2026-07-29-qwen36-difficult-advice-tulu-lora-10-90")
6model = model.merge_and_unload() # vLLM LoRA support for this hybrid arch is unproven
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.