tinystories-slm / README.md
sur950's picture
Upload README.md with huggingface_hub
8443a50 verified
|
Raw
History Blame Contribute Delete
3.78 kB
---
license: mit
language: en
tags:
- gpt
- from-scratch
- tinystories
- small-language-model
- pytorch
datasets:
- roneneldan/TinyStories
pipeline_tag: text-generation
---
# TinyStories SLM
A ~12.4M-parameter decoder-only transformer, **written from scratch** β€” no
`transformers`, no `tokenizers`, no `lightning`. Tokenizer, model, training
loop, and sampler are all hand-written PyTorch. Full source, training logs,
and design writeup: **[github.com/sur950/tinystories-slm](https://github.com/sur950/tinystories-slm)**.
It trains on [TinyStories](https://arxiv.org/abs/2305.07759) β€” Ronen Eldan
and Yuanzhi Li's dataset of GPT-4-generated children's stories β€” and asks how
small a language model can be and still write coherent English.
## Not a `transformers` model
This architecture (RMSNorm, tied embeddings, hand-rolled KV cache) isn't a
`transformers`-compatible class, so `AutoModel.from_pretrained(...)` won't
work here. To actually run it:
```bash
git clone https://github.com/sur950/tinystories-slm.git
cd tinystories-slm
./setup.sh
```
Download `stage2.pt`/`stage3.pt`/`tokenizer.json` from this repo into
`./checkpoints` and `./data` respectively, then:
```bash
python chat.py --stage 2 # base model: plain text continuation, no chat format
python chat.py --stage 3 # instruction-tuned: greetings, "tell me a story about X",
# and a redirect for anything outside TinyStories' domain
```
## Two checkpoints
| file | what it is |
|---|---|
| `stage2.pt` | Base language model. Trained in two passes over the ~560M-token corpus (Chinchilla-sized for this model). No chat format β€” continues whatever text precedes it, same as the original TinyStories models. |
| `stage3.pt` | `stage2.pt` fine-tuned on a small (~4k example) instruction set β€” see `instruct_raw.jsonl` in this repo for the exact data. Responds to greetings, takes "tell me a story about X" requests, and gives a fixed redirect for anything outside the TinyStories domain instead of hallucinating an answer. |
`stage3.pt` is the one to use for anything chat-like β€” **not** the
lower-val-loss checkpoint from the same run (not included here). Val loss on
this fine-tune is a single number blended across three very unevenly sized
categories, so "lowest aggregate val" mostly tracks the largest category
(story requests) and says little about whether the smaller, demo-critical
categories (greetings, redirects) are reliable. Tested directly: the final
checkpoint answered "Hi" correctly on-template ~4/5 times; the lowest-val
checkpoint from partway through the same run only ~2/5. Full writeup in the
GitHub repo's `DEVELOPMENT.md`.
## Architecture
```
vocab 4096 d_model 384 layers 6 heads 6 context 512 tied embeddings
12,391,296 parameters total
```
Byte-level BPE tokenizer, vocab size 4096, fit on this same corpus β€” not the
standard GPT-2 vocabulary, so token IDs from other tokenizers won't map
correctly onto this model.
## Limitations
- English-only, children's-story register β€” no world knowledge, no code, no
reasoning beyond what a simple short story requires.
- `stage3.pt`'s instruction-following is narrow by design: greetings, story
requests within a small set of trained keywords, and off-domain redirects.
It is not a general chatbot.
- 512-token context window.
## Citation
```bibtex
@misc{eldan2023tinystories,
title = {TinyStories: How Small Can Language Models Be and Still
Speak Coherent English?},
author = {Ronen Eldan and Yuanzhi Li},
year = {2023},
eprint = {2305.07759},
archivePrefix = {arXiv},
}
```
Built by [Suresh](https://github.com/sur950). [MIT licensed](https://github.com/sur950/tinystories-slm/blob/main/LICENSE).