--|--------|--------|-------|---------|-------------| | Shakespeare char | ~10M | 6 | 6 | 384 | 1 GPU, 3 min | | GPT-2 small | 124M | 12 | 12 | 768 | 8×A100, 4 days | | GPT-2 medium | 350M | 24 | 16 | 1024 | Modify config | | GPT-2 large | 774M | 36 | 20 | 1280 | Modify config | | GPT-2 XL | 1.5B | 48 | 25 | 1600 | Multi-node |
10. Evaluation and Benchmarks
# Benchmark training speed
python train.py config/train_gpt2.py --eval_only
# Loss tracking
# nanoGPT-reported GPT-2 (124M) on OpenWebText: val loss 2.85
# OpenAI GPT-2 (124M) on WebText: val loss ~3.11
# (domain gap between WebText and OpenWebText accounts for difference)
# Custom benchmarks
python train.py config/train_shakespeare_char.py --eval_iters=200
Key Patterns
- Configs are Python files, not YAML — maximum flexibility, easy to diff
init_from='scratch'|'resume'|'gpt2*'— switch between training modes- Always use
--compile=Trueon GPU for ~2x speedup - Gradient accumulation with
gradient_accumulation_stepsemulates larger batch sizes - Data is raw uint16 .bin files — tokenized once, loaded via memmap
- Meta device init for large models — doesn't allocate until needed
- Weight tying between
wte(embedding) andlm_head— standard GPT practice - Use
torchrunfor multi-GPU — notpython -m torch.distributed.launch