Downloads · 30 days
15
5% of all-time downloads
adrahmana/NanoFable-28M-fp16
NanoFable-28M-fp16 is a text generation model from adrahmana. Use it when you need the model to write or continue text. It is set up for nanofable. The card lists the license as mit.
A 27.8M-parameter decoder-only transformer trained on TinyStories with fp16 weights — one point on the coherence-vs-bytes frontier study (spec).
Downloads · 30 days
15
5% of all-time downloads
All-time downloads
324
Public
Parameters
27.8M
222 MB on disk
Likes
0
Public
Click a slice to open those files.
.tpack111 MB · 50%
From the Hugging Face model README
A 27.8M-parameter decoder-only transformer trained on TinyStories with fp16 weights — one point on the coherence-vs-bytes frontier study (spec).
| Parameters | 27,795,968 |
| Total bytes (packed, spec §6) | 55,574,528 (53.00 MiB) |
| Layers / width / heads | 8 / 512 / 8 |
| Context | 512 |
| Vocab | 4,096 (custom BPE, ByteLevel) |
| In-block linear weights | fp16 (2 bytes/weight) |
| Embeddings / LM head (tied) | fp16 |
| Seeds | 0, 1 (both published, see below) |
| Training tokens | 500M |
TinyStories, single GPU (T4), fp16 autocast. AdamW (β 0.9/0.95, wd 0.1), peak LR 3e-4, cosine to 10% after 3% warmup, 65,536 tokens/step (~7,630 steps). All hyperparameters frozen across the 16-run sweep (frozen config).
Val perplexity on held-out TinyStories + LLM-judge coherence (Qwen2.5-7B-Instruct, frozen rubric, 200 frozen prefixes, greedy decoding; instrument calibration in calibration.md — reference anchor: TinyStories-8M at 4.232).
Weights ship as model.safetensors (fp16). Ternary in-block linears are stored
dequantized — scale * {-1,0,+1} already materialized in fp16 — so both arms load
into the same fp16 model class.
from safetensors.torch import load_file
from nanofable.config import TIERS
from nanofable.model import build_model
from nanofable.tokenizer import load_tokenizer
from nanofable.generate import generate
model = build_model(TIERS["large"], "fp16")
model.load_state_dict(load_file("model.safetensors"), strict=False) # lm_head re-ties to tok_emb
model.eval()
tok = load_tokenizer("tokenizer.json")
print(generate(model, tok, "Once upon a time", temperature=1e-4, top_k=0))
model.safetensors # seed 1 — the weights this card describes
config.json
model.tpack # packed browser payload (what the demo site streams)
meta.json eval.json metrics.csv
tokenizer.json # 4,096-vocab custom BPE
seed0/ # second training replica, same files
Both training replicas are published. The root weights are seed 1, selected by judge score. Do not read that as a quality ranking — the two seeds are statistically indistinguishable: their 95% judge CIs overlap, and val PPL disagrees with judge score on which seed leads in most configs of this sweep. The choice of which sits at the root is effectively arbitrary.
| seed 0 | seed 1 (root) | |
|---|---|---|
| Val PPL | 5.94 | 5.39 |
| Judge (0-5, n=200) | 3.103 [2.97, 3.23] | 3.108 [2.98, 3.24] |
model.tpack is the packed browser payload (pack format v1), fp16 throughout. This is
the artifact the byte accounting above refers to, and the one the demo site streams for
in-browser inference. It carries the same weights as model.safetensors, in the container
the browser runtime reads.
Training checkpoints (optimizer state, fp32 latent weights) are not published here; they live in the source repo.
Children's-story English only (TinyStories distribution) — not a general language model. 512-token context. Research artifact of a controlled precision study; not safety-tuned.