--- name: nanogpt description: Provides nanoGPT, Karpathy's minimal PyTorch GPT implementation (model.py and train.py), with workflows for training character-level Shakespeare on CPU, reproducing GPT-2 124M on OpenWebText with multi-GPU torchrun, fine-tuning pretrained GPT-2 checkpoints, and training on custom text. Use when learning how GPT and transformer blocks work from scratch. Use when running a small training experiment on CPU or a single GPU. Use when modifying a transformer variant in plain PyTorch. Use when preparing character-level or BPE binary datasets. Use when troubleshooting out-of-memory or slow training in nanoGPT. Not for production or large-scale distributed training; use HuggingFace Transformers or Megatron-LM instead. license: MIT metadata: version: 1.0.0 category: ml-training maintainer: Kalaris Labs tags: Model Architecture, NanoGPT, GPT-2, Educational, Andrej Karpathy, Transformer, Minimalist, From Scratch, Training dependencies: torch, transformers, datasets, tiktoken, wandb --- # nanoGPT - Minimalist GPT Training ## Quick start nanoGPT is a simplified GPT implementation designed for learning and experimentation. **Installation**: ```bash pip install torch numpy transformers datasets tiktoken wandb tqdm ``` **Train on Shakespeare** (CPU-friendly): ```bash # Prepare data python data/shakespeare_char/prepare.py # Train (5 minutes on CPU) python train.py config/train_shakespeare_char.py # Generate text python sample.py --out_dir=out-shakespeare-char ``` **Output**: ``` ROMEO: What say'st thou? Shall I speak, and be a man? JULIET: I am afeard, and yet I'll speak; for thou art One that hath been a man, and yet I know not What thou art. ``` ## Common workflows ### Workflow 1: Character-level Shakespeare **Complete training pipeline**: ```bash # Step 1: Prepare data (creates train.bin, val.bin) python data/shakespeare_char/prepare.py # Step 2: Train small model python train.py config/train_shakespeare_char.py # Step 3: Generate text python sample.py --out_dir=out-shakespeare-char ``` **Config** (`config/train_shakespeare_char.py`): ```python # Model config n_layer = 6 # 6 transformer layers n_head = 6 # 6 attention heads n_embd = 384 # 384-dim embeddings block_size = 256 # 256 char context # Training config batch_size = 64 learning_rate = 1e-3 max_iters = 5000 eval_interval = 500 # Hardware device = 'cpu' # Or 'cuda' compile = False # Set True for PyTorch 2.0 ``` **Training time**: ~5 minutes (CPU), ~1 minute (GPU) ### Workflow 2: Reproduce GPT-2 (124M) **Multi-GPU training on OpenWebText**: ```bash # Step 1: Prepare OpenWebText (takes ~1 hour) python data/openwebtext/prepare.py # Step 2: Train GPT-2 124M with DDP (8 GPUs) torchrun --standalone --nproc_per_node=8 \ train.py config/train_gpt2.py # Step 3: Sample from trained model python sample.py --out_dir=out ``` **Config** (`config/train_gpt2.py`): ```python # GPT-2 (124M) architecture n_layer = 12 n_head = 12 n_embd = 768 block_size = 1024 dropout = 0.0 # Training batch_size = 12 gradient_accumulation_steps = 5 * 8 # Total batch ~0.5M tokens learning_rate = 6e-4 max_iters = 600000 lr_decay_iters = 600000 # System compile = True # PyTorch 2.0 ``` **Training time**: ~4 days (8× A100) ### Workflow 3: Fine-tune pretrained GPT-2 **Start from OpenAI checkpoint**: ```python # In train.py or config init_from = 'gpt2' # Options: gpt2, gpt2-medium, gpt2-large, gpt2-xl # Model loads OpenAI weights automatically python train.py config/finetune_shakespeare.py ``` **Example config** (`config/finetune_shakespeare.py`): ```python # Start from GPT-2 init_from = 'gpt2' # Dataset dataset = 'shakespeare_char' batch_size = 1 block_size = 1024 # Fine-tuning learning_rate = 3e-5 # Lower LR for fine-tuning max_iters = 2000 warmup_iters = 100 # Regularization weight_decay = 1e-1 ``` ### Workflow 4: Custom dataset **Train on your own text**: ```python # data/custom/prepare.py import numpy as np # Load your data with open('my_data.txt', 'r') as f: text = f.read() # Create character mappings chars = sorted(list(set(text))) stoi = {ch: i for i, ch in enumerate(chars)} itos = {i: ch for i, ch in enumerate(chars)} # Tokenize data = np.array([stoi[ch] for ch in text], dtype=np.uint16) # Split train/val n = len(data) train_data = data[:int(n*0.9)] val_data = data[int(n*0.9):] # Save train_data.tofile('data/custom/train.bin') val_data.tofile('data/custom/val.bin') ``` **Train**: ```bash python data/custom/prepare.py python train.py --dataset=custom ``` ## When to use vs alternatives **Use nanoGPT when**: - Learning how GPT works - Experimenting with transformer variants - Teaching/education purposes - Quick prototyping - Limited compute (can run on CPU) **Simplicity advantages**: - **~300 lines**: Entire model in `model.py` - **~300 lines**: Training loop in `train.py` - **Hackable**: Easy to modify - **No abstractions**: Pure PyTorch **Use alternatives instead**: - **HuggingFace Transformers**: Production use, many models - **Megatron-LM**: Large-scale distributed training - **LitGPT**: More architectures, production-ready - **PyTorch Lightning**: Need high-level framework ## Common issues **Issue: CUDA out of memory** Reduce batch size or context length: ```python batch_size = 1 # Reduce from 12 block_size = 512 # Reduce from 1024 gradient_accumulation_steps = 40 # Increase to maintain effective batch ``` **Issue: Training too slow** Enable compilation (PyTorch 2.0+): ```python compile = True # 2× speedup ``` Use mixed precision: ```python dtype = 'bfloat16' # Or 'float16' ``` **Issue: Poor generation quality** Train longer: ```python max_iters = 10000 # Increase from 5000 ``` Lower temperature: ```python # In sample.py temperature = 0.7 # Lower from 1.0 top_k = 200 # Add top-k sampling ``` **Issue: Can't load GPT-2 weights** Install transformers: ```bash pip install transformers ``` Check model name: ```python init_from = 'gpt2' # Valid: gpt2, gpt2-medium, gpt2-large, gpt2-xl ``` ## Advanced topics **Model architecture**: See [references/architecture.md](references/architecture.md) for GPT block structure, multi-head attention, and MLP layers explained simply. **Training loop**: See [references/training.md](references/training.md) for learning rate schedule, gradient accumulation, and distributed data parallel setup. **Data preparation**: See [references/data.md](references/data.md) for tokenization strategies (character-level vs BPE) and binary format details. ## Hardware requirements - **Shakespeare (char-level)**: - CPU: 5 minutes - GPU (T4): 1 minute - VRAM: <1GB - **GPT-2 (124M)**: - 1× A100: ~1 week - 8× A100: ~4 days - VRAM: ~16GB per GPU - **GPT-2 Medium (350M)**: - 8× A100: ~2 weeks - VRAM: ~40GB per GPU **Performance**: - With `compile=True`: 2× speedup - With `dtype=bfloat16`: 50% memory reduction ## Resources - GitHub: https://github.com/karpathy/nanoGPT ⭐ 48,000+ - Video: "Let's build GPT" by Andrej Karpathy - Paper: "Attention is All You Need" (Vaswani et al.) - OpenWebText: https://huggingface.co/datasets/Skylion007/openwebtext - Educational: Best for understanding transformers from scratch ## Agent operating procedure 1. **Check the environment.** Check GPU type, memory and driver/CUDA versions (`nvidia-smi`), framework versions, and dataset location and size. 2. **Pin down the inputs.** Confirm formats, identifiers and parameters from the data or the user. Ask rather than guess any value that changes the result. 3. **Run a small version first.** Do a smoke run: tiny model or subset, few steps, and confirm loss decreases and checkpoints save. 4. **Execute the full task** using the instructions and references above. 5. **Validate the result.** Track metrics on held-out data, compare against a baseline, and record seeds, configs and hardware. 6. **Report.** State what was run (versions, commands, parameters), what was checked, and what is still uncertain. | If this happens | Do this | |---|---| | CUDA out-of-memory | Reduce batch size, enable gradient accumulation/checkpointing or mixed precision, or shard the model. | | Loss is NaN or diverges | Lower the learning rate, check data for invalid values, and enable gradient clipping. | | A function, flag or endpoint in these instructions is missing in the installed version | Check the installed version's own documentation (`help()`, `--help`, official docs), adapt, and tell the user. Never invent an API. | | A required input, identifier or parameter is ambiguous | Ask the user, or state the assumption explicitly before running. | **Integrity rules** - Never fabricate results, parameters, identifiers, citations or statistics. If something cannot be run or verified, say so plainly. - Never claim training results without logs; estimate compute cost before launching large jobs. - Treat version-specific details here as possibly outdated: confirm them against the official documentation for the installed version. - Ask before actions that cost money, consume shared GPUs or cloud quota, touch personal or patient data, or cannot be undone. ## Related skills - `ray-data`: Scalable data processing for ML workloads. - `optimizing-attention-flash`: Enables Flash Attention for transformer models using PyTorch native scaled_dot_product_attention (PyTorch 2.2+) or the flash-attn library,… - `huggingface-accelerate`: Wraps existing PyTorch training scripts with HuggingFace Accelerate (Accelerator class, accelerate config, accelerate launch) so the same c…