Skip to content

About

Two contamination-free tests for small language models: fresh-text bits per byte and the Udgam Probe Suite

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

Repository files navigation

Udgam Evals · Udgam Labs

UDGAM LABS · Evaluation code · Two contamination-free tests for small language models

Udgam Evals

Two small tests for language models of roughly 50M to 400M parameters, and the code to score any Hugging Face causal language model on them. At this size many public benchmarks sit close to chance, and their questions may have leaked into training data. These two avoid both problems:

  • Fresh Text, October 2026: 1,670 English documents written after 1 September 2026 (new Wikipedia articles and arXiv abstracts). The score is bits per byte: how well the model predicts text it cannot have seen. It follows the idea of UncheatableEval (arXiv:2609.27510), which is broader; this set is a narrow companion for small models, with a licence and credit line on every row and confidence intervals for every comparison.
  • Udgam Probe Suite: 2,000 generated questions with one exact answer each, in 7 types (arithmetic, unit conversion, sequences, word problems, comparisons, syllogisms). The score is accuracy.

Each test takes two to five minutes per model on an Apple-silicon Mac.

Fresh Text dataset · Probe Suite dataset · udgamlabs.com

Results

Measured by Udgam Labs on 17 October 2026, Apple-silicon Mac (PyTorch, MPS, float32), with the code in this repository. Fresh text: bits per byte on 1,670 documents, lower is better. Probes: accuracy on 2,000 items, higher is better (chance 32.5%).

Model Parameters Fresh text (bpb) ↓ Probes (%) ↑
SmolLM2-360M 360M 0.853 71.2
Gargi-Base (Udgam Labs) 384M 0.916 69.2
Udgam-384M-Base-4K (Udgam Labs) 384M 0.939 61.9
SmolLM2-135M 135M 0.944 44.4
Falcon-H1-Tiny-90M-Base 90M 0.981 74.4
  • Fresh text: all 10 pairwise gaps are significant (paired bootstrap over documents; 95% intervals ±0.001 to ±0.003). The closest pair, Udgam-384M-Base-4K and SmolLM2-135M, is 0.0049 apart [0.0025, 0.0072]. The runs scored the 1,695 documents of the first build; these values are recomputed from their per-document results for the 1,670 published documents.
  • Probes: 9 of 10 pairs differ significantly (paired bootstrap over items; 95% intervals ±2 to ±3 points). The exception is SmolLM2-360M against Gargi-Base: 1.95 points [−0.35, +4.15].
  • The two tests rank models differently: the smallest model, Falcon-H1-Tiny-90M-Base, predicts fresh text worst but answers the most probe questions correctly.
  • Scores by type and by source are on the dataset pages and in results/results.json.
  • Check: re-running both scorers on the published datasets on 21 October 2026 reproduced SmolLM2-135M's numbers.

Get started

git clone https://github.com/udgamlabs/udgam-evals && cd udgam-evals
pip install -r requirements.txt

python fresh_text/score.py HuggingFaceTB/SmolLM2-135M --out results/runs/SmolLM2-135M.fresh.json
python probes/score.py     HuggingFaceTB/SmolLM2-135M --out results/runs/SmolLM2-135M.probes.json
python compare.py results/runs/SmolLM2-135M.fresh.json results/runs/OTHER-MODEL.fresh.json

Both scorers download their dataset from Hugging Face on first use, pick CUDA, Apple MPS or CPU automatically, and save one record per document or item so that two models can be compared. Useful options: --revision (pin a model commit), --device, --dtype (default float32), --add-bos auto|yes|no, --trust-remote-code, and --data / --items to score a local file.

Tested with Python 3.12, PyTorch 2.14 and Transformers 5.19.

How it works

File What it does
fresh_text/score.py Bits per byte. Each document is scored on its own, starting from the model's BOS token if its tokenizer has one. Longer documents are read with a 2,048-token window that slides by 1,024 tokens, so every token is scored exactly once (the script checks this). Total bits ÷ total UTF-8 bytes, which makes models with different tokenizers comparable.
probes/score.py Accuracy. For each question, the log-probability of each choice after the prompt; the most likely choice is the model's answer.
compare.py Paired bootstrap: resamples the shared documents or items 4,000 times and reports the 95% interval of the difference between two models. If it excludes zero, the gap is unlikely to be luck.
fresh_text/build.py Builds a fresh-text set from the public Wikipedia and arXiv APIs, then re-checks every Wikipedia page and drops pages deleted since or tagged by editors as suspected AI-generated text.
probes/generate.py Generates probe questions. --types core --per 100 --seed 2026 reproduces the published 2,000 items exactly.

Where it falls short

  • Two narrow tests. Bits per byte on encyclopedia and abstract text, plus basic numeric and logical questions, in English. Neither measures chat quality, following instructions, knowledge, code or other languages.
  • Base models in mind. Both tests score raw text likelihood with no chat template. Chat models can be scored the same way, but the numbers say little about how well they converse.
  • Freshness wears off. Once published, the fresh text can enter future training data, and anyone can train on the probe generator's output. Compare only models trained before October 2026, or build a new set (a new month, a new seed).
  • Settings matter. Context length, the BOS token and numeric precision change bits per byte; likelihood scoring can put a model below chance on a question type. Compare models only under the same settings.
  • Probe levels are not a difficulty scale, and one block (unit conversion, level 3) is answered correctly by every model we tested. Report the overall probe score; the dataset page has the per-type details.
  • Small models only so far. We have measured five models between 90M and 384M parameters, two of them our own. We have not checked how either test behaves for much larger models.

More detail is on each dataset page.

Reproduce our numbers

Revisions scored (the weights at each revision are the ones measured on 17 October 2026):

Model Revision
HuggingFaceTB/SmolLM2-360M f8027fd0eaeea54caa13c31d31b9fdc459c38b49
udgamlabs/Gargi-Base f65e9466b21e026b969fa171eb8f6240cd90049b
udgamlabs/Udgam-384M-Base-4K 403f6b9e58049f84dd0433018386beeb92957b65
HuggingFaceTB/SmolLM2-135M 93efa2f097d58c2a74874c7e644dbc9b0cee75a2
tiiuae/Falcon-H1-Tiny-90M-Base 7994372e93b62822ae25f8bfb19f653649cea3a3
python fresh_text/score.py tiiuae/Falcon-H1-Tiny-90M-Base --revision 7994372e93b62822ae25f8bfb19f653649cea3a3 \
    --device mps --out results/runs/Falcon-H1-Tiny-90M-Base.fresh.json

Falcon-H1-Tiny-90M-Base's tokenizer has no BOS token, so it is scored without one.

Licence

The code is Apache-2.0 (see LICENSE). The datasets have their own licences: Fresh Text is CC BY-SA 4.0 (Wikipedia rows) and CC0 1.0 (arXiv rows); the Probe Suite questions are CC BY 4.0.

Citation

@misc{udgamlabs2026evals,
  title        = {Udgam Evals: contamination-free tests for small language models},
  author       = {Prasad, Jitesh K and {Udgam Labs}},
  year         = {2026},
  howpublished = {\url{https://github.com/udgamlabs/udgam-evals}}
}

About Udgam Labs. Udgam Labs is an independent AI research lab. We work from first principles: before we build, we understand why things work, whether we are training a model, fine-tuning one or applying AI to a new problem. Udgam (उद्गम) is Sanskrit for origin. udgamlabs.com

About

Two contamination-free tests for small language models: fresh-text bits per byte and the Udgam Probe Suite

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages