roneneldan/TinyStories
Viewer β’ Updated β’ 2.14M β’ 117k β’ 1.2k
A comprehensive implementation of NanoGPT with Mixture of Experts architecture, trained on the TinyStories dataset. This repository contains both standard NanoGPT and MoE variants with detailed training pipelines and analysis tools.
nano_gpt_model.py)
moe_nano_gpt_model.py)
| Parameter | Value |
|---|---|
| Model Size | 134.6M parameters |
| Layers | 12 |
| Embedding Dimension | 256 |
| Attention Heads | 8 |
| Experts per Layer | 8 |
| Top-K Experts | 2 |
| Block Size | 1080 tokens |
| Vocabulary Size | 2048 |
| Dropout | 0.1 |
roneneldan/TinyStories from Hugging Face<|unknown|>, <|im_start|>, <|im_end|>train_tokenizer.py)pre_map.py)enhanced-moe-134.6M-best.pt - Best validation loss modelenhanced-moe-134.6M-epoch-0.pt - End of epoch 1 checkpointclass NanoGPT(nn.Module):
βββ Token Embeddings (vocab_size Γ n_embed)
βββ Position Embeddings (block_size Γ n_embed)
βββ Transformer Blocks (n_layers)
β βββ Multi-Head Attention
β β βββ Query, Key, Value projections
β β βββ Causal masking
β β βββ Dropout
β βββ Feed-Forward Network
β β βββ Linear(n_embed β 4Γn_embed)
β β βββ ReLU activation
β β βββ Linear(4Γn_embed β n_embed)
β βββ Layer Normalization (Pre-norm)
βββ Language Model Head (n_embed β vocab_size)
class NanoGPTMoE(nn.Module):
βββ Token Embeddings (vocab_size Γ n_embed)
βββ Position Embeddings (block_size Γ n_embed)
βββ Transformer Blocks (n_layers)
β βββ Multi-Head Attention (same as standard)
β βββ Mixture of Experts Layer
β β βββ Noisy Top-K Gating Network
β β β βββ Gate weights (n_embed β n_experts)
β β β βββ Noise weights (n_embed β n_experts)
β β β βββ Top-K selection with softmax
β β βββ Expert Networks (n_experts)
β β βββ Linear(n_embed β 4Γn_embed)
β β βββ ReLU activation
β β βββ Linear(4Γn_embed β n_embed)
β βββ Layer Normalization (Pre-norm)
βββ Language Model Head (n_embed β vocab_size)
from moe_nano_gpt_model import NanoGPTMoE
from tokenizers import Tokenizer
import torch
# Load tokenizer
tokenizer = Tokenizer.from_file("data/TinyStories-tokenizer.json")
# Load trained model
checkpoint = torch.load("checkpoints/enhanced-moe-134.6M-best.pt")
hyperparameters = checkpoint['hyperparameters']
model = NanoGPTMoE(hyperparameters, device="cuda")
model.load_state_dict(checkpoint['model'])
model.eval()
# Generate text
prompt = "Once upon a time"
tokens = tokenizer.encode(prompt).ids
input_ids = torch.tensor([tokens], device="cuda")
with torch.no_grad():
generated = model.generate(input_ids, max_new_tokens=100)
result = tokenizer.decode(generated[0].tolist())
print(result)
python test.py
Features:
# 1. Prepare dataset
python pre_map.py --output-dir data --train-count 30000 --val-count 3000
# 2. Train MoE model
python small_moes_train.py
# 3. Train standard model (alternative)
# python train_standard.py
slms/
βββ π README.md # This comprehensive guide
βββ π§ requirements.txt # Python dependencies
βββ
βββ π€ Models
β βββ nano_gpt_model.py # Standard NanoGPT implementation
β βββ moe_nano_gpt_model.py # MoE NanoGPT implementation
β βββ simple_stories_4m/ # Model configuration
β
βββ ποΈ Training
β βββ small_moes_train.py # MoE training script
β βββ train2.log # Training logs with metrics
β βββ checkpoints/ # Model checkpoints
β βββ enhanced-moe-134.6M-best.pt
β βββ enhanced-moe-134.6M-epoch-0.pt
β
βββ π Data Processing
β βββ train_tokenizer.py # BPE tokenizer training
β βββ pre_map.py # Dataset preprocessing
β βββ data/ # Processed datasets
β βββ TinyStories-tokenizer.json
β βββ hyperparameters.json
β βββ moe-hyperparameters.json
β βββ train/ # Training data
β βββ validation/ # Validation data
β
βββ π§ͺ Testing & Analysis
βββ test.py # Interactive testing & benchmarking
pip install -r requirements.txt
torch - PyTorch frameworktransformers - Hugging Face transformersdatasets - Dataset loading and processingtokenizers - Fast tokenizationmatplotlib - Plotting and visualizationnumpy, pandas - Data manipulationtqdm - Progress barsaccelerate - Training accelerationThis project is licensed under the MIT License - see the LICENSE file for details.
π― Ready to explore the power of Mixture of Experts? Start with python test.py for interactive generation!