v11-tinystories-115m-base

A 115.1M-parameter decoder-only transformer trained from scratch on TinyStories for 16M tokens, using the v11 tokenizer.

This is the base pretrain only: phase 1, no frozen-FFN attention retrain, and no maths mid-training. It writes competent children's-story English and it cannot do arithmetic — it narrates straight past the place a number belongs rather than putting a wrong number there. That is the intended state of this checkpoint, not a defect: it is the starting point for the mid-training experiments in tinystories-train-video.

Loading

Not an AutoModel — TinyModel is a 3-file Gemma-shaped decoder (RMSNorm, RoPE, GQA, gated FFN, tied embeddings), shipped in this repo under tiny_model_v11/.

import json, torch
from huggingface_hub import snapshot_download
from safetensors.torch import load_file
from transformers import AutoTokenizer

path = snapshot_download("chrishayuk/v11-tinystories-115m-base")

import sys; sys.path.insert(0, path)
from tiny_model_v11 import TinyModel

cfg = json.load(open(f"{path}/config.json"))
model = TinyModel(
    vocab_size=cfg["vocab_size"], dim=cfg["dim"], n_layers=cfg["n_layers"],
    ffn_dim=cfg["ffn_dim"], n_heads=cfg["n_heads"], n_kv_heads=cfg["n_kv_heads"],
    max_seq=cfg["max_seq"],
)
model.load_state_dict(load_file(f"{path}/model.safetensors"))
model.eval()

tok = AutoTokenizer.from_pretrained("chrishayuk/v11-tinystories-115m-base")
ids = [tok.convert_tokens_to_ids("<s>")] + tok("Once upon a time", add_special_tokens=False)["input_ids"]
for _ in range(40):
    logits = model(torch.tensor([ids[-cfg["max_seq"]:]]))[0, -1]
    ids.append(int(logits.argmax()))
print(tok.decode(ids))

That exact round-trip — download, build, load, generate — is run against the uploaded files at publish time. It is not an untested snippet.

Architecture

Parameters 115,149,312
Layers 20
Model dim 512
Attention heads 8 (4 KV heads, GQA)
FFN dim 2048
Context 256 tokens
Vocabulary 71,260
Embeddings tied (lm_head.weight is embed.weight)

The embedding table is 36.5M parameters — 32% of the whole model is its vocabulary lookup, which is what a 71k vocabulary costs at this width.

rope_freqs is a complex64 buffer in the state dict. It is derived from dim/n_heads/max_seq and recomputed on construction, so it round-trips but carries no learned information.

Identity

Identity is the content hash, not the Hub revision — re-pushing identical bytes mints a new commit oid, and a README edit does too. Join on these:

model.safetensors sha256 1841e0581574629716b646dacd4e70feaca153a8adc5ecb0b77e0e2ebdf78d9c
tokenizer.json sha256 10dd51100331ab503115db23eee7e8dc3e360e3aed697c8a2e1b12b8f46031ae
Tokenizer repo chrishayuk/v11-tokenizer
Source tinystories-train-video
Source commit fbb5418

The tokenizer sha is the same value this checkpoint's training run wrote into its meta.json as tokenizer_hash, and the same one chrishayuk/v11-tokenizer publishes. A checkpoint driven by a different tokenizer produces fluent nonsense rather than an error, so that join is checked mechanically at publish time, not asserted here.

Training

Corpus roneneldan/TinyStories @ f54c09fd2331…
Tokens 16M
Steps 15,625
Batch × context 4 × 256
Optimiser AdamW, lr 0.0003, weight decay 0.01, grad clip 1.0
LR schedule linear warmup then linear decay to 5%
Seed 42
Precision fp32

The dataset revision is pinned, so the document set is reproducible and held-out text can be shown never to have been trained on.

Capability emergence

emergence.json carries the generations captured at each milestone, plus the loss trace. Greedy, 30 new tokens, same prompts throughout:

Tokens Step First sample continuation
0.00M 0 simple_expressionesauesauesauesauesauesauesauesauesauesauesauesauesauesauesaumarredmarredmarredmarredmarredmar
0.10M 97 ..............................
1.00M 976 , there was a little girl named Lily. She loved to play with her toys and her friends. One day, L
2.00M 1953 , there was a little girl named Lily. She loved to play outside and play with her friends. One day, Li
5.00M 4882 , there was a little girl named Lily. She loved to play outside in the park. One day, she saw a big,
8.00M 7812 , there was a little girl named Lily. She loved to play outside in the sunshine. One day, she saw a big,
12.00M 11718 , there was a little girl named Lily. She loved to play outside in the sun. One day, she saw a big,
16.00M 15625 , there was a little girl named Lily. She loved to play outside in the sun. One day, she saw a big,

Only the final row's weights are published here; the earlier rows are the same run mid-flight.

What this model cannot do

It cannot do arithmetic. Nothing in TinyStories teaches addition, and number words in that corpus are narrative texture rather than quantities — "once upon a time there were two" is an idiom the model learns the way it learns "happily ever after".

The interesting part is how it fails. It does not answer with a wrong number; it carries on telling the story, straight past the place a number belongs.

Its own generation at the final milestone, greedy, from this run:

Lily had three apples. Tom gave her four more. Now Lily has a big piece of paper. She likes the color. Tom likes the color. He likes the

It has also seen 16M tokens, which is not converged. Continued training on more or less anything improves it, so do not read an improvement after mid-training as evidence that the mid-training data helped specifically.

Intended use

Research and teaching on compact language models: mid-training, tool-use / tool-call training, and measuring the difference between memorising a distribution and learning an algorithm. Not intended for any production use, and it has no safety training of any kind.

Provenance

provenance.json records the model and tokenizer hashes, the corpus pin, and the run config. The chuk-datasets catalog holds a content-addressed, bit-reproducible tokenization of the same corpus (tiny-model/v11-rust-tokenized-phase1); these weights came from the pinned HF revision instead, which is reproducible given the seed but not bit-identical. That distinction is recorded rather than glossed.

Downloads last month
52
Safetensors
Model size
0.2B params
Tensor type
C64
·
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Dataset used to train chrishayuk/v11-tinystories-115m-base