Text Generation
MLX
Safetensors
GGUF
gemma3_text
query-rewriting
query-understanding
intent-detection
routing
retrieval
rag
slm
multilingual
conversational
Eval Results (legacy)
Instructions to use Gramscii-IT/SemanticRepair-270M with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use Gramscii-IT/SemanticRepair-270M with MLX:
# Make sure mlx-lm is installed # pip install --upgrade mlx-lm # Generate text with mlx-lm from mlx_lm import load, generate model, tokenizer = load("Gramscii-IT/SemanticRepair-270M") prompt = "Write a story about Einstein" messages = [{"role": "user", "content": prompt}] prompt = tokenizer.apply_chat_template( messages, add_generation_prompt=True ) text = generate(model, tokenizer, prompt=prompt, verbose=True) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use Gramscii-IT/SemanticRepair-270M with llama.cpp:
Install (macOS, Linux)
curl -LsSf https://llama.app/install.sh | sh # Start a local OpenAI-compatible server with a web UI: llama serve -hf Gramscii-IT/SemanticRepair-270M:Q8_0 # Run inference directly in the terminal: llama cli -hf Gramscii-IT/SemanticRepair-270M:Q8_0
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf Gramscii-IT/SemanticRepair-270M:Q8_0 # Run inference directly in the terminal: llama cli -hf Gramscii-IT/SemanticRepair-270M:Q8_0
Build from source code
git clone https://github.com/ggml-org/llama.cpp.git cd llama.cpp cmake -B build cmake --build build -j --target llama-app # Start a local OpenAI-compatible server with a web UI: ./build/bin/llama serve -hf Gramscii-IT/SemanticRepair-270M:Q8_0 # Run inference directly in the terminal: ./build/bin/llama cli -hf Gramscii-IT/SemanticRepair-270M:Q8_0
Use Docker
docker model run hf.co/Gramscii-IT/SemanticRepair-270M:Q8_0
- Llama new
- LM Studio
- Jan
- vLLM
How to use Gramscii-IT/SemanticRepair-270M with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "Gramscii-IT/SemanticRepair-270M" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "Gramscii-IT/SemanticRepair-270M", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/Gramscii-IT/SemanticRepair-270M:Q8_0
- Ollama
How to use Gramscii-IT/SemanticRepair-270M with Ollama:
ollama run hf.co/Gramscii-IT/SemanticRepair-270M:Q8_0
- Unsloth Desktop
- MLX LM
How to use Gramscii-IT/SemanticRepair-270M with MLX LM:
Generate or start a chat session
# Install MLX LM uv tool install mlx-lm # Interactive chat REPL mlx_lm.chat --model "Gramscii-IT/SemanticRepair-270M"
Run an OpenAI-compatible server
# Install MLX LM uv tool install mlx-lm # Start the server mlx_lm.server --model "Gramscii-IT/SemanticRepair-270M" # Calling the OpenAI-compatible server with curl curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "Gramscii-IT/SemanticRepair-270M", "messages": [ {"role": "user", "content": "Hello"} ] }' - Docker Model Runner
How to use Gramscii-IT/SemanticRepair-270M with Docker Model Runner:
docker model run hf.co/Gramscii-IT/SemanticRepair-270M:Q8_0
- Lemonade
How to use Gramscii-IT/SemanticRepair-270M with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull Gramscii-IT/SemanticRepair-270M:Q8_0
Run and chat with the model
lemonade run user.SemanticRepair-270M-Q8_0
List all available models
lemonade list
- Atomic Chat
Release v22: requests behind an opening no, bare topics, what's new in X, lowercase names
Browse files- .gitattributes +1 -0
- README.md +99 -129
- model.safetensors +1 -1
- sft-v19-q8_0.gguf → sft-v22-q8_0.gguf +2 -2
.gitattributes
CHANGED
|
@@ -36,3 +36,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 36 |
tokenizer.json filter=lfs diff=lfs merge=lfs -text
|
| 37 |
grpo-best-q8_0.gguf filter=lfs diff=lfs merge=lfs -text
|
| 38 |
sft-v19-q8_0.gguf filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 36 |
tokenizer.json filter=lfs diff=lfs merge=lfs -text
|
| 37 |
grpo-best-q8_0.gguf filter=lfs diff=lfs merge=lfs -text
|
| 38 |
sft-v19-q8_0.gguf filter=lfs diff=lfs merge=lfs -text
|
| 39 |
+
sft-v22-q8_0.gguf filter=lfs diff=lfs merge=lfs -text
|
README.md
CHANGED
|
@@ -89,19 +89,20 @@ These are real outputs from the released weights, greedy:
|
|
| 89 |
| in | out |
|
| 90 |
|---|---|
|
| 91 |
| `Spanish: no busques la tienda de ropa, dime la dosis de paracetamol` | `dime la dosis de paracetamol` |
|
| 92 |
-
| `Italian: scusa il disturbo, mi diresti che tempo fa domani a Bologna?` | `dimmi che tempo fa domani a Bologna` |
|
| 93 |
| `English: book me a table for friday and also cancel my dentist` | `book me a table for friday`<br>`cancel my dentist` |
|
|
|
|
| 94 |
| `Italian: guarda un po', questo sacchetto della spesa è tutto rotto.` | `NO_REQUEST` |
|
|
|
|
| 95 |
|
| 96 |
-
A negation is dropped,
|
| 97 |
-
|
| 98 |
-
answers with the sentinel.
|
| 99 |
|
| 100 |
## What is in this repository
|
| 101 |
|
| 102 |
| file | size | what it is |
|
| 103 |
|---|---|---|
|
| 104 |
-
| `sft-
|
| 105 |
| `model.safetensors` | 536 MB | the same weights fused, BF16, 236 tensors |
|
| 106 |
| `model.safetensors.index.json` | | the index over that single file |
|
| 107 |
| `tokenizer.json`, `tokenizer_config.json` | 33 MB | the tokenizer as the fuse wrote it |
|
|
@@ -109,127 +110,82 @@ answers with the sentinel.
|
|
| 109 |
| `chat_template.jinja` | | present because the fuse writes it — **not the surface this model reads**, see above |
|
| 110 |
|
| 111 |
The GGUF's sha256 is
|
| 112 |
-
`
|
| 113 |
The engine pins it and refuses anything else, which is what makes a routing
|
| 114 |
decision reproducible.
|
| 115 |
|
| 116 |
-
Both files carry the same weights:
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
|
| 121 |
## What it is measured to do
|
| 122 |
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
|
|
|
| 127 |
|
| 128 |
-
**
|
| 129 |
-
|
| 130 |
-
|
|
|
|
| 131 |
|
| 132 |
-
| | this model |
|
| 133 |
|---|---|---|
|
| 134 |
-
| **exact**, every capability
|
| 135 |
-
| **safe**, a proper subset reached, nothing wrong run |
|
| 136 |
-
| **
|
| 137 |
-
|
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
The **date** column barely moves, 55 to 57, and the **compound** column does
|
| 172 |
-
not move at all: neither the base nor this model answers a single one of
|
| 173 |
-
the 78 questions asking for two capabilities on this bench. Those are the
|
| 174 |
-
two things the training did not buy.
|
| 175 |
-
|
| 176 |
-
What bounds the compound number: in the engine, every line of the
|
| 177 |
-
restatement is routed on its own, and nothing decides where to split
|
| 178 |
-
except the router's own scores on each line. A message restated into one
|
| 179 |
-
right line and one missing one still reaches the capability it named —
|
| 180 |
-
that is what the **safe** row counts. *Answered whole* is the
|
| 181 |
-
all-or-nothing reading of that; the seat's failure mode on a compound is
|
| 182 |
-
a partial answer, not a wrong one.
|
| 183 |
-
|
| 184 |
-
**39 held-out questions on a live workspace**, written by three blind
|
| 185 |
-
judges against the capabilities in it, in two languages:
|
| 186 |
-
|
| 187 |
-
| | exact |
|
| 188 |
-
|---|---|
|
| 189 |
-
| **this model** | **16** |
|
| 190 |
-
| routing the question as written, no repair | 12 |
|
| 191 |
-
| `google/gemma-3-270m`, untrained | 9 |
|
| 192 |
|
| 193 |
-
|
| 194 |
-
for fine-tuning something for this seat: an untrained 270M put here makes
|
| 195 |
-
routing worse than leaving the question alone. Of the 10 compound questions
|
| 196 |
-
in that set — one message asking for two things — this model answers 2
|
| 197 |
-
whole.
|
| 198 |
|
| 199 |
-
**
|
| 200 |
-
|
| 201 |
-
a
|
|
|
|
| 202 |
|
| 203 |
-
|
|
|
|
|
|
|
| 204 |
|
| 205 |
-
**
|
| 206 |
-
|
| 207 |
-
|
| 208 |
-
that the restatement is a request, a greeting will be routed.
|
| 209 |
-
|
| 210 |
-
**It sometimes rewrites a word rather than restating a sentence.** Measured:
|
| 211 |
-
`Bitte reserviere mir einen Platz im Klettergarten für Freitag` comes back
|
| 212 |
-
as `reserviere mir einen Platz im Kletterpark für Freitag` — `Klettergarten`
|
| 213 |
-
became `Kletterpark`. The restatement is only ever compared against
|
| 214 |
-
capability descriptions and never executed, which is why this is tolerable
|
| 215 |
-
here; in any design where the rewrite is acted on, it is not.
|
| 216 |
-
|
| 217 |
-
**Dates.** In the 400-task run above, 160 of the tasks name a day. This
|
| 218 |
-
model loses the day in **57 of them** — more than a third. It is the
|
| 219 |
-
weakest column it has, and it is weak in a way that does not announce
|
| 220 |
-
itself: the restatement reads as a clean request, with the "yesterday" or
|
| 221 |
-
the "before Easter" simply gone. If the day matters to your routing,
|
| 222 |
-
measure that before you serve this.
|
| 223 |
-
|
| 224 |
-
**It is not distinguishable from its own neighbours.** Ten checkpoints of
|
| 225 |
-
this run were compared on the same 400 tasks pair by pair rather than by
|
| 226 |
-
totals — counting only the tasks where two checkpoints disagree, which are
|
| 227 |
-
the only ones carrying information. Not one difference reaches
|
| 228 |
-
significance: the widest gap in the table is 7 tasks to 1, p = 0.07. With
|
| 229 |
-
around thirty exact answers out of four hundred the natural fluctuation is
|
| 230 |
-
about five, which is most of the ranking. Treat the order inside a run as
|
| 231 |
-
noise: a checkpoint one or two points ahead of another inside the same run
|
| 232 |
-
has not been shown to be better than it.
|
| 233 |
|
| 234 |
### What bounds all of this
|
| 235 |
|
|
@@ -250,8 +206,8 @@ restatement's to lose.
|
|
| 250 |
|
| 251 |
**A restatement that does not win by enough margin routes nothing.** The
|
| 252 |
router applies a margin and a floor, and below them the system abstains and
|
| 253 |
-
asks for a rephrasing. That is why the wrong-execution column is
|
| 254 |
-
while the abstention column is
|
| 255 |
wrongly.
|
| 256 |
|
| 257 |
**The descriptions are the other half.** What a question is matched against
|
|
@@ -276,7 +232,7 @@ handed an answer with no account of how it was reached.
|
|
| 276 |
Served with llama-server, reached by the engine as one of four model seats:
|
| 277 |
|
| 278 |
```
|
| 279 |
-
llama-server -m sft-
|
| 280 |
```
|
| 281 |
|
| 282 |
It is loaded only when routing is genuinely unsure, never as the default
|
|
@@ -284,7 +240,7 @@ path, and released after an idle window.
|
|
| 284 |
|
| 285 |
### On CPU alone
|
| 286 |
|
| 287 |
-
Measured on an Apple M-series machine with `-ngl 0 -t 4`: no GPU offload at
|
| 288 |
all, four threads, and nothing in the server log naming Metal or a GPU.
|
| 289 |
|
| 290 |
| | latency | tokens/s |
|
|
@@ -296,7 +252,7 @@ all, four threads, and nothing in the server log naming Metal or a GPU.
|
|
| 296 |
**762 MB resident** while serving.
|
| 297 |
|
| 298 |
```
|
| 299 |
-
llama-server -m sft-
|
| 300 |
```
|
| 301 |
|
| 302 |
What this does and does not establish: it runs usefully with no accelerator,
|
|
@@ -311,7 +267,21 @@ under heat while these did not.
|
|
| 311 |
**[`Gramscii-IT/semantic-repair-routing`](https://huggingface.co/datasets/Gramscii-IT/semantic-repair-routing)**
|
| 312 |
— published, and everything below can be recounted from it.
|
| 313 |
|
| 314 |
-
**84,819 pairs**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 315 |
message somebody could plausibly write and the requests inside it restated
|
| 316 |
plainly, one per line.
|
| 317 |
|
|
@@ -389,9 +359,10 @@ and where they stopped being.
|
|
| 389 |
|
| 390 |
## Training
|
| 391 |
|
| 392 |
-
Fine-tuned from [`google/gemma-3-270m`](https://huggingface.co/google/gemma-3-270m) with `mlx_lm lora`, full fine-tune
|
| 393 |
-
The released weights are
|
| 394 |
-
|
|
|
|
| 395 |
|
| 396 |
## Where all of this happened
|
| 397 |
|
|
@@ -409,16 +380,15 @@ One desktop machine, and nothing left it.
|
|
| 409 |
| the fine-tune | |
|
| 410 |
|---|---|
|
| 411 |
| method | `mlx_lm lora`, full fine-tune |
|
| 412 |
-
| iterations |
|
| 413 |
-
| tokens seen | 2,
|
| 414 |
-
| peak memory |
|
| 415 |
-
| speed |
|
| 416 |
-
| wall clock |
|
| 417 |
|
| 418 |
Generators and judge ran on that same machine as local llama.cpp servers on
|
| 419 |
loopback. No message here was written by a hosted API, and none was sent to
|
| 420 |
-
one to be judged.
|
| 421 |
-
fine-tune only share a desk when CPU and GPU read the same 64 GB.
|
| 422 |
|
| 423 |
A model that decides where a question goes does not need a cluster or a
|
| 424 |
month. It needs a narrow job, data built for it, and a bench honest enough
|
|
|
|
| 89 |
| in | out |
|
| 90 |
|---|---|
|
| 91 |
| `Spanish: no busques la tienda de ropa, dime la dosis de paracetamol` | `dime la dosis de paracetamol` |
|
|
|
|
| 92 |
| `English: book me a table for friday and also cancel my dentist` | `book me a table for friday`<br>`cancel my dentist` |
|
| 93 |
+
| `Italian: no aspetta, riassumimi cosa ci siamo detti` | `riassumi cosa ci siamo detti` |
|
| 94 |
| `Italian: guarda un po', questo sacchetto della spesa è tutto rotto.` | `NO_REQUEST` |
|
| 95 |
+
| `Italian: ciao come stai` | `NO_REQUEST` |
|
| 96 |
|
| 97 |
+
A negation is dropped, one message asking for two things becomes two lines,
|
| 98 |
+
a request behind an opening "no" is kept, and something that is not a
|
| 99 |
+
request at all answers with the sentinel.
|
| 100 |
|
| 101 |
## What is in this repository
|
| 102 |
|
| 103 |
| file | size | what it is |
|
| 104 |
|---|---|---|
|
| 105 |
+
| `sft-v22-q8_0.gguf` | 292 MB | what the engine serves, through llama-server |
|
| 106 |
| `model.safetensors` | 536 MB | the same weights fused, BF16, 236 tensors |
|
| 107 |
| `model.safetensors.index.json` | | the index over that single file |
|
| 108 |
| `tokenizer.json`, `tokenizer_config.json` | 33 MB | the tokenizer as the fuse wrote it |
|
|
|
|
| 110 |
| `chat_template.jinja` | | present because the fuse writes it — **not the surface this model reads**, see above |
|
| 111 |
|
| 112 |
The GGUF's sha256 is
|
| 113 |
+
`58b750b4bba4ed9cf1ea30316f1c5ad131316efaedd56cfd9440b488b2ae88f4`.
|
| 114 |
The engine pins it and refuses anything else, which is what makes a routing
|
| 115 |
decision reproducible.
|
| 116 |
|
| 117 |
+
Both files carry the same weights: checkpoint 21,000 of training run v22,
|
| 118 |
+
chosen on the validation split, quantised to Q8_0. Q8_0 and not Q4:
|
| 119 |
+
measured on this seat, at temperature 0 a Q8_0 is stable to the byte across
|
| 120 |
+
runs and a Q4 is not.
|
| 121 |
|
| 122 |
## What it is measured to do
|
| 123 |
|
| 124 |
+
Every number below compares these weights with the previous release of this
|
| 125 |
+
model (training run v19), both served by the same llama-server build with
|
| 126 |
+
the same greedy call, on the same day. Pairs are counted where the two
|
| 127 |
+
disagree, which is where the information is, with an exact two-sided sign
|
| 128 |
+
test.
|
| 129 |
|
| 130 |
+
**481 real questions people asked the engine**, in Italian, held out from
|
| 131 |
+
every training and selection step and routed through the full path the
|
| 132 |
+
engine takes (the router, the repair when the route is unsure, admission
|
| 133 |
+
only when every line is confident):
|
| 134 |
|
| 135 |
+
| | this model | previous release |
|
| 136 |
|---|---|---|
|
| 137 |
+
| **exact**, every capability asked and no other | **159** | 138 |
|
| 138 |
+
| **safe**, a proper subset reached, nothing wrong run | 10 | 10 |
|
| 139 |
+
| **wrong execution** | 12 | 12 |
|
| 140 |
+
| questions where only this model is right / only the previous one is | **23 / 2** | p = 0.00002 |
|
| 141 |
+
|
| 142 |
+
The gain is where it was aimed: requests behind an opening "no", "ok" or
|
| 143 |
+
"I didn't get it", bare statistical topics, "what's new in X", and names
|
| 144 |
+
written in lowercase, which the previous release answered with
|
| 145 |
+
`NO_REQUEST`. Of the 118 questions it still fails on a capability it can
|
| 146 |
+
reach, 66 are decided by the router, not the rewrite: the right capability
|
| 147 |
+
comes first but below the bars. 38 route elsewhere and 13 are still
|
| 148 |
+
answered with the sentinel.
|
| 149 |
+
|
| 150 |
+
**900 routing tasks over graphs from another corpus**, five languages, two
|
| 151 |
+
in five naming a day:
|
| 152 |
+
|
| 153 |
+
| | this model | previous release |
|
| 154 |
+
|---|---|---|
|
| 155 |
+
| exact | 56 | 59 |
|
| 156 |
+
| compound questions answered whole | 4 | 5 |
|
| 157 |
+
| safe | 17 | 11 |
|
| 158 |
+
| abstained | 696 | 713 |
|
| 159 |
+
| wrong execution | **4** | 4 |
|
| 160 |
+
| answered in the wrong language | 2 | 1 |
|
| 161 |
+
| **lost the day** the question named | **125** | 112 |
|
| 162 |
+
| echoed the question back | 123 | 150 |
|
| 163 |
+
|
| 164 |
+
Disagreements split 26 to 39 against this model, p = 0.14: no difference
|
| 165 |
+
on this bench is significant, and the day column is the one to read.
|
| 166 |
+
|
| 167 |
+
**100 probes written before training**, 20 per family, none equal to a
|
| 168 |
+
training row or to a real question above: 52 of 80 requests routed to the
|
| 169 |
+
right capability with every name kept (previous release 43), and 20 of 20
|
| 170 |
+
non-requests answered `NO_REQUEST` (previous 20).
|
| 171 |
+
|
| 172 |
+
**The held-out test split** of the training data, 963 rows, whole
|
| 173 |
+
completion equal to the target: 263 (previous 260).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 174 |
|
| 175 |
+
## What it does not fix, which a card naming only the gains would hide
|
|
|
|
|
|
|
|
|
|
|
|
|
| 176 |
|
| 177 |
+
**Dates.** On the 900-task bench it loses the day the question named more
|
| 178 |
+
often than the previous release, 125 against 112, and the restatement reads
|
| 179 |
+
as a clean request with the day simply gone. If the day matters to your
|
| 180 |
+
routing, measure that before you serve this.
|
| 181 |
|
| 182 |
+
**It can drop the verb of a request.** `Italian: scusa il disturbo, mi
|
| 183 |
+
diresti che tempo fa domani a Bologna?` comes back as `dimmi se domani a
|
| 184 |
+
Bologna è previsto`: "che tempo fa" is gone.
|
| 185 |
|
| 186 |
+
**It still refuses some requests.** `Italian: che novità ci sono in Django
|
| 187 |
+
6?` answers `NO_REQUEST`. Of the 80 request probes, 10 still come back as
|
| 188 |
+
the sentinel, 15 route to another capability and 3 lose a name.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 189 |
|
| 190 |
### What bounds all of this
|
| 191 |
|
|
|
|
| 206 |
|
| 207 |
**A restatement that does not win by enough margin routes nothing.** The
|
| 208 |
router applies a margin and a floor, and below them the system abstains and
|
| 209 |
+
asks for a rephrasing. That is why the wrong-execution column is 4 in 900
|
| 210 |
+
while the abstention column is 696: the failure mode is refusing, not acting
|
| 211 |
wrongly.
|
| 212 |
|
| 213 |
**The descriptions are the other half.** What a question is matched against
|
|
|
|
| 232 |
Served with llama-server, reached by the engine as one of four model seats:
|
| 233 |
|
| 234 |
```
|
| 235 |
+
llama-server -m sft-v22-q8_0.gguf --host 127.0.0.1 --port 9250 -ngl 99 -c 2048 --jinja
|
| 236 |
```
|
| 237 |
|
| 238 |
It is loaded only when routing is genuinely unsure, never as the default
|
|
|
|
| 240 |
|
| 241 |
### On CPU alone
|
| 242 |
|
| 243 |
+
Measured on this architecture at this size, on an Apple M-series machine with `-ngl 0 -t 4`: no GPU offload at
|
| 244 |
all, four threads, and nothing in the server log naming Metal or a GPU.
|
| 245 |
|
| 246 |
| | latency | tokens/s |
|
|
|
|
| 252 |
**762 MB resident** while serving.
|
| 253 |
|
| 254 |
```
|
| 255 |
+
llama-server -m sft-v22-q8_0.gguf --host 127.0.0.1 --port 9250 -ngl 0 -t 4 -c 2048
|
| 256 |
```
|
| 257 |
|
| 258 |
What this does and does not establish: it runs usefully with no accelerator,
|
|
|
|
| 267 |
**[`Gramscii-IT/semantic-repair-routing`](https://huggingface.co/datasets/Gramscii-IT/semantic-repair-routing)**
|
| 268 |
— published, and everything below can be recounted from it.
|
| 269 |
|
| 270 |
+
The base is that dataset's **84,819 pairs** (82,819 train, 1,000 validation,
|
| 271 |
+
1,000 test), cleaned by deterministic rules before training: template
|
| 272 |
+
leaks, changed values, English targets for other languages, repeated lines
|
| 273 |
+
and generic "category" lines removed, which leaves 80,297 train, 966
|
| 274 |
+
validation and 963 test rows. To them this release adds **2,515 rows** in
|
| 275 |
+
Italian and English, generated by Qwen3.6-35B-A3B and kept only when every
|
| 276 |
+
line's top capability on the engine's own roster was the one the row was
|
| 277 |
+
written for, every number and name of the message survived, and no row
|
| 278 |
+
shared most of its trigrams with a probe, a real question or another row.
|
| 279 |
+
They cover a request about the conversation itself, a bare statistical
|
| 280 |
+
topic, "what's new in X", names in lowercase or with a typo, long noisy
|
| 281 |
+
messages carrying two or three requests, and acknowledgements that ask for
|
| 282 |
+
nothing. Each is repeated twice in training, about 6% of it.
|
| 283 |
+
|
| 284 |
+
The base dataset, as published: Each pair is a
|
| 285 |
message somebody could plausibly write and the requests inside it restated
|
| 286 |
plainly, one per line.
|
| 287 |
|
|
|
|
| 359 |
|
| 360 |
## Training
|
| 361 |
|
| 362 |
+
Fine-tuned from [`google/gemma-3-270m`](https://huggingface.co/google/gemma-3-270m) with `mlx_lm lora`, full fine-tune, all
|
| 363 |
+
18 blocks. The released weights are checkpoint 21,000, chosen among the
|
| 364 |
+
run's checkpoints by exact answers on the validation split (301 of 1,077),
|
| 365 |
+
never on the test split or the benches above.
|
| 366 |
|
| 367 |
## Where all of this happened
|
| 368 |
|
|
|
|
| 380 |
| the fine-tune | |
|
| 381 |
|---|---|
|
| 382 |
| method | `mlx_lm lora`, full fine-tune |
|
| 383 |
+
| iterations | 21,276 |
|
| 384 |
+
| tokens seen | 2,327,566 |
|
| 385 |
+
| peak memory | 5.4 GB |
|
| 386 |
+
| speed | about 6 iterations/s |
|
| 387 |
+
| wall clock | 08:27 to 09:30, about an hour |
|
| 388 |
|
| 389 |
Generators and judge ran on that same machine as local llama.cpp servers on
|
| 390 |
loopback. No message here was written by a hosted API, and none was sent to
|
| 391 |
+
one to be judged.
|
|
|
|
| 392 |
|
| 393 |
A model that decides where a question goes does not need a cluster or a
|
| 394 |
month. It needs a narrow job, data built for it, and a bench honest enough
|
model.safetensors
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
size 536222768
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:eb85980247d466cb2b5a6e1b32d40a35f6b0551b968c344a19449656cfda3005
|
| 3 |
size 536222768
|
sft-v19-q8_0.gguf → sft-v22-q8_0.gguf
RENAMED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:58b750b4bba4ed9cf1ea30316f1c5ad131316efaedd56cfd9440b488b2ae88f4
|
| 3 |
+
size 291545056
|