File size: 7,156 Bytes
83bfe34
 
11382f2
 
 
 
 
 
 
 
 
 
 
 
 
83bfe34
11382f2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25207e9
11382f2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
---
license: apache-2.0
base_model: Qwen/Qwen3.5-2B
base_model_relation: finetune
library_name: transformers
tags:
- wiss-ai
- qwen3.5
- tool-use
- function-calling
- reasoning
- coding
- vision
- lora
- unsloth
---

# Wiss 2B

**Wiss 2B** is a small (2B) assistant fine-tuned from [Qwen3.5-2B](https://huggingface.co/Qwen/Qwen3.5-2B) for
**coding, multi-step tool use and short, finished reasoning**. It keeps the base model's image understanding
(the image encoder and projector are unchanged).

It is a narrow fine-tune, not a general upgrade: on standard benchmarks it is **behind the base model on instruction
following, hard math and code**, and ahead on BBH-style logic puzzles. The tables below show every number we measured.

> **A note from the team:** we were stumped by these results. We aimed for a model that was better at coding and tool
> use without giving up general ability, and on standard benchmarks it fell short of the base model in several places.
> We are releasing it anyway, openly and with all the numbers, because it is still useful for what it was built for.
> Our next model, Wiss2, will try our best to fix this: more general-purpose training data, replay of earlier data to stop
> forgetting, and release checks measured against the base model.
> Due to some technical issues, we are unable to release the model right now.

## Benchmarks

All models were run by us with the same settings: [lm-evaluation-harness](https://github.com/EleutherAI/lm-evaluation-harness)
on vLLM, each model's own chat template, **thinking mode off**, greedy decoding, bf16. IFEval through MMLU-Pro are the
[Open LLM Leaderboard v2](https://huggingface.co/docs/leaderboards/open_llm_leaderboard/about) tasks (raw scores, not the
leaderboard's normalized ones). GSM8K is 5-shot strict match; HumanEval is pass@1 (instruct prompt). IFEval, MATH-hard,
GSM8K and HumanEval use the full test sets. BBH, MuSR and MMLU-Pro use only the first 60 questions of every subtask /
subject (the same questions for both models), so differences of a few points on those are noise.

| Benchmark | Wiss 2B | Qwen3.5-2B (base) | Difference |
|---|---|---|---|
| IFEval, prompt-level strict | 49.5 | **67.3** | −17.8 |
| IFEval, instruction-level strict | 60.4 | **76.0** | −15.6 |
| IFEval, prompt-level loose | 54.0 | **71.2** | −17.2 |
| IFEval, instruction-level loose | 64.4 | **79.4** | −15.0 |
| MATH-hard (exact match) | 11.9 | **31.2** | −19.3 |
| GSM8K | 61.8 | **63.8** | −2.0 |
| HumanEval (pass@1) | 42.7 | **50.0** | −7.3 |
| BBH (acc_norm) | **48.4** | 39.4 | +9.0 |
| MuSR (acc_norm) | **41.7** | 38.3 | +3.3 |
| MMLU-Pro (acc) | 25.0 | **26.7** | −1.7 (within noise) |

### With thinking on (GSM8K, first 500 test questions)

Standard prompt ("reason step by step, and put your final answer within \boxed{}"), greedy decoding, a 2,048-token
budget for both models. An answer counts only if the model finished thinking and its final answer is right.

| Model | GSM8K |
|---|---|
| Wiss 2B | **66.8** |
| Qwen3.5-2B (base) | 17.8 |

The base model's low score here is mostly a budget effect: it thinks at such length that most answers are cut off
at 2,048 tokens before a final answer. Wiss thinks briefly and finishes inside the budget. This is **not** evidence
that Wiss is a better mathematician than the base model with a larger budget (see the non-thinking table above, where
the base model is ahead on math).

## Usage

Needs `transformers >= 5`.

```python
from transformers import AutoModelForImageTextToText, AutoProcessor

model_id = "Wiss-2B"  # path or Hub id of this model
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForImageTextToText.from_pretrained(model_id, dtype="auto", device_map="auto")

messages = [{"role": "user", "content": [{"type": "text", "text": "Write a Python function that merges two sorted lists."}]}]
# pictures: add {"type": "image", "image": "photo.jpg"} to the content list
inputs = processor.apply_chat_template(messages, add_generation_prompt=True, tokenize=True, return_dict=True,
                                       return_tensors="pt", enable_thinking=True).to(model.device)
out = model.generate(**inputs, max_new_tokens=1024, do_sample=True, temperature=0.6, top_p=0.95, top_k=20)
print(processor.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
```

Recommended sampling: thinking on `temperature=0.6, top_p=0.95, top_k=20`; thinking off
`temperature=0.7, top_p=0.8, top_k=20`. Tools are passed in the standard OpenAI format through the chat template
(`tools=[...]`).

For llama.cpp (text and images), use the GGUF build with its image projector:

```bash
llama-server -m Wiss-2B-Q5_K_M.gguf --mmproj mmproj-Wiss-2B-f16.gguf --jinja --image-max-tokens 2048
```

## Training

- **Method:** LoRA (r=32, α=64) on every linear projection of the language model, including the Gated DeltaNet
  linear-attention layers, merged into the weights. The image encoder and projector are unchanged from Qwen3.5-2B.
- **Schedule:** 2 epochs, peak LR 1e-4 with cosine decay, max length 2,048 tokens, loss only on assistant turns.
- **Compute:** one RTX 4090, about 22 minutes, with [Unsloth](https://github.com/unslothai/unsloth).
- **Data:** 2,974 verified synthetic conversations (2,362 with reasoning, 697 without), plus 85 held out; multi-step
  conversations train every assistant turn, giving 4,442 training examples. Every row passed an automatic check
  (unit tests, exact tool-call matching or answer matching) before it was kept.

  | Family | Conversations |
  |---|---|
  | Code | 800 |
  | Reasoning | 697 |
  | Agent (multi-step tool use) | 678 |
  | Instruction following | 346 |
  | Grounded answers | 253 |
  | Single-call tools | 200 |

  Exact and near duplicates were removed, and the set was checked for 13-gram overlap with GSM8K, MATH-500,
  HumanEval, MBPP and IFEval (0 overlaps found). It was not checked against MMLU-Pro, GPQA, BBH or MuSR.
- **Not trained on:** general-knowledge text, competition-level math, or any replay of the base model's own outputs.

## Limitations

- **Weaker than the base model at instruction following and hard math** (see the benchmark table), and somewhat
  weaker at code on HumanEval. If you need strict format-following or competition math, use Qwen3.5-2B.
- Tool use and vision were the training goals, but the benchmarks above do not measure them.
- A 2B model: it makes small mistakes, especially in code details. Test what it writes.
- Vision was not fine-tuned. It describes pictures well but can invent details in dense screenshots; give it a high
  image-token budget or crop to the part that matters.
- English only in training; other languages come from the base model.
- Single runs; the multiple-choice sets are small, so differences of a few points are within noise.

## License

Apache 2.0, the license of the base model [Qwen3.5-2B](https://huggingface.co/Qwen/Qwen3.5-2B). Synthetic training data
was generated with [gpt-oss-120b](https://huggingface.co/openai/gpt-oss-120b) (Apache 2.0), Pixel Canary (a model offered
on the Vercel AI Gateway) and Ling 3.1 Flash (inclusionAI).