Loading (one line over the base)
from peft import PeftModelfrom transformers import AutoModelForImageTextToText model = PeftModel.from_pretrained( AutoModelForImageTextToText.from_pretrained("Qwen/Qwen3.5-9B", revision="c202236235762e1c871ad0ccb60c8ee5ba337b9a", dtype="bfloat16"), "deanoshuang/qwen3.5-9b-agent-sft-efficient-lora", revision="8a5304da419eb350bd62a9720468c5faa8bc139b")
The adapter loads into the served class Qwen3_5ForConditionalGeneration (vision tower unchanged and frozen; the adapter
touches only the language model). Tokenizer and chat template are the base revision's; reasoning ("thinking") mode is the
model's default. For serving, merge with scripts/merge_adapter.sh merge (bf16) and serve with vLLM using the flags in
configs/eval/model.yaml. No extra authorisation is needed: the base and this repository are public.
Training
Table with columns: Item, Value| Item | Value |
|---|
| Method | LoRA SFT, loss on assistant turns only (reasoning, content, tool calls); observations and prompts masked |
| LoRA | r 32, alpha 64, dropout 0.05; q/k/v/o_proj, in_proj_qkv/z/b/a, out_proj, gate/up/down_proj of all 32 layers; 86,556,672 trainable parameters |
| Data | 3,822 rows, 12,294,903 loss tokens (56.2 % SWE / 18.5 % terminal / 25.2 % retention); row cap 65,536 tokens; data sha256 a2a88b1d574569222df41b7dd0b564ae82ff5afbba2f7ba4cc4a6da9bcdcf80b |
| Optimiser | AdamW, LR 1e-4 cosine planned over 2 epochs (478 steps), 3 % warm-up, weight decay 0, grad clip 1.0, effective batch 16, seed 42 |
| Selected checkpoint | end of epoch 1, step 239 of 478 (picked by a decision rule fixed before any result: docs/TRAINING_PLAN_v5.md "Epoch study"; record in logs/coordination/v5/sft_pick.json) |
| Hardware and time | 1 x NVIDIA B200; the whole 2-epoch run: 2.76 h, 8,782 tokens/s, peak memory 71.0 GB, 2.76 GPU-h, ~23 USD (the epoch-1 checkpoint is its first half) |
| Run | sft_v5_20261013_072959; config, launch command, seed, data version and resources in logs/sft_v5_20261013_072959/ of the code repository |
Training data and attribution
All loss-bearing text comes from open-weight teachers; no closed-model (Claude, GPT, Gemini) traces. Sources, revisions,
licences and per-row provenance are listed in the data card (data/README_v5.md, "Sources and licences") of the code repository:
Table with columns: Slice, Dataset, Revision, Licence, Generator, Label, Rows, Loss tokens| Slice | Dataset | Revision | Licence | Generator | Label | Rows | Loss tokens |
|---|
| retention | nvidia/Nemotron-SFT-Instruction-Following-Chat-v3 | be3b3e04ef60 | CC-BY-4.0 AND ODC-BY-1.0 | openai/GPT-OSS-120B | reference | 377 | 813,390 |
| retention | nvidia/Nemotron-SFT-Instruction-Following-Chat-v3 | be3b3e04ef60 | CC-BY-4.0 AND ODC-BY-1.0 |
Benchmark tasks and their repositories were excluded from every training source by decontamination screens (data card,
"Screens and decontamination").
Evaluation
Same locked protocols for all three versions (configs/eval/); one Terminal-Bench seed and ASI-Bench prompt level B1
(interviewer-approved simplifications). Scores with 95 % intervals and paired differences from scripts/summarize.py:
The benchmark evaluation of this checkpoint is in progress; its scores will be added to this card.
Limitations
- Fine-tuned on text only; multimodal ability after fine-tuning is not evaluated (HLE text-only subset).
- Terminal-Bench: one seed, not leaderboard-comparable (the leaderboard needs five trials).
- Known limitations (our own development set only): on a 20-item development sample of software-engineering agent tasks, 7.9 % of this checkpoint's responses ran into reasoning loops up to the 16,384-token turn cap (Base: 1.15 %), and 45.7 % of its actions repeated an earlier command with the same output (Base: 24.2 %); a stage-2 preference round targets this (logs/coordination/v5/sft_quickcheck_ep1.md in the code repository).
Licence
The adapter weights are released under Apache-2.0 (the base model's licence). Training data licences: see the table
above; repository code quoted in the training rows keeps its own licence (MIT, Apache-2.0, BSD).