File size: 6,241 Bytes
43dee53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
---
license: apache-2.0
language: [en]
tags: [udgamlabs, small-language-model, trained-from-scratch, research-release, checkpoints, training-dynamics]
---

![Laghu-Checkpoints · Udgam Labs](./banner.png)

**UDGAM LABS** · Training checkpoints · 152M parameters, every surviving state

# Laghu-Checkpoints

The raw training states behind [Laghu](https://huggingface.co/udgamlabs/Laghu), a 152M-parameter chat model trained from
scratch for $146 of pretraining compute: model weights, EMA weights and optimiser states from the end of pretraining
and of the 32K stretch, all three supervised fine-tuning runs (1, 2 and 3 passes), the reinforcement-learning run that
failed its gate, and the run logs. Together with the code on GitHub, they let you resume training, re-run the
fine-tuning, or study how the model changed between stages.

**Try it:** [the chat model](https://huggingface.co/udgamlabs/Laghu) · [code on GitHub](https://github.com/udgamlabs/laghu) · [udgamlabs.com/models/laghu](https://udgamlabs.com/models/laghu)

## Quick start

```python
import torch
from huggingface_hub import hf_hub_download

p = hf_hub_download("udgamlabs/Laghu-Checkpoints", "pretrain/step_076294/model_ema_076294.pt")
state = torch.load(p, map_location="cpu", weights_only=True)   # a state dict for nanochat's GPT model
```

These are nanochat files (`torch.save`), not transformers checkpoints. Load them with the training code in
[udgamlabs/laghu](https://github.com/udgamlabs/laghu) (`nanochat/`), or convert one to the transformers format with
`python -m scripts.export_hf --checkpoint-dir <folder> --weights final --out <dir>`. Ready-to-use transformers weights
are in [Laghu](https://huggingface.co/udgamlabs/Laghu), [Laghu-Base](https://huggingface.co/udgamlabs/Laghu-Base) and
[Laghu-Base-32K](https://huggingface.co/udgamlabs/Laghu-Base-32K), and in the `hf/` folders below.

## What is here

| Folder | Stage | Files |
|---|---|---|
| `pretrain/step_076000/` | pretraining, 99.6% | `model_076000.pt` (weights), `ema_076000.pt` (EMA), `optim_076000_rank{0-7}.pt` (one optimiser shard per GPU of the 8-GPU run), `meta_076000.json` |
| `pretrain/step_076294/` | end of pretraining | as above, plus `model_ema_076294.pt` (the EMA weights as a state dict; this is Laghu-Base) |
| `pretrain/logs/`, `pretrain/summary.txt` | | the main run's log (every step's loss, validation every 2,000 steps) |
| `ctx32k/step_001750/`, `ctx32k/step_001900/` | 32K stretch | `model_*.pt`, `optim_*_rank0.pt`, `meta_*.json`; step 1,900 is Laghu-Base-32K and the start of SFT |
| `ctx32k/logs/`, `ctx32k/eval/` | | training log; recall and short-text checks |
| `sft/1-pass/`, `sft/2-passes/`, `sft/3-passes/` | supervised fine-tuning | `ckpt/` (weights and optimiser at the halfway and final steps), `hf/` (transformers export of the final step), `logs/`; 2 passes is the released Laghu |
| `rl-r1-failed/` | reinforcement learning (GRPO + distillation from Gargi), 40 steps | `hf/` export, `eval/`, `logs/`; it failed its pre-registered gate (dev GSM8K 8.6% → 8.2%, bar 11.6%) and is published for study only |

File formats:
- `model_*.pt` and `model_ema_*.pt`: state dicts (the EMA ones in fp32), loadable with `torch.load(..., weights_only=True)`.
- `ema_*.pt`: the EMA as a list of fp32 tensors in `model.parameters()` order, used to resume the EMA.
- `optim_*.pt`: optimiser state dicts (Muon for matrices, Adam for embeddings, output and scalars), loadable with
  `weights_only=True`.
- `meta_*.json`: model config, run settings, data-loader position and validation scores at that step. Measure a
  checkpoint yourself rather than reading scores from its meta file.

## Results

Measured on the exported weights (details on the model cards and in the
[technical report](https://udgamlabs.com/research/laghu)):

| Checkpoint | Bits per byte on new text (lower is better) | Notes |
|---|---|---|
| pretraining step 76,294, EMA (Laghu-Base) | 0.919 | SmolLM2-135M 0.941, Falcon-H1-Tiny-90M-Base 0.979 |
| 32K step 1,900 (Laghu-Base-32K) | 0.921 | hidden-code recall 96-100% up to 16K tokens |
| SFT 1 / 2 / 3 passes | held-out SFT loss 1.724 / 1.784 / 2.036 | 2 passes was picked by a generation-based rule (60.0% judge win rate over 1 pass) |

## Where it falls short

- **Most of the pretraining trajectory is missing.** Checkpoints were saved every 2,000 steps, but the uploader kept
  only the newest two on the main branch, and a storage clean-up on 2026-10-21 deleted the older versions (steps
  2,000-74,000) and about six earlier 32K checkpoints. That was our mistake. Only the late states here survive, so this
  repository cannot show how Laghu learned over the whole run.
- The 32K stretch states have one optimiser shard (one GPU); pretraining states have eight. Resuming on a different GPU
  count needs re-sharding.
- The RL run is a failed experiment, not an improvement.

## How it was trained

Pretraining: 76,294 steps × 524,288 tokens (40.0B token positions) at 2,048 context on 8× A100 80GB, 13.2 hours, $146.26;
Muon; token bags for the first 25% of steps; cool-down data from 80%; EMA from 90% (β 0.998). 32K stretch: 1,900 steps at
32,768 context on one RTX PRO 6000. SFT: 41,467 conversations, sequence 16,384, batch 262,144 tokens. Every setting and
script: [GitHub](https://github.com/udgamlabs/laghu).

## Intended use and limitations

Research on training dynamics, continued pretraining, fine-tuning and reproduction. The weights carry no safety tuning
beyond light SFT data.

## Licence

Apache-2.0. Copyright 2026 Udgam Labs LLP. Training-data credits:
[DATA_LICENSES](https://github.com/udgamlabs/laghu/blob/main/docs/DATA_LICENSES.md).

## Citation

```bibtex
@misc{udgamlabs2026laghu,
  title  = {Laghu: a fully open 152M chat model trained from scratch},
  author = {Prasad, Jitesh K},
  year   = {2026},
  howpublished = {Udgam Labs},
  url    = {https://huggingface.co/udgamlabs/Laghu}
}
```

---

**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](https://udgamlabs.com)