Showing preview only (355K chars total). Download the full file or copy to clipboard to get everything.
Repository: karpathy/nanoGPT
Branch: master
Commit: 3adf61e154c3
Files: 24
Total size: 342.6 KB
Directory structure:
gitextract_7o2mahdo/
├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── bench.py
├── config/
│ ├── eval_gpt2.py
│ ├── eval_gpt2_large.py
│ ├── eval_gpt2_medium.py
│ ├── eval_gpt2_xl.py
│ ├── finetune_shakespeare.py
│ ├── train_gpt2.py
│ └── train_shakespeare_char.py
├── configurator.py
├── data/
│ ├── openwebtext/
│ │ ├── prepare.py
│ │ └── readme.md
│ ├── shakespeare/
│ │ ├── prepare.py
│ │ └── readme.md
│ └── shakespeare_char/
│ ├── prepare.py
│ └── readme.md
├── model.py
├── sample.py
├── scaling_laws.ipynb
├── train.py
└── transformer_sizing.ipynb
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
# Override jupyter in Github language stats for more accurate estimate of repo code languages
# reference: https://github.com/github/linguist/blob/master/docs/overrides.md#generated-code
*.ipynb linguist-generated
================================================
FILE: .gitignore
================================================
.DS_Store
.idea
.ipynb_checkpoints/
.vscode
__pycache__/
*.bin
*.pkl
*.pt
*.pyc
input.txt
env/
venv/
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2022 Andrej Karpathy
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# nanoGPT

---
**Update Nov 2025** nanoGPT has a new and improved cousin called [nanochat](https://github.com/karpathy/nanochat). It is very likely you meant to use/find nanochat instead. nanoGPT (this repo) is now very old and deprecated but I will leave it up for posterity.
---
The simplest, fastest repository for training/finetuning medium-sized GPTs. It is a rewrite of [minGPT](https://github.com/karpathy/minGPT) that prioritizes teeth over education. Still under active development, but currently the file `train.py` reproduces GPT-2 (124M) on OpenWebText, running on a single 8XA100 40GB node in about 4 days of training. The code itself is plain and readable: `train.py` is a ~300-line boilerplate training loop and `model.py` a ~300-line GPT model definition, which can optionally load the GPT-2 weights from OpenAI. That's it.

Because the code is so simple, it is very easy to hack to your needs, train new models from scratch, or finetune pretrained checkpoints (e.g. biggest one currently available as a starting point would be the GPT-2 1.3B model from OpenAI).
## install
```
pip install torch numpy transformers datasets tiktoken wandb tqdm
```
Dependencies:
- [pytorch](https://pytorch.org) <3
- [numpy](https://numpy.org/install/) <3
- `transformers` for huggingface transformers <3 (to load GPT-2 checkpoints)
- `datasets` for huggingface datasets <3 (if you want to download + preprocess OpenWebText)
- `tiktoken` for OpenAI's fast BPE code <3
- `wandb` for optional logging <3
- `tqdm` for progress bars <3
## quick start
If you are not a deep learning professional and you just want to feel the magic and get your feet wet, the fastest way to get started is to train a character-level GPT on the works of Shakespeare. First, we download it as a single (1MB) file and turn it from raw text into one large stream of integers:
```sh
python data/shakespeare_char/prepare.py
```
This creates a `train.bin` and `val.bin` in that data directory. Now it is time to train your GPT. The size of it very much depends on the computational resources of your system:
**I have a GPU**. Great, we can quickly train a baby GPT with the settings provided in the [config/train_shakespeare_char.py](config/train_shakespeare_char.py) config file:
```sh
python train.py config/train_shakespeare_char.py
```
If you peek inside it, you'll see that we're training a GPT with a context size of up to 256 characters, 384 feature channels, and it is a 6-layer Transformer with 6 heads in each layer. On one A100 GPU this training run takes about 3 minutes and the best validation loss is 1.4697. Based on the configuration, the model checkpoints are being written into the `--out_dir` directory `out-shakespeare-char`. So once the training finishes we can sample from the best model by pointing the sampling script at this directory:
```sh
python sample.py --out_dir=out-shakespeare-char
```
This generates a few samples, for example:
```
ANGELO:
And cowards it be strawn to my bed,
And thrust the gates of my threats,
Because he that ale away, and hang'd
An one with him.
DUKE VINCENTIO:
I thank your eyes against it.
DUKE VINCENTIO:
Then will answer him to save the malm:
And what have you tyrannous shall do this?
DUKE VINCENTIO:
If you have done evils of all disposition
To end his power, the day of thrust for a common men
That I leave, to fight with over-liking
Hasting in a roseman.
```
lol `¯\_(ツ)_/¯`. Not bad for a character-level model after 3 minutes of training on a GPU. Better results are quite likely obtainable by instead finetuning a pretrained GPT-2 model on this dataset (see finetuning section later).
**I only have a macbook** (or other cheap computer). No worries, we can still train a GPT but we want to dial things down a notch. I recommend getting the bleeding edge PyTorch nightly ([select it here](https://pytorch.org/get-started/locally/) when installing) as it is currently quite likely to make your code more efficient. But even without it, a simple train run could look as follows:
```sh
python train.py config/train_shakespeare_char.py --device=cpu --compile=False --eval_iters=20 --log_interval=1 --block_size=64 --batch_size=12 --n_layer=4 --n_head=4 --n_embd=128 --max_iters=2000 --lr_decay_iters=2000 --dropout=0.0
```
Here, since we are running on CPU instead of GPU we must set both `--device=cpu` and also turn off PyTorch 2.0 compile with `--compile=False`. Then when we evaluate we get a bit more noisy but faster estimate (`--eval_iters=20`, down from 200), our context size is only 64 characters instead of 256, and the batch size only 12 examples per iteration, not 64. We'll also use a much smaller Transformer (4 layers, 4 heads, 128 embedding size), and decrease the number of iterations to 2000 (and correspondingly usually decay the learning rate to around max_iters with `--lr_decay_iters`). Because our network is so small we also ease down on regularization (`--dropout=0.0`). This still runs in about ~3 minutes, but gets us a loss of only 1.88 and therefore also worse samples, but it's still good fun:
```sh
python sample.py --out_dir=out-shakespeare-char --device=cpu
```
Generates samples like this:
```
GLEORKEN VINGHARD III:
Whell's the couse, the came light gacks,
And the for mought you in Aut fries the not high shee
bot thou the sought bechive in that to doth groan you,
No relving thee post mose the wear
```
Not bad for ~3 minutes on a CPU, for a hint of the right character gestalt. If you're willing to wait longer, feel free to tune the hyperparameters, increase the size of the network, the context length (`--block_size`), the length of training, etc.
Finally, on Apple Silicon Macbooks and with a recent PyTorch version make sure to add `--device=mps` (short for "Metal Performance Shaders"); PyTorch then uses the on-chip GPU that can *significantly* accelerate training (2-3X) and allow you to use larger networks. See [Issue 28](https://github.com/karpathy/nanoGPT/issues/28) for more.
## reproducing GPT-2
A more serious deep learning professional may be more interested in reproducing GPT-2 results. So here we go - we first tokenize the dataset, in this case the [OpenWebText](https://openwebtext2.readthedocs.io/en/latest/), an open reproduction of OpenAI's (private) WebText:
```sh
python data/openwebtext/prepare.py
```
This downloads and tokenizes the [OpenWebText](https://huggingface.co/datasets/openwebtext) dataset. It will create a `train.bin` and `val.bin` which holds the GPT2 BPE token ids in one sequence, stored as raw uint16 bytes. Then we're ready to kick off training. To reproduce GPT-2 (124M) you'll want at least an 8X A100 40GB node and run:
```sh
torchrun --standalone --nproc_per_node=8 train.py config/train_gpt2.py
```
This will run for about 4 days using PyTorch Distributed Data Parallel (DDP) and go down to loss of ~2.85. Now, a GPT-2 model just evaluated on OWT gets a val loss of about 3.11, but if you finetune it it will come down to ~2.85 territory (due to an apparent domain gap), making the two models ~match.
If you're in a cluster environment and you are blessed with multiple GPU nodes you can make GPU go brrrr e.g. across 2 nodes like:
```sh
# Run on the first (master) node with example IP 123.456.123.456:
torchrun --nproc_per_node=8 --nnodes=2 --node_rank=0 --master_addr=123.456.123.456 --master_port=1234 train.py
# Run on the worker node:
torchrun --nproc_per_node=8 --nnodes=2 --node_rank=1 --master_addr=123.456.123.456 --master_port=1234 train.py
```
It is a good idea to benchmark your interconnect (e.g. iperf3). In particular, if you don't have Infiniband then also prepend `NCCL_IB_DISABLE=1` to the above launches. Your multinode training will work, but most likely _crawl_. By default checkpoints are periodically written to the `--out_dir`. We can sample from the model by simply `python sample.py`.
Finally, to train on a single GPU simply run the `python train.py` script. Have a look at all of its args, the script tries to be very readable, hackable and transparent. You'll most likely want to tune a number of those variables depending on your needs.
## baselines
OpenAI GPT-2 checkpoints allow us to get some baselines in place for openwebtext. We can get the numbers as follows:
```sh
$ python train.py config/eval_gpt2.py
$ python train.py config/eval_gpt2_medium.py
$ python train.py config/eval_gpt2_large.py
$ python train.py config/eval_gpt2_xl.py
```
and observe the following losses on train and val:
| model | params | train loss | val loss |
| ------| ------ | ---------- | -------- |
| gpt2 | 124M | 3.11 | 3.12 |
| gpt2-medium | 350M | 2.85 | 2.84 |
| gpt2-large | 774M | 2.66 | 2.67 |
| gpt2-xl | 1558M | 2.56 | 2.54 |
However, we have to note that GPT-2 was trained on (closed, never released) WebText, while OpenWebText is just a best-effort open reproduction of this dataset. This means there is a dataset domain gap. Indeed, taking the GPT-2 (124M) checkpoint and finetuning on OWT directly for a while reaches loss down to ~2.85. This then becomes the more appropriate baseline w.r.t. reproduction.
## finetuning
Finetuning is no different than training, we just make sure to initialize from a pretrained model and train with a smaller learning rate. For an example of how to finetune a GPT on new text go to `data/shakespeare` and run `prepare.py` to download the tiny shakespeare dataset and render it into a `train.bin` and `val.bin`, using the OpenAI BPE tokenizer from GPT-2. Unlike OpenWebText this will run in seconds. Finetuning can take very little time, e.g. on a single GPU just a few minutes. Run an example finetuning like:
```sh
python train.py config/finetune_shakespeare.py
```
This will load the config parameter overrides in `config/finetune_shakespeare.py` (I didn't tune them much though). Basically, we initialize from a GPT2 checkpoint with `init_from` and train as normal, except shorter and with a small learning rate. If you're running out of memory try decreasing the model size (they are `{'gpt2', 'gpt2-medium', 'gpt2-large', 'gpt2-xl'}`) or possibly decreasing the `block_size` (context length). The best checkpoint (lowest validation loss) will be in the `out_dir` directory, e.g. in `out-shakespeare` by default, per the config file. You can then run the code in `sample.py --out_dir=out-shakespeare`:
```
THEODORE:
Thou shalt sell me to the highest bidder: if I die,
I sell thee to the first; if I go mad,
I sell thee to the second; if I
lie, I sell thee to the third; if I slay,
I sell thee to the fourth: so buy or sell,
I tell thee again, thou shalt not sell my
possession.
JULIET:
And if thou steal, thou shalt not sell thyself.
THEODORE:
I do not steal; I sell the stolen goods.
THEODORE:
Thou know'st not what thou sell'st; thou, a woman,
Thou art ever a victim, a thing of no worth:
Thou hast no right, no right, but to be sold.
```
Whoa there, GPT, entering some dark place over there. I didn't really tune the hyperparameters in the config too much, feel free to try!
## sampling / inference
Use the script `sample.py` to sample either from pre-trained GPT-2 models released by OpenAI, or from a model you trained yourself. For example, here is a way to sample from the largest available `gpt2-xl` model:
```sh
python sample.py \
--init_from=gpt2-xl \
--start="What is the answer to life, the universe, and everything?" \
--num_samples=5 --max_new_tokens=100
```
If you'd like to sample from a model you trained, use the `--out_dir` to point the code appropriately. You can also prompt the model with some text from a file, e.g. ```python sample.py --start=FILE:prompt.txt```.
## efficiency notes
For simple model benchmarking and profiling, `bench.py` might be useful. It's identical to what happens in the meat of the training loop of `train.py`, but omits much of the other complexities.
Note that the code by default uses [PyTorch 2.0](https://pytorch.org/get-started/pytorch-2.0/). At the time of writing (Dec 29, 2022) this makes `torch.compile()` available in the nightly release. The improvement from the one line of code is noticeable, e.g. cutting down iteration time from ~250ms / iter to 135ms / iter. Nice work PyTorch team!
## todos
- Investigate and add FSDP instead of DDP
- Eval zero-shot perplexities on standard evals (e.g. LAMBADA? HELM? etc.)
- Finetune the finetuning script, I think the hyperparams are not great
- Schedule for linear batch size increase during training
- Incorporate other embeddings (rotary, alibi)
- Separate out the optim buffers from model params in checkpoints I think
- Additional logging around network health (e.g. gradient clip events, magnitudes)
- Few more investigations around better init etc.
## troubleshooting
Note that by default this repo uses PyTorch 2.0 (i.e. `torch.compile`). This is fairly new and experimental, and not yet available on all platforms (e.g. Windows). If you're running into related error messages try to disable this by adding `--compile=False` flag. This will slow down the code but at least it will run.
For some context on this repository, GPT, and language modeling it might be helpful to watch my [Zero To Hero series](https://karpathy.ai/zero-to-hero.html). Specifically, the [GPT video](https://www.youtube.com/watch?v=kCc8FmEb1nY) is popular if you have some prior language modeling context.
For more questions/discussions feel free to stop by **#nanoGPT** on Discord:
[](https://discord.gg/3zy8kqD9Cp)
## acknowledgements
All nanoGPT experiments are powered by GPUs on [Lambda labs](https://lambdalabs.com), my favorite Cloud GPU provider. Thank you Lambda labs for sponsoring nanoGPT!
================================================
FILE: bench.py
================================================
"""
A much shorter version of train.py for benchmarking
"""
import os
from contextlib import nullcontext
import numpy as np
import time
import torch
from model import GPTConfig, GPT
# -----------------------------------------------------------------------------
batch_size = 12
block_size = 1024
bias = False
real_data = True
seed = 1337
device = 'cuda' # examples: 'cpu', 'cuda', 'cuda:0', 'cuda:1', etc.
dtype = 'bfloat16' if torch.cuda.is_available() and torch.cuda.is_bf16_supported() else 'float16' # 'float32' or 'bfloat16' or 'float16'
compile = True # use PyTorch 2.0 to compile the model to be faster
profile = False # use pytorch profiler, or just simple benchmarking?
exec(open('configurator.py').read()) # overrides from command line or config file
# -----------------------------------------------------------------------------
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.backends.cuda.matmul.allow_tf32 = True # allow tf32 on matmul
torch.backends.cudnn.allow_tf32 = True # allow tf32 on cudnn
device_type = 'cuda' if 'cuda' in device else 'cpu' # for later use in torch.autocast
ptdtype = {'float32': torch.float32, 'bfloat16': torch.bfloat16, 'float16': torch.float16}[dtype]
ctx = nullcontext() if device_type == 'cpu' else torch.amp.autocast(device_type=device_type, dtype=ptdtype)
# data loading init
if real_data:
dataset = 'openwebtext'
data_dir = os.path.join('data', dataset)
train_data = np.memmap(os.path.join(data_dir, 'train.bin'), dtype=np.uint16, mode='r')
def get_batch(split):
data = train_data # note ignore split in benchmarking script
ix = torch.randint(len(data) - block_size, (batch_size,))
x = torch.stack([torch.from_numpy((data[i:i+block_size]).astype(np.int64)) for i in ix])
y = torch.stack([torch.from_numpy((data[i+1:i+1+block_size]).astype(np.int64)) for i in ix])
x, y = x.pin_memory().to(device, non_blocking=True), y.pin_memory().to(device, non_blocking=True)
return x, y
else:
# alternatively, if fixed data is desired to not care about data loading
x = torch.randint(50304, (batch_size, block_size), device=device)
y = torch.randint(50304, (batch_size, block_size), device=device)
get_batch = lambda split: (x, y)
# model init
gptconf = GPTConfig(
block_size = block_size, # how far back does the model look? i.e. context size
n_layer = 12, n_head = 12, n_embd = 768, # size of the model
dropout = 0, # for determinism
bias = bias,
)
model = GPT(gptconf)
model.to(device)
optimizer = model.configure_optimizers(weight_decay=1e-2, learning_rate=1e-4, betas=(0.9, 0.95), device_type=device_type)
if compile:
print("Compiling model...")
model = torch.compile(model) # pytorch 2.0
if profile:
# useful docs on pytorch profiler:
# - tutorial https://pytorch.org/tutorials/intermediate/tensorboard_profiler_tutorial.html
# - api https://pytorch.org/docs/stable/profiler.html#torch.profiler.profile
wait, warmup, active = 5, 5, 5
num_steps = wait + warmup + active
with torch.profiler.profile(
activities=[torch.profiler.ProfilerActivity.CPU, torch.profiler.ProfilerActivity.CUDA],
schedule=torch.profiler.schedule(wait=wait, warmup=warmup, active=active, repeat=1),
on_trace_ready=torch.profiler.tensorboard_trace_handler('./bench_log'),
record_shapes=False,
profile_memory=False,
with_stack=False, # incurs an additional overhead, disable if not needed
with_flops=True,
with_modules=False, # only for torchscript models atm
) as prof:
X, Y = get_batch('train')
for k in range(num_steps):
with ctx:
logits, loss = model(X, Y)
X, Y = get_batch('train')
optimizer.zero_grad(set_to_none=True)
loss.backward()
optimizer.step()
lossf = loss.item()
print(f"{k}/{num_steps} loss: {lossf:.4f}")
prof.step() # notify the profiler at end of each step
else:
# simple benchmarking
torch.cuda.synchronize()
for stage, num_steps in enumerate([10, 20]): # burnin, then benchmark
t0 = time.time()
X, Y = get_batch('train')
for k in range(num_steps):
with ctx:
logits, loss = model(X, Y)
X, Y = get_batch('train')
optimizer.zero_grad(set_to_none=True)
loss.backward()
optimizer.step()
lossf = loss.item()
print(f"{k}/{num_steps} loss: {lossf:.4f}")
torch.cuda.synchronize()
t1 = time.time()
dt = t1-t0
mfu = model.estimate_mfu(batch_size * 1 * num_steps, dt)
if stage == 1:
print(f"time per iteration: {dt/num_steps*1000:.4f}ms, MFU: {mfu*100:.2f}%")
================================================
FILE: config/eval_gpt2.py
================================================
# evaluate the base gpt2
# n_layer=12, n_head=12, n_embd=768
# 124M parameters
batch_size = 8
eval_iters = 500 # use more iterations to get good estimate
eval_only = True
wandb_log = False
init_from = 'gpt2'
================================================
FILE: config/eval_gpt2_large.py
================================================
# evaluate the base gpt2
# n_layer=36, n_head=20, n_embd=1280
# 774M parameters
batch_size = 8
eval_iters = 500 # use more iterations to get good estimate
eval_only = True
wandb_log = False
init_from = 'gpt2-large'
================================================
FILE: config/eval_gpt2_medium.py
================================================
# evaluate the base gpt2
# n_layer=24, n_head=16, n_embd=1024
# 350M parameters
batch_size = 8
eval_iters = 500 # use more iterations to get good estimate
eval_only = True
wandb_log = False
init_from = 'gpt2-medium'
================================================
FILE: config/eval_gpt2_xl.py
================================================
# evaluate the base gpt2
# n_layer=48, n_head=25, n_embd=1600
# 1558M parameters
batch_size = 8
eval_iters = 500 # use more iterations to get good estimate
eval_only = True
wandb_log = False
init_from = 'gpt2-xl'
================================================
FILE: config/finetune_shakespeare.py
================================================
import time
out_dir = 'out-shakespeare'
eval_interval = 5
eval_iters = 40
wandb_log = False # feel free to turn on
wandb_project = 'shakespeare'
wandb_run_name = 'ft-' + str(time.time())
dataset = 'shakespeare'
init_from = 'gpt2-xl' # this is the largest GPT-2 model
# only save checkpoints if the validation loss improves
always_save_checkpoint = False
# the number of examples per iter:
# 1 batch_size * 32 grad_accum * 1024 tokens = 32,768 tokens/iter
# shakespeare has 301,966 tokens, so 1 epoch ~= 9.2 iters
batch_size = 1
gradient_accumulation_steps = 32
max_iters = 20
# finetune at constant LR
learning_rate = 3e-5
decay_lr = False
================================================
FILE: config/train_gpt2.py
================================================
# config for training GPT-2 (124M) down to very nice loss of ~2.85 on 1 node of 8X A100 40GB
# launch as the following (e.g. in a screen session) and wait ~5 days:
# $ torchrun --standalone --nproc_per_node=8 train.py config/train_gpt2.py
wandb_log = True
wandb_project = 'owt'
wandb_run_name='gpt2-124M'
# these make the total batch size be ~0.5M
# 12 batch size * 1024 block size * 5 gradaccum * 8 GPUs = 491,520
batch_size = 12
block_size = 1024
gradient_accumulation_steps = 5 * 8
# this makes total number of tokens be 300B
max_iters = 600000
lr_decay_iters = 600000
# eval stuff
eval_interval = 1000
eval_iters = 200
log_interval = 10
# weight decay
weight_decay = 1e-1
================================================
FILE: config/train_shakespeare_char.py
================================================
# train a miniature character-level shakespeare model
# good for debugging and playing on macbooks and such
out_dir = 'out-shakespeare-char'
eval_interval = 250 # keep frequent because we'll overfit
eval_iters = 200
log_interval = 10 # don't print too too often
# we expect to overfit on this small dataset, so only save when val improves
always_save_checkpoint = False
wandb_log = False # override via command line if you like
wandb_project = 'shakespeare-char'
wandb_run_name = 'mini-gpt'
dataset = 'shakespeare_char'
gradient_accumulation_steps = 1
batch_size = 64
block_size = 256 # context of up to 256 previous characters
# baby GPT model :)
n_layer = 6
n_head = 6
n_embd = 384
dropout = 0.2
learning_rate = 1e-3 # with baby networks can afford to go a bit higher
max_iters = 5000
lr_decay_iters = 5000 # make equal to max_iters usually
min_lr = 1e-4 # learning_rate / 10 usually
beta2 = 0.99 # make a bit bigger because number of tokens per iter is small
warmup_iters = 100 # not super necessary potentially
# on macbook also add
# device = 'cpu' # run on cpu only
# compile = False # do not torch compile the model
================================================
FILE: configurator.py
================================================
"""
Poor Man's Configurator. Probably a terrible idea. Example usage:
$ python train.py config/override_file.py --batch_size=32
this will first run config/override_file.py, then override batch_size to 32
The code in this file will be run as follows from e.g. train.py:
>>> exec(open('configurator.py').read())
So it's not a Python module, it's just shuttling this code away from train.py
The code in this script then overrides the globals()
I know people are not going to love this, I just really dislike configuration
complexity and having to prepend config. to every single variable. If someone
comes up with a better simple Python solution I am all ears.
"""
import sys
from ast import literal_eval
for arg in sys.argv[1:]:
if '=' not in arg:
# assume it's the name of a config file
assert not arg.startswith('--')
config_file = arg
print(f"Overriding config with {config_file}:")
with open(config_file) as f:
print(f.read())
exec(open(config_file).read())
else:
# assume it's a --key=value argument
assert arg.startswith('--')
key, val = arg.split('=')
key = key[2:]
if key in globals():
try:
# attempt to eval it it (e.g. if bool, number, or etc)
attempt = literal_eval(val)
except (SyntaxError, ValueError):
# if that goes wrong, just use the string
attempt = val
# ensure the types match ok
assert type(attempt) == type(globals()[key])
# cross fingers
print(f"Overriding: {key} = {attempt}")
globals()[key] = attempt
else:
raise ValueError(f"Unknown config key: {key}")
================================================
FILE: data/openwebtext/prepare.py
================================================
# saves the openwebtext dataset to a binary file for training. following was helpful:
# https://github.com/HazyResearch/flash-attention/blob/main/training/src/datamodules/language_modeling_hf.py
import os
from tqdm import tqdm
import numpy as np
import tiktoken
from datasets import load_dataset # huggingface datasets
# number of workers in .map() call
# good number to use is ~order number of cpu cores // 2
num_proc = 8
# number of workers in load_dataset() call
# best number might be different from num_proc above as it also depends on NW speed.
# it is better than 1 usually though
num_proc_load_dataset = num_proc
enc = tiktoken.get_encoding("gpt2")
if __name__ == '__main__':
# takes 54GB in huggingface .cache dir, about 8M documents (8,013,769)
dataset = load_dataset("openwebtext", num_proc=num_proc_load_dataset)
# owt by default only contains the 'train' split, so create a test split
split_dataset = dataset["train"].train_test_split(test_size=0.0005, seed=2357, shuffle=True)
split_dataset['val'] = split_dataset.pop('test') # rename the test split to val
# this results in:
# >>> split_dataset
# DatasetDict({
# train: Dataset({
# features: ['text'],
# num_rows: 8009762
# })
# val: Dataset({
# features: ['text'],
# num_rows: 4007
# })
# })
# we now want to tokenize the dataset. first define the encoding function (gpt2 bpe)
def process(example):
ids = enc.encode_ordinary(example['text']) # encode_ordinary ignores any special tokens
ids.append(enc.eot_token) # add the end of text token, e.g. 50256 for gpt2 bpe
# note: I think eot should be prepended not appended... hmm. it's called "eot" though...
out = {'ids': ids, 'len': len(ids)}
return out
# tokenize the dataset
tokenized = split_dataset.map(
process,
remove_columns=['text'],
desc="tokenizing the splits",
num_proc=num_proc,
)
# concatenate all the ids in each dataset into one large file we can use for training
for split, dset in tokenized.items():
arr_len = np.sum(dset['len'], dtype=np.uint64)
filename = os.path.join(os.path.dirname(__file__), f'{split}.bin')
dtype = np.uint16 # (can do since enc.max_token_value == 50256 is < 2**16)
arr = np.memmap(filename, dtype=dtype, mode='w+', shape=(arr_len,))
total_batches = 1024
idx = 0
for batch_idx in tqdm(range(total_batches), desc=f'writing {filename}'):
# Batch together samples for faster write
batch = dset.shard(num_shards=total_batches, index=batch_idx, contiguous=True).with_format('numpy')
arr_batch = np.concatenate(batch['ids'])
# Write into mmap
arr[idx : idx + len(arr_batch)] = arr_batch
idx += len(arr_batch)
arr.flush()
# train.bin is ~17GB, val.bin ~8.5MB
# train has ~9B tokens (9,035,582,198)
# val has ~4M tokens (4,434,897)
# to read the bin files later, e.g. with numpy:
# m = np.memmap('train.bin', dtype=np.uint16, mode='r')
================================================
FILE: data/openwebtext/readme.md
================================================
## openwebtext dataset
after running `prepare.py` (preprocess) we get:
- train.bin is ~17GB, val.bin ~8.5MB
- train has ~9B tokens (9,035,582,198)
- val has ~4M tokens (4,434,897)
this came from 8,013,769 documents in total.
references:
- OpenAI's WebText dataset is discussed in [GPT-2 paper](https://d4mucfpksywv.cloudfront.net/better-language-models/language_models_are_unsupervised_multitask_learners.pdf)
- [OpenWebText](https://skylion007.github.io/OpenWebTextCorpus/) dataset
================================================
FILE: data/shakespeare/prepare.py
================================================
import os
import requests
import tiktoken
import numpy as np
# download the tiny shakespeare dataset
input_file_path = os.path.join(os.path.dirname(__file__), 'input.txt')
if not os.path.exists(input_file_path):
data_url = 'https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt'
with open(input_file_path, 'w', encoding='utf-8') as f:
f.write(requests.get(data_url).text)
with open(input_file_path, 'r', encoding='utf-8') as f:
data = f.read()
n = len(data)
train_data = data[:int(n*0.9)]
val_data = data[int(n*0.9):]
# encode with tiktoken gpt2 bpe
enc = tiktoken.get_encoding("gpt2")
train_ids = enc.encode_ordinary(train_data)
val_ids = enc.encode_ordinary(val_data)
print(f"train has {len(train_ids):,} tokens")
print(f"val has {len(val_ids):,} tokens")
# export to bin files
train_ids = np.array(train_ids, dtype=np.uint16)
val_ids = np.array(val_ids, dtype=np.uint16)
train_ids.tofile(os.path.join(os.path.dirname(__file__), 'train.bin'))
val_ids.tofile(os.path.join(os.path.dirname(__file__), 'val.bin'))
# train.bin has 301,966 tokens
# val.bin has 36,059 tokens
================================================
FILE: data/shakespeare/readme.md
================================================
# tiny shakespeare
Tiny shakespeare, of the good old char-rnn fame :)
After running `prepare.py`:
- train.bin has 301,966 tokens
- val.bin has 36,059 tokens
================================================
FILE: data/shakespeare_char/prepare.py
================================================
"""
Prepare the Shakespeare dataset for character-level language modeling.
So instead of encoding with GPT-2 BPE tokens, we just map characters to ints.
Will save train.bin, val.bin containing the ids, and meta.pkl containing the
encoder and decoder and some other related info.
"""
import os
import pickle
import requests
import numpy as np
# download the tiny shakespeare dataset
input_file_path = os.path.join(os.path.dirname(__file__), 'input.txt')
if not os.path.exists(input_file_path):
data_url = 'https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt'
with open(input_file_path, 'w') as f:
f.write(requests.get(data_url).text)
with open(input_file_path, 'r') as f:
data = f.read()
print(f"length of dataset in characters: {len(data):,}")
# get all the unique characters that occur in this text
chars = sorted(list(set(data)))
vocab_size = len(chars)
print("all the unique characters:", ''.join(chars))
print(f"vocab size: {vocab_size:,}")
# create a mapping from characters to integers
stoi = { ch:i for i,ch in enumerate(chars) }
itos = { i:ch for i,ch in enumerate(chars) }
def encode(s):
return [stoi[c] for c in s] # encoder: take a string, output a list of integers
def decode(l):
return ''.join([itos[i] for i in l]) # decoder: take a list of integers, output a string
# create the train and test splits
n = len(data)
train_data = data[:int(n*0.9)]
val_data = data[int(n*0.9):]
# encode both to integers
train_ids = encode(train_data)
val_ids = encode(val_data)
print(f"train has {len(train_ids):,} tokens")
print(f"val has {len(val_ids):,} tokens")
# export to bin files
train_ids = np.array(train_ids, dtype=np.uint16)
val_ids = np.array(val_ids, dtype=np.uint16)
train_ids.tofile(os.path.join(os.path.dirname(__file__), 'train.bin'))
val_ids.tofile(os.path.join(os.path.dirname(__file__), 'val.bin'))
# save the meta information as well, to help us encode/decode later
meta = {
'vocab_size': vocab_size,
'itos': itos,
'stoi': stoi,
}
with open(os.path.join(os.path.dirname(__file__), 'meta.pkl'), 'wb') as f:
pickle.dump(meta, f)
# length of dataset in characters: 1115394
# all the unique characters:
# !$&',-.3:;?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
# vocab size: 65
# train has 1003854 tokens
# val has 111540 tokens
================================================
FILE: data/shakespeare_char/readme.md
================================================
# tiny shakespeare, character-level
Tiny shakespeare, of the good old char-rnn fame :) Treated on character-level.
After running `prepare.py`:
- train.bin has 1,003,854 tokens
- val.bin has 111,540 tokens
================================================
FILE: model.py
================================================
"""
Full definition of a GPT Language Model, all of it in this single file.
References:
1) the official GPT-2 TensorFlow implementation released by OpenAI:
https://github.com/openai/gpt-2/blob/master/src/model.py
2) huggingface/transformers PyTorch implementation:
https://github.com/huggingface/transformers/blob/main/src/transformers/models/gpt2/modeling_gpt2.py
"""
import math
import inspect
from dataclasses import dataclass
import torch
import torch.nn as nn
from torch.nn import functional as F
class LayerNorm(nn.Module):
""" LayerNorm but with an optional bias. PyTorch doesn't support simply bias=False """
def __init__(self, ndim, bias):
super().__init__()
self.weight = nn.Parameter(torch.ones(ndim))
self.bias = nn.Parameter(torch.zeros(ndim)) if bias else None
def forward(self, input):
return F.layer_norm(input, self.weight.shape, self.weight, self.bias, 1e-5)
class CausalSelfAttention(nn.Module):
def __init__(self, config):
super().__init__()
assert config.n_embd % config.n_head == 0
# key, query, value projections for all heads, but in a batch
self.c_attn = nn.Linear(config.n_embd, 3 * config.n_embd, bias=config.bias)
# output projection
self.c_proj = nn.Linear(config.n_embd, config.n_embd, bias=config.bias)
# regularization
self.attn_dropout = nn.Dropout(config.dropout)
self.resid_dropout = nn.Dropout(config.dropout)
self.n_head = config.n_head
self.n_embd = config.n_embd
self.dropout = config.dropout
# flash attention make GPU go brrrrr but support is only in PyTorch >= 2.0
self.flash = hasattr(torch.nn.functional, 'scaled_dot_product_attention')
if not self.flash:
print("WARNING: using slow attention. Flash Attention requires PyTorch >= 2.0")
# causal mask to ensure that attention is only applied to the left in the input sequence
self.register_buffer("bias", torch.tril(torch.ones(config.block_size, config.block_size))
.view(1, 1, config.block_size, config.block_size))
def forward(self, x):
B, T, C = x.size() # batch size, sequence length, embedding dimensionality (n_embd)
# calculate query, key, values for all heads in batch and move head forward to be the batch dim
q, k, v = self.c_attn(x).split(self.n_embd, dim=2)
k = k.view(B, T, self.n_head, C // self.n_head).transpose(1, 2) # (B, nh, T, hs)
q = q.view(B, T, self.n_head, C // self.n_head).transpose(1, 2) # (B, nh, T, hs)
v = v.view(B, T, self.n_head, C // self.n_head).transpose(1, 2) # (B, nh, T, hs)
# causal self-attention; Self-attend: (B, nh, T, hs) x (B, nh, hs, T) -> (B, nh, T, T)
if self.flash:
# efficient attention using Flash Attention CUDA kernels
y = torch.nn.functional.scaled_dot_product_attention(q, k, v, attn_mask=None, dropout_p=self.dropout if self.training else 0, is_causal=True)
else:
# manual implementation of attention
att = (q @ k.transpose(-2, -1)) * (1.0 / math.sqrt(k.size(-1)))
att = att.masked_fill(self.bias[:,:,:T,:T] == 0, float('-inf'))
att = F.softmax(att, dim=-1)
att = self.attn_dropout(att)
y = att @ v # (B, nh, T, T) x (B, nh, T, hs) -> (B, nh, T, hs)
y = y.transpose(1, 2).contiguous().view(B, T, C) # re-assemble all head outputs side by side
# output projection
y = self.resid_dropout(self.c_proj(y))
return y
class MLP(nn.Module):
def __init__(self, config):
super().__init__()
self.c_fc = nn.Linear(config.n_embd, 4 * config.n_embd, bias=config.bias)
self.gelu = nn.GELU()
self.c_proj = nn.Linear(4 * config.n_embd, config.n_embd, bias=config.bias)
self.dropout = nn.Dropout(config.dropout)
def forward(self, x):
x = self.c_fc(x)
x = self.gelu(x)
x = self.c_proj(x)
x = self.dropout(x)
return x
class Block(nn.Module):
def __init__(self, config):
super().__init__()
self.ln_1 = LayerNorm(config.n_embd, bias=config.bias)
self.attn = CausalSelfAttention(config)
self.ln_2 = LayerNorm(config.n_embd, bias=config.bias)
self.mlp = MLP(config)
def forward(self, x):
x = x + self.attn(self.ln_1(x))
x = x + self.mlp(self.ln_2(x))
return x
@dataclass
class GPTConfig:
block_size: int = 1024
vocab_size: int = 50304 # GPT-2 vocab_size of 50257, padded up to nearest multiple of 64 for efficiency
n_layer: int = 12
n_head: int = 12
n_embd: int = 768
dropout: float = 0.0
bias: bool = True # True: bias in Linears and LayerNorms, like GPT-2. False: a bit better and faster
class GPT(nn.Module):
def __init__(self, config):
super().__init__()
assert config.vocab_size is not None
assert config.block_size is not None
self.config = config
self.transformer = nn.ModuleDict(dict(
wte = nn.Embedding(config.vocab_size, config.n_embd),
wpe = nn.Embedding(config.block_size, config.n_embd),
drop = nn.Dropout(config.dropout),
h = nn.ModuleList([Block(config) for _ in range(config.n_layer)]),
ln_f = LayerNorm(config.n_embd, bias=config.bias),
))
self.lm_head = nn.Linear(config.n_embd, config.vocab_size, bias=False)
# with weight tying when using torch.compile() some warnings get generated:
# "UserWarning: functional_call was passed multiple values for tied weights.
# This behavior is deprecated and will be an error in future versions"
# not 100% sure what this is, so far seems to be harmless. TODO investigate
self.transformer.wte.weight = self.lm_head.weight # https://paperswithcode.com/method/weight-tying
# init all weights
self.apply(self._init_weights)
# apply special scaled init to the residual projections, per GPT-2 paper
for pn, p in self.named_parameters():
if pn.endswith('c_proj.weight'):
torch.nn.init.normal_(p, mean=0.0, std=0.02/math.sqrt(2 * config.n_layer))
# report number of parameters
print("number of parameters: %.2fM" % (self.get_num_params()/1e6,))
def get_num_params(self, non_embedding=True):
"""
Return the number of parameters in the model.
For non-embedding count (default), the position embeddings get subtracted.
The token embeddings would too, except due to the parameter sharing these
params are actually used as weights in the final layer, so we include them.
"""
n_params = sum(p.numel() for p in self.parameters())
if non_embedding:
n_params -= self.transformer.wpe.weight.numel()
return n_params
def _init_weights(self, module):
if isinstance(module, nn.Linear):
torch.nn.init.normal_(module.weight, mean=0.0, std=0.02)
if module.bias is not None:
torch.nn.init.zeros_(module.bias)
elif isinstance(module, nn.Embedding):
torch.nn.init.normal_(module.weight, mean=0.0, std=0.02)
def forward(self, idx, targets=None):
device = idx.device
b, t = idx.size()
assert t <= self.config.block_size, f"Cannot forward sequence of length {t}, block size is only {self.config.block_size}"
pos = torch.arange(0, t, dtype=torch.long, device=device) # shape (t)
# forward the GPT model itself
tok_emb = self.transformer.wte(idx) # token embeddings of shape (b, t, n_embd)
pos_emb = self.transformer.wpe(pos) # position embeddings of shape (t, n_embd)
x = self.transformer.drop(tok_emb + pos_emb)
for block in self.transformer.h:
x = block(x)
x = self.transformer.ln_f(x)
if targets is not None:
# if we are given some desired targets also calculate the loss
logits = self.lm_head(x)
loss = F.cross_entropy(logits.view(-1, logits.size(-1)), targets.view(-1), ignore_index=-1)
else:
# inference-time mini-optimization: only forward the lm_head on the very last position
logits = self.lm_head(x[:, [-1], :]) # note: using list [-1] to preserve the time dim
loss = None
return logits, loss
def crop_block_size(self, block_size):
# model surgery to decrease the block size if necessary
# e.g. we may load the GPT2 pretrained model checkpoint (block size 1024)
# but want to use a smaller block size for some smaller, simpler model
assert block_size <= self.config.block_size
self.config.block_size = block_size
self.transformer.wpe.weight = nn.Parameter(self.transformer.wpe.weight[:block_size])
for block in self.transformer.h:
if hasattr(block.attn, 'bias'):
block.attn.bias = block.attn.bias[:,:,:block_size,:block_size]
@classmethod
def from_pretrained(cls, model_type, override_args=None):
assert model_type in {'gpt2', 'gpt2-medium', 'gpt2-large', 'gpt2-xl'}
override_args = override_args or {} # default to empty dict
# only dropout can be overridden see more notes below
assert all(k == 'dropout' for k in override_args)
from transformers import GPT2LMHeadModel
print("loading weights from pretrained gpt: %s" % model_type)
# n_layer, n_head and n_embd are determined from model_type
config_args = {
'gpt2': dict(n_layer=12, n_head=12, n_embd=768), # 124M params
'gpt2-medium': dict(n_layer=24, n_head=16, n_embd=1024), # 350M params
'gpt2-large': dict(n_layer=36, n_head=20, n_embd=1280), # 774M params
'gpt2-xl': dict(n_layer=48, n_head=25, n_embd=1600), # 1558M params
}[model_type]
print("forcing vocab_size=50257, block_size=1024, bias=True")
config_args['vocab_size'] = 50257 # always 50257 for GPT model checkpoints
config_args['block_size'] = 1024 # always 1024 for GPT model checkpoints
config_args['bias'] = True # always True for GPT model checkpoints
# we can override the dropout rate, if desired
if 'dropout' in override_args:
print(f"overriding dropout rate to {override_args['dropout']}")
config_args['dropout'] = override_args['dropout']
# create a from-scratch initialized minGPT model
config = GPTConfig(**config_args)
model = GPT(config)
sd = model.state_dict()
sd_keys = sd.keys()
sd_keys = [k for k in sd_keys if not k.endswith('.attn.bias')] # discard this mask / buffer, not a param
# init a huggingface/transformers model
model_hf = GPT2LMHeadModel.from_pretrained(model_type)
sd_hf = model_hf.state_dict()
# copy while ensuring all of the parameters are aligned and match in names and shapes
sd_keys_hf = sd_hf.keys()
sd_keys_hf = [k for k in sd_keys_hf if not k.endswith('.attn.masked_bias')] # ignore these, just a buffer
sd_keys_hf = [k for k in sd_keys_hf if not k.endswith('.attn.bias')] # same, just the mask (buffer)
transposed = ['attn.c_attn.weight', 'attn.c_proj.weight', 'mlp.c_fc.weight', 'mlp.c_proj.weight']
# basically the openai checkpoints use a "Conv1D" module, but we only want to use a vanilla Linear
# this means that we have to transpose these weights when we import them
assert len(sd_keys_hf) == len(sd_keys), f"mismatched keys: {len(sd_keys_hf)} != {len(sd_keys)}"
for k in sd_keys_hf:
if any(k.endswith(w) for w in transposed):
# special treatment for the Conv1D weights we need to transpose
assert sd_hf[k].shape[::-1] == sd[k].shape
with torch.no_grad():
sd[k].copy_(sd_hf[k].t())
else:
# vanilla copy over the other parameters
assert sd_hf[k].shape == sd[k].shape
with torch.no_grad():
sd[k].copy_(sd_hf[k])
return model
def configure_optimizers(self, weight_decay, learning_rate, betas, device_type):
# start with all of the candidate parameters
param_dict = {pn: p for pn, p in self.named_parameters()}
# filter out those that do not require grad
param_dict = {pn: p for pn, p in param_dict.items() if p.requires_grad}
# create optim groups. Any parameters that is 2D will be weight decayed, otherwise no.
# i.e. all weight tensors in matmuls + embeddings decay, all biases and layernorms don't.
decay_params = [p for n, p in param_dict.items() if p.dim() >= 2]
nodecay_params = [p for n, p in param_dict.items() if p.dim() < 2]
optim_groups = [
{'params': decay_params, 'weight_decay': weight_decay},
{'params': nodecay_params, 'weight_decay': 0.0}
]
num_decay_params = sum(p.numel() for p in decay_params)
num_nodecay_params = sum(p.numel() for p in nodecay_params)
print(f"num decayed parameter tensors: {len(decay_params)}, with {num_decay_params:,} parameters")
print(f"num non-decayed parameter tensors: {len(nodecay_params)}, with {num_nodecay_params:,} parameters")
# Create AdamW optimizer and use the fused version if it is available
fused_available = 'fused' in inspect.signature(torch.optim.AdamW).parameters
use_fused = fused_available and device_type == 'cuda'
extra_args = dict(fused=True) if use_fused else dict()
optimizer = torch.optim.AdamW(optim_groups, lr=learning_rate, betas=betas, **extra_args)
print(f"using fused AdamW: {use_fused}")
return optimizer
def estimate_mfu(self, fwdbwd_per_iter, dt):
""" estimate model flops utilization (MFU) in units of A100 bfloat16 peak FLOPS """
# first estimate the number of flops we do per iteration.
# see PaLM paper Appendix B as ref: https://arxiv.org/abs/2204.02311
N = self.get_num_params()
cfg = self.config
L, H, Q, T = cfg.n_layer, cfg.n_head, cfg.n_embd//cfg.n_head, cfg.block_size
flops_per_token = 6*N + 12*L*H*Q*T
flops_per_fwdbwd = flops_per_token * T
flops_per_iter = flops_per_fwdbwd * fwdbwd_per_iter
# express our flops throughput as ratio of A100 bfloat16 peak flops
flops_achieved = flops_per_iter * (1.0/dt) # per second
flops_promised = 312e12 # A100 GPU bfloat16 peak flops is 312 TFLOPS
mfu = flops_achieved / flops_promised
return mfu
@torch.no_grad()
def generate(self, idx, max_new_tokens, temperature=1.0, top_k=None):
"""
Take a conditioning sequence of indices idx (LongTensor of shape (b,t)) and complete
the sequence max_new_tokens times, feeding the predictions back into the model each time.
Most likely you'll want to make sure to be in model.eval() mode of operation for this.
"""
for _ in range(max_new_tokens):
# if the sequence context is growing too long we must crop it at block_size
idx_cond = idx if idx.size(1) <= self.config.block_size else idx[:, -self.config.block_size:]
# forward the model to get the logits for the index in the sequence
logits, _ = self(idx_cond)
# pluck the logits at the final step and scale by desired temperature
logits = logits[:, -1, :] / temperature
# optionally crop the logits to only the top k options
if top_k is not None:
v, _ = torch.topk(logits, min(top_k, logits.size(-1)))
logits[logits < v[:, [-1]]] = -float('Inf')
# apply softmax to convert logits to (normalized) probabilities
probs = F.softmax(logits, dim=-1)
# sample from the distribution
idx_next = torch.multinomial(probs, num_samples=1)
# append sampled index to the running sequence and continue
idx = torch.cat((idx, idx_next), dim=1)
return idx
================================================
FILE: sample.py
================================================
"""
Sample from a trained model
"""
import os
import pickle
from contextlib import nullcontext
import torch
import tiktoken
from model import GPTConfig, GPT
# -----------------------------------------------------------------------------
init_from = 'resume' # either 'resume' (from an out_dir) or a gpt2 variant (e.g. 'gpt2-xl')
out_dir = 'out' # ignored if init_from is not 'resume'
start = "\n" # or "<|endoftext|>" or etc. Can also specify a file, use as: "FILE:prompt.txt"
num_samples = 10 # number of samples to draw
max_new_tokens = 500 # number of tokens generated in each sample
temperature = 0.8 # 1.0 = no change, < 1.0 = less random, > 1.0 = more random, in predictions
top_k = 200 # retain only the top_k most likely tokens, clamp others to have 0 probability
seed = 1337
device = 'cuda' # examples: 'cpu', 'cuda', 'cuda:0', 'cuda:1', etc.
dtype = 'bfloat16' if torch.cuda.is_available() and torch.cuda.is_bf16_supported() else 'float16' # 'float32' or 'bfloat16' or 'float16'
compile = False # use PyTorch 2.0 to compile the model to be faster
exec(open('configurator.py').read()) # overrides from command line or config file
# -----------------------------------------------------------------------------
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.backends.cuda.matmul.allow_tf32 = True # allow tf32 on matmul
torch.backends.cudnn.allow_tf32 = True # allow tf32 on cudnn
device_type = 'cuda' if 'cuda' in device else 'cpu' # for later use in torch.autocast
ptdtype = {'float32': torch.float32, 'bfloat16': torch.bfloat16, 'float16': torch.float16}[dtype]
ctx = nullcontext() if device_type == 'cpu' else torch.amp.autocast(device_type=device_type, dtype=ptdtype)
# model
if init_from == 'resume':
# init from a model saved in a specific directory
ckpt_path = os.path.join(out_dir, 'ckpt.pt')
checkpoint = torch.load(ckpt_path, map_location=device)
gptconf = GPTConfig(**checkpoint['model_args'])
model = GPT(gptconf)
state_dict = checkpoint['model']
unwanted_prefix = '_orig_mod.'
for k,v in list(state_dict.items()):
if k.startswith(unwanted_prefix):
state_dict[k[len(unwanted_prefix):]] = state_dict.pop(k)
model.load_state_dict(state_dict)
elif init_from.startswith('gpt2'):
# init from a given GPT-2 model
model = GPT.from_pretrained(init_from, dict(dropout=0.0))
model.eval()
model.to(device)
if compile:
model = torch.compile(model) # requires PyTorch 2.0 (optional)
# look for the meta pickle in case it is available in the dataset folder
load_meta = False
if init_from == 'resume' and 'config' in checkpoint and 'dataset' in checkpoint['config']: # older checkpoints might not have these...
meta_path = os.path.join('data', checkpoint['config']['dataset'], 'meta.pkl')
load_meta = os.path.exists(meta_path)
if load_meta:
print(f"Loading meta from {meta_path}...")
with open(meta_path, 'rb') as f:
meta = pickle.load(f)
# TODO want to make this more general to arbitrary encoder/decoder schemes
stoi, itos = meta['stoi'], meta['itos']
encode = lambda s: [stoi[c] for c in s]
decode = lambda l: ''.join([itos[i] for i in l])
else:
# ok let's assume gpt-2 encodings by default
print("No meta.pkl found, assuming GPT-2 encodings...")
enc = tiktoken.get_encoding("gpt2")
encode = lambda s: enc.encode(s, allowed_special={"<|endoftext|>"})
decode = lambda l: enc.decode(l)
# encode the beginning of the prompt
if start.startswith('FILE:'):
with open(start[5:], 'r', encoding='utf-8') as f:
start = f.read()
start_ids = encode(start)
x = (torch.tensor(start_ids, dtype=torch.long, device=device)[None, ...])
# run generation
with torch.no_grad():
with ctx:
for k in range(num_samples):
y = model.generate(x, max_new_tokens, temperature=temperature, top_k=top_k)
print(decode(y[0].tolist()))
print('---------------')
================================================
FILE: scaling_laws.ipynb
================================================
{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Reproducing some scaling laws results from [Chinchilla](https://arxiv.org/pdf/2203.15556.pdf). Can't get the numbers to match exactly, but can still be used as a rough guide to help determine compute-optimal models. Also contains related utilities for calculating flops and param counts."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"%matplotlib inline"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## params\n",
"\n",
"First some parameter calculations:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"123.653376"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def gpt_params(seq_len, vocab_size, d_model, num_heads, num_layers):\n",
" \"\"\" Given GPT config calculate total number of parameters \"\"\"\n",
" ffw_size = 4*d_model # in GPT the number of intermediate features is always 4*d_model\n",
" # token and position embeddings\n",
" embeddings = d_model * vocab_size + d_model * seq_len\n",
" # transformer blocks\n",
" attention = 3*d_model**2 + 3*d_model # weights and biases\n",
" attproj = d_model**2 + d_model\n",
" ffw = d_model*(ffw_size) + ffw_size\n",
" ffwproj = ffw_size*d_model + d_model\n",
" layernorms = 2*2*d_model\n",
" # dense\n",
" ln_f = 2*d_model\n",
" dense = d_model*vocab_size # note: no bias here\n",
" # note: embeddings are not included in the param count!\n",
" total_params = num_layers*(attention + attproj + ffw + ffwproj + layernorms) + ln_f + dense\n",
" return total_params\n",
"\n",
"gpt2 = dict(seq_len = 1024, vocab_size = 50257, d_model = 768, num_heads = 12, num_layers = 12)\n",
"gpt_params(**gpt2)/1e6"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"OpenAI reports gpt2 (small) as having 124M params, so this is a match. Also, loading the OpenAI weights into nanoGPT and then calling `model.parameters()` exactly matches the above number and verifies the implementation. Now Chinchilla parameters:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def chinchilla_params(seq_len, vocab_size, d_model, num_heads, num_layers, ffw_size):\n",
" \"\"\" Parameters in the Chinchilla models. Unlike GPT they use relative positional embeddings. \"\"\"\n",
" # token embeddings only\n",
" embeddings = d_model * vocab_size\n",
" # transformer blocks\n",
" attention = 3*d_model**2 + 3*d_model # weights and biases\n",
" relative_pos = d_model**2 + 2*d_model # relative keys, content bias, relative bias\n",
" attproj = d_model**2 + d_model\n",
" ffw = d_model*ffw_size + ffw_size\n",
" ffwproj = ffw_size*d_model + d_model\n",
" layernorms = 2*2*d_model\n",
" # dense\n",
" ln_f = 2*d_model\n",
" dense = d_model*vocab_size # note: no bias here\n",
" # note: embeddings are not included in the param count!\n",
" total_params = num_layers*(attention + relative_pos + attproj + ffw + ffwproj + layernorms) + ln_f + dense\n",
" return total_params\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[44000000.0, 512, 2048, 64, 8, 8]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Load in all the 50 Chinchilla models on the last page of the paper\n",
"import json\n",
"chinchilla_models_txt = '[[44000000.0, 512, 2048, 64, 8, 8], [57000000.0, 576, 2304, 64, 9, 9], [74000000.0, 640, 2560, 64, 10, 10], [90000000.0, 640, 2560, 64, 10, 13], [106000000.0, 640, 2560, 64, 10, 16], [117000000.0, 768, 3072, 64, 12, 12], [140000000.0, 768, 3072, 64, 12, 15], [163000000.0, 768, 3072, 64, 12, 18], [175000000.0, 896, 3584, 64, 14, 14], [196000000.0, 896, 3584, 64, 14, 16], [217000000.0, 896, 3584, 64, 14, 18], [251000000.0, 1024, 4096, 64, 16, 16], [278000000.0, 1024, 4096, 64, 16, 18], [306000000.0, 1024, 4096, 64, 16, 20], [425000000.0, 1280, 5120, 128, 10, 18], [489000000.0, 1280, 5120, 128, 10, 21], [509000000.0, 1408, 5632, 128, 11, 18], [552000000.0, 1280, 5120, 128, 10, 24], [587000000.0, 1408, 5632, 128, 11, 21], [632000000.0, 1536, 6144, 128, 12, 19], [664000000.0, 1408, 5632, 128, 11, 24], [724000000.0, 1536, 6144, 128, 12, 22], [816000000.0, 1536, 6144, 128, 12, 25], [893000000.0, 1792, 7168, 128, 14, 20], [1018000000.0, 1792, 7168, 128, 14, 23], [1143000000.0, 1792, 7168, 128, 14, 26], [1266000000.0, 2048, 8192, 128, 16, 22], [1424000000.0, 2176, 8704, 128, 17, 22], [1429000000.0, 2048, 8192, 128, 16, 25], [1593000000.0, 2048, 8192, 128, 16, 28], [1609000000.0, 2176, 8704, 128, 17, 25], [1731000000.0, 2304, 9216, 128, 18, 24], [1794000000.0, 2176, 8704, 128, 17, 28], [2007000000.0, 2304, 9216, 128, 18, 28], [2283000000.0, 2304, 9216, 128, 18, 32], [2298000000.0, 2560, 10240, 128, 20, 26], [2639000000.0, 2560, 10240, 128, 20, 30], [2980000000.0, 2560, 10240, 128, 20, 34], [3530000000.0, 2688, 10752, 128, 22, 36], [3802000000.0, 2816, 11264, 128, 22, 36], [4084000000.0, 2944, 11776, 128, 22, 36], [4516000000.0, 3072, 12288, 128, 24, 36], [6796000000.0, 3584, 14336, 128, 28, 40], [9293000000.0, 4096, 16384, 128, 32, 42], [11452000000.0, 4352, 17408, 128, 32, 47], [12295000000.0, 4608, 18432, 128, 36, 44], [12569000000.0, 4608, 18432, 128, 32, 47], [13735000000.0, 4864, 19456, 128, 32, 47], [14940000000.0, 4992, 19968, 128, 32, 49], [16183000000.0, 5120, 20480, 128, 40, 47]]'\n",
"chilchilla_models = json.loads(chinchilla_models_txt) # all 50 models\n",
"chilchilla_models[0] # tuples of params, d_model, ffw_size, kv_size, n_heads, n_layers from Table A9"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"our estimated params: 12296.1623M, chinchilla params: 12295.0000M, d_model: 4608, n_heads: 36, n_layers: 44\n",
"our estimated params: 13124.4826M, chinchilla params: 12569.0000M, d_model: 4608, n_heads: 32, n_layers: 47\n",
"our estimated params: 14614.4279M, chinchilla params: 13735.0000M, d_model: 4864, n_heads: 32, n_layers: 47\n",
"our estimated params: 16037.5039M, chinchilla params: 14940.0000M, d_model: 4992, n_heads: 32, n_layers: 49\n",
"our estimated params: 16184.4582M, chinchilla params: 16183.0000M, d_model: 5120, n_heads: 40, n_layers: 47\n"
]
}
],
"source": [
"for m in chilchilla_models[-5:]: # only print last 5 models of the table\n",
" p, d, f, k, h, l = m\n",
" nparams = chinchilla_params(seq_len = 1024, vocab_size = 32000, d_model = d, num_heads = h, num_layers = l, ffw_size=f)\n",
" print(f\"our estimated params: {nparams/1e6:.4f}M, chinchilla params: {p/1e6:.4f}M, d_model: {d}, n_heads: {h}, n_layers: {l}\")"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"We are almost able to reproduce the parameter counts for the Chinchilla models.\n",
"\n",
"Now turning to FLOPs:"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## flops"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def chinchilla_flops(seq_len, vocab_size, d_model, num_heads, num_layers, ffw_size):\n",
" \"\"\" \n",
" Calculate total number of FLOPs, see Chinchilla \n",
" paper Appendix F as reference: https://arxiv.org/pdf/2203.15556.pdf\n",
" \"\"\" \n",
" key_size = d_model // num_heads\n",
"\n",
" # embeddings\n",
" embeddings = 2 * seq_len * vocab_size * d_model\n",
"\n",
" # attention\n",
" # key, query, value projections\n",
" attention = 2 * 3 * seq_len * d_model * (key_size * num_heads)\n",
" # key @ query logits\n",
" attlogits = 2 * seq_len * seq_len * (key_size * num_heads)\n",
" # softmax\n",
" attsoftmax = 3 * num_heads * seq_len * seq_len # 3* is for subtract (max), exp, divide (?)\n",
" # softmax @ value reductions\n",
" attvalue = 2 * seq_len * seq_len * (key_size * num_heads)\n",
" # final linear\n",
" attlinear = 2 * seq_len * (key_size * num_heads) * d_model\n",
" att = attention + attlogits + attsoftmax + attvalue + attlinear\n",
" # feed forward\n",
" dense = 2 * seq_len * (d_model * ffw_size + d_model * ffw_size)\n",
"\n",
" # logits\n",
" logits = 2 * seq_len * d_model * vocab_size\n",
" \n",
" # this is what you'd expect:\n",
" # forward_flops = embeddings + num_layers * (att + dense) + logits\n",
" # but:\n",
" # per author correspondence apparently there is typo in the paper,\n",
" # they do not count embeddings and logits to repro table 4. So instead:\n",
" forward_flops = num_layers * (att + dense)\n",
" backward_flops = 2 * forward_flops # as in Kaplan et al. 2020\n",
" total_flops = forward_flops + backward_flops\n",
"\n",
" return total_flops\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>seq_len</th>\n",
" <th>vocab_size</th>\n",
" <th>d_model</th>\n",
" <th>num_heads</th>\n",
" <th>num_layers</th>\n",
" <th>ffw_size</th>\n",
" <th>N</th>\n",
" <th>F</th>\n",
" <th>approx_flops</th>\n",
" <th>chinch_flops</th>\n",
" <th>ratio</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2048</td>\n",
" <td>32000</td>\n",
" <td>640</td>\n",
" <td>10</td>\n",
" <td>10</td>\n",
" <td>2560</td>\n",
" <td>73825280</td>\n",
" <td>929877196800</td>\n",
" <td>907165040640</td>\n",
" <td>9.298772e+11</td>\n",
" <td>1.025036</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2048</td>\n",
" <td>32000</td>\n",
" <td>1024</td>\n",
" <td>16</td>\n",
" <td>20</td>\n",
" <td>4096</td>\n",
" <td>305707008</td>\n",
" <td>4135248199680</td>\n",
" <td>3756527714304</td>\n",
" <td>4.135248e+12</td>\n",
" <td>1.100817</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2048</td>\n",
" <td>32000</td>\n",
" <td>1280</td>\n",
" <td>10</td>\n",
" <td>24</td>\n",
" <td>5120</td>\n",
" <td>552604160</td>\n",
" <td>7353453772800</td>\n",
" <td>6790399918080</td>\n",
" <td>7.353454e+12</td>\n",
" <td>1.082919</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2048</td>\n",
" <td>32000</td>\n",
" <td>1792</td>\n",
" <td>14</td>\n",
" <td>26</td>\n",
" <td>7168</td>\n",
" <td>1143453696</td>\n",
" <td>14670316437504</td>\n",
" <td>14050759016448</td>\n",
" <td>1.467032e+13</td>\n",
" <td>1.044094</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2048</td>\n",
" <td>32000</td>\n",
" <td>2048</td>\n",
" <td>16</td>\n",
" <td>28</td>\n",
" <td>8192</td>\n",
" <td>1593126912</td>\n",
" <td>20220437594112</td>\n",
" <td>19576343494656</td>\n",
" <td>2.022044e+13</td>\n",
" <td>1.032902</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>2048</td>\n",
" <td>32000</td>\n",
" <td>3584</td>\n",
" <td>28</td>\n",
" <td>40</td>\n",
" <td>14336</td>\n",
" <td>6796274688</td>\n",
" <td>83021046743040</td>\n",
" <td>83512623366144</td>\n",
" <td>8.302105e+13</td>\n",
" <td>0.994114</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" seq_len vocab_size d_model num_heads num_layers ffw_size N \\\n",
"0 2048 32000 640 10 10 2560 73825280 \n",
"1 2048 32000 1024 16 20 4096 305707008 \n",
"2 2048 32000 1280 10 24 5120 552604160 \n",
"3 2048 32000 1792 14 26 7168 1143453696 \n",
"4 2048 32000 2048 16 28 8192 1593126912 \n",
"5 2048 32000 3584 28 40 14336 6796274688 \n",
"\n",
" F approx_flops chinch_flops ratio \n",
"0 929877196800 907165040640 9.298772e+11 1.025036 \n",
"1 4135248199680 3756527714304 4.135248e+12 1.100817 \n",
"2 7353453772800 6790399918080 7.353454e+12 1.082919 \n",
"3 14670316437504 14050759016448 1.467032e+13 1.044094 \n",
"4 20220437594112 19576343494656 2.022044e+13 1.032902 \n",
"5 83021046743040 83512623366144 8.302105e+13 0.994114 "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Now try reproduce Table A4 from Chinchilla paper Appendix, \n",
"# comparing accurate flops above to approximate flops F = 6*N*D\n",
"# note Chinchilla mentions using vocab_size = 32K\n",
"\n",
"chilchilla_models_table4 = [\n",
" [10, 640, 2560, 10, 64],\n",
" [20, 1024, 4096, 16, 64],\n",
" [24, 1280, 5120, 10, 128 ],\n",
" [26, 1792, 7168, 14, 128 ],\n",
" [28, 2048, 8192, 16, 128],\n",
" [40, 3584, 14336, 28, 128]\n",
"]\n",
"\n",
"rows = []\n",
"for num_layers, d_model, ffw_size, num_heads, _ in chilchilla_models_table4:\n",
"\n",
" args = dict(seq_len = 2048, vocab_size = 32000, d_model = d_model, \n",
" num_heads = num_heads, num_layers = num_layers, ffw_size=ffw_size)\n",
"\n",
" D = args['seq_len'] # dataset size (cancels anyway, for the purposes of the ratio calculation below)\n",
" N = chinchilla_params(**args)\n",
" F = chinchilla_flops(**args)\n",
"\n",
" approx_flops = 6*D*N # approximate flops\n",
" chinch_flops = F * (float(D) / args['seq_len']) # exact flops according to Chinchilla paper calculations\n",
"\n",
" # print('---')\n",
" # print(f\"params: {N/1e6:.2f}M\")\n",
" # print(f\"approx flops: {approx_flops/1e9:.2f}B\")\n",
" # print(f\"chinchilla flops: {chinch_flops/1e9:.2f}B\")\n",
" # print(f\"ratio (chinchilla / approx): {chinch_flops / approx_flops:.2f}\")\n",
"\n",
" # first copy all keyvalues from args into out\n",
" out = {k:v for k,v in args.items()}\n",
" # then add the calculated values\n",
" out['N'] = N\n",
" out['F'] = F\n",
" out['approx_flops'] = approx_flops\n",
" out['chinch_flops'] = chinch_flops\n",
" out['ratio'] = chinch_flops / approx_flops\n",
" rows.append(out)\n",
"\n",
"# make a pandas dataframe from rows\n",
"df = pd.DataFrame(rows)\n",
"df"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Pretty good match! Except the param counts are still not perfectly accurate."
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Scaling Laws: Approach 3\n",
"\n",
"In their \"Aproach 3\", Chinchilla paper fits a function L(N,D) to approximate the final loss gives the model size and the data size. Here is the final fit:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.colorbar.Colorbar at 0x7f1bd262a9e0>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA8UAAAHWCAYAAABe7ytwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOy9eXwb9bnv//mOdslavMu7HTv74jgLIZAWKCkJUJYWKPTQS+FwoJcboJD7u72Hvs4BSin0dDvcnkPLgVOgO5SwUxpKA4QtqxMncRYn3ld5k619saT5/TGSLNkzskYayUu+b17fVxtp5pnvjO35zjPP83wewrIsCwqFQqFQKBQKhUKhUM5DmNmeAIVCoVAoFAqFQqFQKLMFdYopFAqFQqFQKBQKhXLeQp1iCoVCoVAoFAqFQqGct1CnmEKhUCgUCoVCoVAo5y3UKaZQKBQKhUKhUCgUynkLdYopFAqFQqFQKBQKhXLeQp1iCoVCoVAoFAqFQqGct1CnmEKhUCgUCoVCoVAo5y3UKaZQKBQKhUKhUCgUynkLdYoplAS8+OKLIISgs7NztqdCoVAoFMqCZiGuuT/5yU+waNEiyGQyrF27FgBQXV2N22+/fVbnRaFQ4qFOMYVCoVAoFArlvOFXv/oVbrrpJlRWVoIQktBBHR8fx913343CwkLodDpcdtllOHLkSFLH+dvf/obvfve7uPjii/HCCy/giSeekOgMKBSK1MhnewIUCoVCoVAoFEq2+Ld/+zc4HA5ccMEFGBgYENwuFArh6quvxrFjx/B//s//QUFBAX75y1/i0ksvRWNjIxYvXpzwOB988AEYhsGvf/1rKJVKqU+DQqFICHWKKRQKhUKhUCjnDXv37o1GiXNycgS327VrFz7//HO88soruPHGGwEAX//617FkyRI88sgj+OMf/5jwOENDQ9BoNNQhplDmATR9mkIRyS9/+UusXLkSKpUKpaWl2LFjB8bHx+O2OXfuHG644QaYzWao1WqUl5fjlltugc1mi27z/vvvY8uWLTCZTMjJycHSpUvxve99L8tnQ6FQKBTK3CaZdRcAnn76aSxatAgajQYXXHABPvnkE1x66aW49NJL47arqqoCIWTG4+7atQvFxcX42te+Fv2ssLAQX//61/Hmm2/C5/MJ7ksIwQsvvACXywVCCAghePHFFwW3b29vx0033YS8vDxotVpceOGF+Mtf/hK3zUcffQRCCF5++WV873vfg9lshk6nw7XXXouenp64bZN5DqFQKJPQSDGFIoJHH30U3//+97F161bcc889aGlpwa9+9SscOnQIn332GRQKBfx+P7Zt2wafz4f77rsPZrMZfX19eOeddzA+Pg6j0YiTJ0/iK1/5CtasWYPHHnsMKpUKra2t+Oyzz2b7FCkUCoVCmTMks+4CXJ3wvffeiy984Qt48MEH0dnZieuvvx65ubkoLy9P6dhHjx7FunXrwDDxMaQLLrgAzz77LM6ePYvVq1fz7vu73/0Ozz77LA4ePIj//u//BgBcdNFFvNsODg7ioosugtvtxv3334/8/Hz85je/wbXXXotdu3bhq1/9atz2P/zhD0EIwf/9v/8XQ0NDeOqpp7B161Y0NTVBo9Ek9RxCoVCmwFIoFEFeeOEFFgDb0dHBDg0NsUqlkr3iiivYYDAY3eY///M/WQDs888/z7Isyx49epQFwL7yyiuCdv/93/+dBcAODw9n/BwoFAqFQpkPxK65LMsmve76fD42Pz+f3bhxIzsxMRHd7sUXX2QBsJdccongMXU6Hfutb31L8Lt//Md/nPb5X/7yFxYAu3v37oTn861vfYvV6XTTPq+qqoo75gMPPMACYD/55JPoZw6Hg62pqWGrq6uj5/7hhx+yANiysjLWbrdHt/3zn//MAmD/3//7fyzLJvccQqFQ4qHp0xRKkvz973+H3+/HAw88EPfW+K677oLBYIimOUXewL733ntwu928tkwmEwDgzTffRCgUyuzEKRQKhUKZhyS77h4+fBijo6O46667IJdPJkHeeuutyM3NTfn4Ho8HKpVq2udqtTr6vRS8++67uOCCC7Bly5boZzk5Obj77rvR2dmJU6dOxW1/2223Qa/XR/994403oqSkBO+++y6A5J5DKBRKPNQpplCSpKurCwCwdOnSuM+VSiUWLVoU/b6mpgY7d+7Ef//3f6OgoADbtm3D008/HVfHc/PNN+Piiy/GP/3TP6G4uBi33HIL/vznP1MHmUKhUCiUMMmuu5H/rauri9tOLpejuro65eNrNBreumGv1xv9Xgq6urqmnSMALF++PPp9LFNVrwkhqKuri/Z3TuY5hEKhxEOdYgolA/zsZz/D8ePH8b3vfQ8ejwf3338/Vq5cid7eXgDcQvrxxx/j73//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
gitextract_7o2mahdo/ ├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── bench.py ├── config/ │ ├── eval_gpt2.py │ ├── eval_gpt2_large.py │ ├── eval_gpt2_medium.py │ ├── eval_gpt2_xl.py │ ├── finetune_shakespeare.py │ ├── train_gpt2.py │ └── train_shakespeare_char.py ├── configurator.py ├── data/ │ ├── openwebtext/ │ │ ├── prepare.py │ │ └── readme.md │ ├── shakespeare/ │ │ ├── prepare.py │ │ └── readme.md │ └── shakespeare_char/ │ ├── prepare.py │ └── readme.md ├── model.py ├── sample.py ├── scaling_laws.ipynb ├── train.py └── transformer_sizing.ipynb
SYMBOL INDEX (30 symbols across 5 files)
FILE: bench.py
function get_batch (line 37) | def get_batch(split):
FILE: data/openwebtext/prepare.py
function process (line 43) | def process(example):
FILE: data/shakespeare_char/prepare.py
function encode (line 32) | def encode(s):
function decode (line 34) | def decode(l):
FILE: model.py
class LayerNorm (line 18) | class LayerNorm(nn.Module):
method __init__ (line 21) | def __init__(self, ndim, bias):
method forward (line 26) | def forward(self, input):
class CausalSelfAttention (line 29) | class CausalSelfAttention(nn.Module):
method __init__ (line 31) | def __init__(self, config):
method forward (line 52) | def forward(self, x):
class MLP (line 78) | class MLP(nn.Module):
method __init__ (line 80) | def __init__(self, config):
method forward (line 87) | def forward(self, x):
class Block (line 94) | class Block(nn.Module):
method __init__ (line 96) | def __init__(self, config):
method forward (line 103) | def forward(self, x):
class GPTConfig (line 109) | class GPTConfig:
class GPT (line 118) | class GPT(nn.Module):
method __init__ (line 120) | def __init__(self, config):
method get_num_params (line 150) | def get_num_params(self, non_embedding=True):
method _init_weights (line 162) | def _init_weights(self, module):
method forward (line 170) | def forward(self, idx, targets=None):
method crop_block_size (line 195) | def crop_block_size(self, block_size):
method from_pretrained (line 207) | def from_pretrained(cls, model_type, override_args=None):
method configure_optimizers (line 263) | def configure_optimizers(self, weight_decay, learning_rate, betas, dev...
method estimate_mfu (line 289) | def estimate_mfu(self, fwdbwd_per_iter, dt):
method generate (line 306) | def generate(self, idx, max_new_tokens, temperature=1.0, top_k=None):
FILE: train.py
function get_batch (line 116) | def get_batch(split):
function estimate_loss (line 216) | def estimate_loss():
function get_lr (line 231) | def get_lr(it):
Condensed preview — 24 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (358K chars).
[
{
"path": ".gitattributes",
"chars": 214,
"preview": "# Override jupyter in Github language stats for more accurate estimate of repo code languages\n# reference: https://githu"
},
{
"path": ".gitignore",
"chars": 100,
"preview": ".DS_Store\n.idea\n.ipynb_checkpoints/\n.vscode\n__pycache__/\n*.bin\n*.pkl\n*.pt\n*.pyc\ninput.txt\nenv/\nvenv/"
},
{
"path": "LICENSE",
"chars": 1072,
"preview": "MIT License\n\nCopyright (c) 2022 Andrej Karpathy\n\nPermission is hereby granted, free of charge, to any person obtaining a"
},
{
"path": "README.md",
"chars": 13846,
"preview": "\n# nanoGPT\n\n\n\n\n---\n\n**Update Nov 2025** nanoGPT has a new and improved cousin called [nano"
},
{
"path": "bench.py",
"chars": 4815,
"preview": "\"\"\"\nA much shorter version of train.py for benchmarking\n\"\"\"\nimport os\nfrom contextlib import nullcontext\nimport numpy as"
},
{
"path": "config/eval_gpt2.py",
"chars": 208,
"preview": "# evaluate the base gpt2\n# n_layer=12, n_head=12, n_embd=768\n# 124M parameters\nbatch_size = 8\neval_iters = 500 # use mor"
},
{
"path": "config/eval_gpt2_large.py",
"chars": 215,
"preview": "# evaluate the base gpt2\n# n_layer=36, n_head=20, n_embd=1280\n# 774M parameters\nbatch_size = 8\neval_iters = 500 # use mo"
},
{
"path": "config/eval_gpt2_medium.py",
"chars": 216,
"preview": "# evaluate the base gpt2\n# n_layer=24, n_head=16, n_embd=1024\n# 350M parameters\nbatch_size = 8\neval_iters = 500 # use mo"
},
{
"path": "config/eval_gpt2_xl.py",
"chars": 213,
"preview": "# evaluate the base gpt2\n# n_layer=48, n_head=25, n_embd=1600\n# 1558M parameters\nbatch_size = 8\neval_iters = 500 # use m"
},
{
"path": "config/finetune_shakespeare.py",
"chars": 645,
"preview": "import time\n\nout_dir = 'out-shakespeare'\neval_interval = 5\neval_iters = 40\nwandb_log = False # feel free to turn on\nwand"
},
{
"path": "config/train_gpt2.py",
"chars": 681,
"preview": "# config for training GPT-2 (124M) down to very nice loss of ~2.85 on 1 node of 8X A100 40GB\n# launch as the following ("
},
{
"path": "config/train_shakespeare_char.py",
"chars": 1132,
"preview": "# train a miniature character-level shakespeare model\n# good for debugging and playing on macbooks and such\n\nout_dir = '"
},
{
"path": "configurator.py",
"chars": 1758,
"preview": "\"\"\"\nPoor Man's Configurator. Probably a terrible idea. Example usage:\n$ python train.py config/override_file.py --batch_"
},
{
"path": "data/openwebtext/prepare.py",
"chars": 3167,
"preview": "# saves the openwebtext dataset to a binary file for training. following was helpful:\n# https://github.com/HazyResearch/"
},
{
"path": "data/openwebtext/readme.md",
"chars": 489,
"preview": "\n## openwebtext dataset\n\nafter running `prepare.py` (preprocess) we get:\n\n- train.bin is ~17GB, val.bin ~8.5MB\n- train h"
},
{
"path": "data/shakespeare/prepare.py",
"chars": 1132,
"preview": "import os\nimport requests\nimport tiktoken\nimport numpy as np\n\n# download the tiny shakespeare dataset\ninput_file_path = "
},
{
"path": "data/shakespeare/readme.md",
"chars": 161,
"preview": "\n# tiny shakespeare\n\nTiny shakespeare, of the good old char-rnn fame :)\n\nAfter running `prepare.py`:\n\n- train.bin has 30"
},
{
"path": "data/shakespeare_char/prepare.py",
"chars": 2344,
"preview": "\"\"\"\nPrepare the Shakespeare dataset for character-level language modeling.\nSo instead of encoding with GPT-2 BPE tokens,"
},
{
"path": "data/shakespeare_char/readme.md",
"chars": 209,
"preview": "\n# tiny shakespeare, character-level\n\nTiny shakespeare, of the good old char-rnn fame :) Treated on character-level.\n\nAf"
},
{
"path": "model.py",
"chars": 16345,
"preview": "\"\"\"\nFull definition of a GPT Language Model, all of it in this single file.\nReferences:\n1) the official GPT-2 TensorFlow"
},
{
"path": "sample.py",
"chars": 3942,
"preview": "\"\"\"\nSample from a trained model\n\"\"\"\nimport os\nimport pickle\nfrom contextlib import nullcontext\nimport torch\nimport tikto"
},
{
"path": "scaling_laws.ipynb",
"chars": 268519,
"preview": "{\n \"cells\": [\n {\n \"attachments\": {},\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"Reproducing s"
},
{
"path": "train.py",
"chars": 14857,
"preview": "\"\"\"\nThis training script can be run both on a single gpu in debug mode,\nand also in a larger training run with distribut"
},
{
"path": "transformer_sizing.ipynb",
"chars": 14579,
"preview": "{\n \"cells\": [\n {\n \"attachments\": {},\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"### Transform"
}
]
About this extraction
This page contains the full source code of the karpathy/nanoGPT GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 24 files (342.6 KB), approximately 195.2k tokens, and a symbol index with 30 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.