Method Run log Sane Labs Support
Pretraining · reading the run log… · see the log

The model that tells you which words to check.

Synth-2 reads a search results page, answers only from it, and underlines the exact span it isn't sure about.

Search results handed to the model
0.50

A mock-up, not a running model. Synth-2 is still in pretraining, so the answers and every u value above are hand-written to show the output format — nothing here was generated. What is real: u is predicted error, not token probability. A model pronounces an invented number as fluently as a true one, so logits only measure certainty about phrasing; the epistemic head is trained to predict the mistake instead, which is why it cannot be bolted onto a finished model afterwards.

A model that reads the results page, answers only from it, says "the sources don't say" when they don't — and shows exactly where it is unsure.

Three claims, and where each stands

Honesty in the weights, not in a system prompt

All three behaviours run off one signal: a scalar u produced at every layer, for every token, from the first step of pretraining.

Stage D1

It doesn't fill gaps

Large assistants finish sentences — RLHF rewards willingness to help, not "that isn't in the sources." Synth-2 trains on the opposite: SQuAD 2.0, plus answerable questions deliberately broken by deleting the paragraph that held the answer.

Every statement carries a citation. No citation, no statement.

Stage D1 / D2

It reads the results page

Not search-engine optimised — search-reading. The model is handed live results and answers from what's in front of it, so its 330M active parameters go into handling text rather than storing facts.

Knowledge lives in the sources. The model's job is to not exceed them.

Stage E

It marks the shaky part

Everyone else reports confidence for a whole answer — one number, usually none at all. Synth-2 carries one d_model → 1 projection on each of its 24 layers — 768 weights apiece, about 18K in total — so u arrives per token and a reader checks one clause instead of re-verifying a paragraph.

The same signal routes compute: how deep to go, whether to wake a second expert, whether to call search.

Target configuration · ARCHITECTURE.md

What is actually being trained

Total
1.23B
Active / token
~330M
Layers
24
d_model
768
Vocabulary
49,152
Experts
12 + 1 shared
Heads Q / KV
12 / 4 GQA
Attention window
1024, every 6th global

Routed experts hold 1104M of the 1.23B and contribute 255M of the active count; the MTP module adds 48M that costs nothing at inference. The whole-to-active ratio is 3.7×. Embeddings are tied, and the vocabulary is a multiple of 128 because the TPU wants it that way.

Stated first, so the rest doesn't read as advertising

What Synth-2 will not do

01
Beat Gemini on answer quality.

330M active parameters against models with hundreds of times more. Long synthesis, rare knowledge, fine language — not this weight class, and no architecture reverses that.

02
Beat anyone on coverage.

Google has an index of the whole web. Synth-2 works with whatever results it is handed.

03
Arrive early.

The budget is thirteen billion tokens and the run is partway through it. The log below is the real state, not a launch countdown.

Protocol

Sources in, cited answer out

The turn markers are tokens in the vocabulary, not string formatting. Reasoning is separated, never shown, and never counts toward attribution.

<|user|>When was Canberra founded?
<|result|>[1] Canberra is the capital of Australia...
         [2] The city was laid out in 1913...
<|assistant|><|think|>[2] states the date outright. [1] has no date.</|think|>
Canberra was laid out in 1913 [2].

Where u comes from

StageTarget for uWhere the label comes from
B, CNormalised entropy of the model's own distribution, detachedThe model itself, free, no annotation
E1 − P(answer is correct)Auto-checking generations against QA references
E"Search needed" flagSame signal: errs often ⇒ call the tool

Not one label is drawn by hand. The head on early layers predicts the final entropy — by layer 5 the model already knows the token will be hard, which is what makes u a control signal rather than a report. Its weight in the loss, λ = 0.05, is still marked a hypothesis in the spec: push it higher and the head starts pulling the representations toward itself and spoiling the language.

Run log · live

Where the run actually is

Every number below is read from the run log stored with this page. Nothing is hard-coded: after each Kaggle session the new measurement is appended and this panel moves.

Current session connecting
Pretraining steps /
Corpus consumed / tokens
Held-out loss
latest measurement
Best so far
 
Trend / 1k steps
 
Expert output
share of FFN, from 1104M params
MFU
 
Checkpoint
 
Held-out loss · every point recorded in the log
Recorded points reading

Every row is one held-out measurement taken at the end of a Kaggle session. The log is a JSON file versioned next to the training code, so a point appears here the moment the session that produced it is pushed — and the chart, the progress bars and the header all recompute from it.

Order of work

Eleven stages, one running

STAGE 0

Infrastructure

Tokenizer, corpus, checkpoints, measurement harness.

done
STAGE A

Ablations

~50M model, configuration chosen by measurement.

done
STAGE B

Pretraining

13B tokens, curriculum 2k → 4k → 8k.

running now
STAGE C

Anneal

Quality pass, and Russian arrives late by design.

queued
STAGE C2

Context

Stretch 8k → 32k, about 2% of the budget.

queued
STAGE D1

Grounded reading

Answer only from sources; refuse without them.

ships claims 1 & 2
STAGE D2

Tools

Call search, read results, re-query when they're poor.

queued
STAGE E

Calibration

u tied to attribution, with no hand-drawn labels.

ships claim 3
STAGE F

Preferences

ORPO.

queued
STAGE G

Identity

The last half hour: it is Synth-2, from Sane Labs.

queued
STAGE H

Inference

Own CUDA engine, MTP speculation, int8.

queued
01 / 11
Two open threads

Both are one measurement from closing

  • The router was under-counting its own load — found and fixed. Expert load was being tallied after tokens had already been dropped for capacity, so an overloaded expert looked healthy and the balancing bias never corrected it. That is what held routed experts to about a fifth of the FFN output despite holding 1104M of the 1.23B parameters. The fix counts by demand instead, and the share now prints itself in every log line — so the next session confirms it for free, with no extra run.
  • Throughput: three suspects eliminated, one left. Attention was cleared by measurement — 256-wide blocks beat all three alternatives, and switching blocking off makes the step 7.3% slower, so splash attention would win nothing. Expert capacity was cleared too: raising it would add 60% to the MoE cost to recover 14% of tokens. The last candidate is Newton–Schulz inside Muon, and the sweep that settles it is already staged — about half an hour.
Acceptance criteria · targets, not results

What would have to be true

The headline number is not accuracy. It is the share of confident errors — how often the system answered firmly and was wrong — because a confident error is the one a reader cannot catch.

MeasurementWhat it showsThreshold
Refusal on unanswerableSQuAD 2.0, questions with no answer in the passage≥ 75%
F1 on answerableWhether caution wrecked the quality≥ 70
AUROC(u, error)Whether u predicts the model's own mistakes≥ 0.75
Attribution accuracyStatements actually supported by the source cited≥ 80%
Risk–coverageAccuracy at 50 / 70 / 90% coveragewhole curve

None of these have been measured — stage E is where they get taken. The thresholds sit deliberately below BERT-large's ~81 F1 and ~78% no-answer on SQuAD 2.0: the same weight class, but Synth-2 does the harder job of generating with citations rather than selecting a span. Alongside them runs a hand-scored benchmark of 100 questions the results page cannot answer, counting one thing — how many times each system invented an answer instead of refusing.

Support

What actually stops a session

Not ambition — storage and quota. The compute is Kaggle's free TPU allowance; everything that has ended a session so far has been the disk under it.

Where the money goes
Hub storage

One checkpoint is 9.3 GB, and the private tier fills after seven. Sessions have been spent wiping repositories instead of training.

9.3 GB / ckpt
Compute past the free tier

Training runs in 9-hour Kaggle sessions on a weekly quota. Paid TPU time is what turns a five-week pretrain into a shorter one.

9 h / session
The evaluation nobody funds

The refusal benchmark is scored by a human, by eye, on 100 questions — the one number that would make the claim checkable.

100 questions
Opens Boosty in a new tab. Support the run
Get in touch

Questions, corrections, or a use for a model that knows when to shut up

If a number on this page looks wrong, say so — the measurements are all reproducible and a correction is worth more than a compliment. Collaboration on grounded QA and calibration is welcome too.

ssanelabs@gmail.com

Nothing here is measured yet.

Stage E is where the numbers get taken. Until then, the honest thing a landing page can show is the run itself.