Model reference · open weights
amx-reasoning is an open-weight language model from gdiamos. AxForge deploys and operates it for you on dedicated EU-owned hardware — with the licence handled where one is required.
Available as managed deployment — configured and operated for you on dedicated EU hardware, quoted per deployment.
What it is
| Released by | gdiamos |
|---|---|
| Type | Language models |
| Task | Text gen |
| Parameters (lead) | 7M |
| Runs with | pytorch |
| Released | 2026-09-07 |
| Popularity | 566 downloads / month |
| Licence | Open weights |
About
A causal language model trained end to end on one CPU core --- a single
Intel Emerald Rapids core, bf16 through AMX, OMP_NUM_THREADS=1. 3,315,552
active parameters per token, 7,492,448 stored.
The point of the project is not that a small model runs on a CPU. It is that the architecture is derived from a single-core roofline, that training is confined to the same core, and that at this scale the interesting behaviours show up much earlier in the token budget than we expected.
Paper: Outrageously Small Neural Networks: Emergent Basic Reasoning at
6,616 tok/sec on One Intel AMX Core,
shipped here as paper.pdf. This checkpoint is the model behind its evaluation
table, so the numbers below and the numbers in the paper are the same numbers.
It answers questions about a passage you give it, in one or two words, and it stops. On held-out extractive QA it reaches 18.2% exact match and 23.2% F1, and on DROP specifically 25.0% EM against a 7.5% majority baseline.
That is a weak model by contemporary standards and a surprising one for its size. The paper's framing applies here too: what is interesting is not the absolute score but that a model with 3,315,552 active parameters, trained on one core, does passage-grounded retrieval at all --- and that its remaining failures are specific and nameable rather than general incompetence. It retrieves and compares; it cannot calculate.
AutoModelForCausalLM.from_pretrained will not work: the architecture is
not one transformers knows --- chunked sliding-window attention interleaved
with log-decay linear attention, and a tied readout. The model's
own source ships here under m2r/, unmodified from the repository that
trained it.
hf download gdiamos/amx-reasoning-v1-instruct --local-dir amx-reasoning-v1-instruct
cd amx-reasoning-v1-instruct && pip install -r requirements.txt && python example.py
example.py is the whole thing, and it is short. The
two parts that are not optional:
from m2r.data.templates import EOT, render_prompt
# 1. THE PROMPT FORMAT the model was tuned on, imported rather than copied so
# it cannot drift. It already emits BOS -- do not prepend one.
prompt = render_prompt([f"{{question}}\n\n{{passage}}"], thinking=False)
ids = tok.encode(prompt, add_special_tokens=False).ids
# 2. THE VOCABULARY MASK from generation.json. See "The vocabulary mask" below;
# without it this model answers " ballo" to a fifth of DROP questions.
BAN = torch.tensor(json.loads(open("generation.json").read())["banned_token_ids"])
logits[BAN] = -1e30
next_id = int(logits.argmax()) # greedy: answers are one or two words
Decode greedily and stop on EOT. Sampling is the right call for the base
model and the wrong one here --- this checkpoint was tuned to emit a short span
and halt.
| file | |
|---|---|
model.safetensors | the weights, bf16 |
generation.json | decode settings, and the vocabulary mask described below |
config.json | every architecture field, machine readable |
training_config.yaml | the run's config, and what example.py loads |
tokenizer.json | a tokenizers BPE; Tokenizer.from_file loads it alone |
m2r/ | the model source, imported by example.py |
example.py | load and generate, correctly |
paper.pdf | the write-up, when shipped with this export |
LICENSE | Apache 2.0 |
| d_model | 256 |
| layers | 6 |
| layer types | lin, swa, swa, lin, swa, lin |
| mixers | sliding-window attention (window 256), log-decay linear attention (d_state 32) |
| MLP width | 640 |
| vocabulary | 16384 |
| readout | tied to the embedding |
| parameters | 7,492,448 stored, 3,315,552 active per token |
Attention is confined to document boundaries: a training window packs many documents, and without isolation sliding-window attention reaches into its neighbours while linear attention carries state across the whole window.
The shape is deliberate. One AMX core sustains roughly 2,231 GF/s of bf16 matrix multiply at these dimensions but pays a 1.4--1.5 microsecond floor per GEMM dispatch, so every design choice here is about issuing few large matrix multiplies rather than many small ones.
The token count for this checkpoint is only its last stage. Three runs, each starting from the previous one's weights:
| stage | tokens | what it added |
|---|---|---|
| pretraining | 4,910,000,000 | a base model, well calibrated teacher-forced (top-1 43.4%), that cannot generate: a repetition basin within ~5 free-running tokens |
| instruction tuning | 250,000,000 | stopping. Stop-on-EOT 0% -> 52.5%, Dolly F1 0.3% -> 12.8% |
| QA tuning (this checkpoint) | 250,000,000 | passage-grounded answering and abstention |
About 5.4B tokens in total, at roughly 1,481 tokens per active parameter --- far past compute-optimal, deliberately, because the target is inference cost rather than training cost. Applying the QA stage on top of the instruction-tuned model rather than directly on the base was worth +1.3 EM, +2.2 F1, and 8.7 points less over-abstention.
Held-out extractive QA, greedy decoding, generation.json mask applied. EM and
F1 are over answerable rows only. Over-abstention is refusing when the answer
was present; missed abstention is answering when it was not.
| source | n | EM | F1 | over-abstain | missed abstain |
|---|---|---|---|---|---|
| DROP | 200 | 25.0% | 27.3% | 0.0% | -- |
| SQuAD v2 | 200 | 18.1% | 24.2% | 31.2% | 62.9% |
| Dolly | 79 | 1.3% | 11.1% | 30.4% | -- |
| all | 479 | 18.2% | 23.2% | 16.1% | 62.9% |
Real greedy outputs, two per source, chosen to show a success and the characteristic failure rather than a highlight reel.
DROP --- retrieval and comparison work; arithmetic does not.
Q Which field g
From the published model card. Full card on the HuggingFace links in the sidebar.
Using it via the API
Once AxForge deploys amx-reasoning for you, it answers on the OpenAI-compatible API — the same base URL and keys as every other model. (amx-reasoning below is illustrative; you get the exact model name on deployment.)
$ curl -sS https://api.axforge.ai/v1/chat/completions \
-H "Authorization: Bearer $AXFORGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"amx-reasoning","messages":[{"role":"user","content":"Hello"}]}'
Create an account — your API key is available in the console. 3M free tokens every 30 days with every new account.