Blog
Release · 29 September 2026 · 3 min read

Udgam English 125M, a small model that missed its target

We trained a 125.8M-parameter English model from random weights for about US$17 of cloud compute. It missed its performance target, and we released it anyway with every number.

How useful can a small English language model be if you train it from nothing, on a budget you could put on a credit card? That was the question behind Udgam English 125M, our first model trained entirely from scratch.

The short answer from this first attempt: not useful enough. The model missed the performance target we set before training. We are releasing it anyway — base and conversation variants, the tokenizer, the training recipe and the full results — because a measured negative result is still a result, and others can inspect and improve on the work.

What we built

  • 125,829,314 parameters, a 12-layer GPT built on a pinned version of nanochat, with a 2,048-token context.
  • From random weights. No pretrained weights, embeddings or vocabulary from another model; even the 16,384-token tokenizer was fitted on our own training text.
  • Two variants: a base model for text completion, and a conversation variant tuned on one pass of OASST2.

Training, and what it cost

Pretraining saw about 2.03 billion prediction targets from a mix of FineWeb-Edu (60%), synthetic FinePhrase tables and tutorials (15% each) and a Nemotron fact-seeking subset (10%). Conversation tuning added 7,237 OASST2 examples. Everything ran on a single H100 in BF16.

We set a project ceiling of US99∗∗.Grosscloudusagecametoabout∗∗US99**. Gross cloud usage came to about **US16.58 at our last observation, paid entirely from credits. As the model card puts it, "zero new cash is not zero training cost" — and that figure leaves out the Mac, the internet connection and engineering time.

Results

We scored every model on the same frozen 2,500-question zero-shot suite: 500 items each from ARC-Challenge, HellaSwag, PIQA, BoolQ and WinoGrande, averaged per task. These are our protocol's numbers, not official leaderboard scores.

ModelARC-CHellaSwagPIQABoolQWinoGrandeAverage
Udgam English 125M · base25.8033.6058.6059.6051.0045.72
Udgam English 125M · conversation26.4034.2058.4061.8051.2046.40
SmolLM2-135M30.0044.2069.6060.4054.6051.76
SmolLM2-360M35.2057.6072.2061.4060.6057.40
Sarvam-151.2067.6075.2083.4063.0068.08

The gap to Sarvam-1, a model about twenty times larger, is roughly 22 points. On 24 strict automatic instruction-following checks, both variants scored zero; some answers were relevant but in the wrong format.

One number looks good and should not be taken at face value: on our GPU the base model decoded 184 tokens a second against 85 for SmolLM2-135M. But our path used a faster attention kernel than the baselines, so this is not a portable speed claim, and our packages are also larger on disk.

What we take from it

Two billion training targets and a tokenizer fitted from scratch were not enough to reach a small open model of the same size. The value of this release is the record: the exact artifacts, the costs, the evaluation suite and the miss, all in one place, so the next experiment — ours or anyone's — starts from measured ground rather than a guess.

Try it

The weights are in the Hugging Face snapshot and the v0.1.0 release on GitHub. From the complete distribution, it runs offline on a CPU:

shasum -a 256 -c SHA256SUMS
python -m pip install -r models/base/requirements.txt
python models/base/infer.py --device cpu --prompt "A useful way to check an explanation is" --max-new-tokens 64

It is native PyTorch only — no Transformers, GGUF or mobile builds — and English only. Treat it as a research artifact, not an assistant: its answers may be incorrect, biased or inappropriate. Code, tokenizer and weights are MIT-licensed; the training datasets keep their own terms.