Delete train_enwik8.py
Browse files- train_enwik8.py +0 -114
train_enwik8.py
DELETED
|
@@ -1,114 +0,0 @@
|
|
| 1 |
-
import os
|
| 2 |
-
import time
|
| 3 |
-
import math
|
| 4 |
-
import torch
|
| 5 |
-
from torch.nn import functional as F
|
| 6 |
-
from model_modified import GPTModified
|
| 7 |
-
import numpy as np
|
| 8 |
-
from contextlib import nullcontext
|
| 9 |
-
|
| 10 |
-
# Import configurations
|
| 11 |
-
from config.char_config import config
|
| 12 |
-
|
| 13 |
-
def load_data(split):
|
| 14 |
-
"""Load binary data from split file."""
|
| 15 |
-
filename = os.path.join('data', f'{split}.bin')
|
| 16 |
-
with open(filename, 'rb') as f:
|
| 17 |
-
data = np.fromfile(f, dtype=np.uint8)
|
| 18 |
-
return data
|
| 19 |
-
|
| 20 |
-
def get_batch(data, block_size, batch_size, device):
|
| 21 |
-
"""Generate a small batch of data of inputs x and targets y."""
|
| 22 |
-
ix = torch.randint(len(data) - block_size, (batch_size,))
|
| 23 |
-
x = torch.stack([torch.from_numpy(data[i:i+block_size].astype(np.int64)) for i in ix])
|
| 24 |
-
y = torch.stack([torch.from_numpy(data[i+1:i+1+block_size].astype(np.int64)) for i in ix])
|
| 25 |
-
x, y = x.to(device), y.to(device)
|
| 26 |
-
return x, y
|
| 27 |
-
|
| 28 |
-
def estimate_loss(model, data, eval_iters, block_size, batch_size, device):
|
| 29 |
-
"""Estimate loss on data split."""
|
| 30 |
-
out = {}
|
| 31 |
-
model.eval()
|
| 32 |
-
losses = torch.zeros(eval_iters)
|
| 33 |
-
for k in range(eval_iters):
|
| 34 |
-
X, Y = get_batch(data, block_size, batch_size, device)
|
| 35 |
-
with torch.no_grad():
|
| 36 |
-
logits, loss = model(X, Y)
|
| 37 |
-
losses[k] = loss.item()
|
| 38 |
-
out = losses.mean()
|
| 39 |
-
model.train()
|
| 40 |
-
return out
|
| 41 |
-
|
| 42 |
-
def convert_to_bpc(loss):
|
| 43 |
-
"""Convert from natural log (nats) to bits per character (bpc)."""
|
| 44 |
-
return loss / math.log(2)
|
| 45 |
-
|
| 46 |
-
def main():
|
| 47 |
-
# System setup
|
| 48 |
-
device = 'cuda' if torch.cuda.is_available() else 'cpu'
|
| 49 |
-
print(f"Using device: {device}")
|
| 50 |
-
|
| 51 |
-
dtype = {'float32': torch.float32, 'bfloat16': torch.bfloat16, 'float16': torch.float16}[config['dtype']]
|
| 52 |
-
ptdtype = {'float32': torch.float32, 'bfloat16': torch.bfloat16, 'float16': torch.float16}[config['dtype']]
|
| 53 |
-
ctx = nullcontext() if device == 'cpu' else torch.amp.autocast(device_type=device, dtype=ptdtype)
|
| 54 |
-
|
| 55 |
-
# Data loading
|
| 56 |
-
print("Loading data...")
|
| 57 |
-
train_data = load_data('train')
|
| 58 |
-
val_data = load_data('val')
|
| 59 |
-
|
| 60 |
-
# Model init
|
| 61 |
-
print("Initializing model...")
|
| 62 |
-
model = GPTModified(config)
|
| 63 |
-
model.to(device)
|
| 64 |
-
|
| 65 |
-
# Optimizer
|
| 66 |
-
optimizer = torch.optim.AdamW(
|
| 67 |
-
model.parameters(),
|
| 68 |
-
lr=config['learning_rate'],
|
| 69 |
-
betas=(config['beta1'], config['beta2']),
|
| 70 |
-
weight_decay=config['weight_decay']
|
| 71 |
-
)
|
| 72 |
-
|
| 73 |
-
# Training loop
|
| 74 |
-
best_val_loss = float('inf')
|
| 75 |
-
batch_size = 32
|
| 76 |
-
|
| 77 |
-
for iter in range(config['max_iters']):
|
| 78 |
-
# Sample a batch of data
|
| 79 |
-
xb, yb = get_batch(train_data, config['block_size'], batch_size, device)
|
| 80 |
-
|
| 81 |
-
# Forward pass
|
| 82 |
-
with ctx:
|
| 83 |
-
logits, loss = model(xb, yb)
|
| 84 |
-
loss_bpc = convert_to_bpc(loss.item())
|
| 85 |
-
|
| 86 |
-
# Backward pass
|
| 87 |
-
optimizer.zero_grad(set_to_none=True)
|
| 88 |
-
loss.backward()
|
| 89 |
-
torch.nn.utils.clip_grad_norm_(model.parameters(), config['grad_clip'])
|
| 90 |
-
optimizer.step()
|
| 91 |
-
|
| 92 |
-
# Logging
|
| 93 |
-
if iter % config['log_interval'] == 0:
|
| 94 |
-
print(f"iter {iter}: train loss {loss_bpc:.4f} bpc")
|
| 95 |
-
|
| 96 |
-
# Evaluation
|
| 97 |
-
if iter % config['eval_interval'] == 0:
|
| 98 |
-
val_loss = estimate_loss(model, val_data, config['eval_iters'],
|
| 99 |
-
config['block_size'], batch_size, device)
|
| 100 |
-
val_bpc = convert_to_bpc(val_loss)
|
| 101 |
-
print(f"iter {iter}: val loss {val_bpc:.4f} bpc")
|
| 102 |
-
|
| 103 |
-
# Save best model
|
| 104 |
-
if val_bpc < best_val_loss:
|
| 105 |
-
best_val_loss = val_bpc
|
| 106 |
-
torch.save({
|
| 107 |
-
'model_state_dict': model.state_dict(),
|
| 108 |
-
'optimizer_state_dict': optimizer.state_dict(),
|
| 109 |
-
'iter': iter,
|
| 110 |
-
'best_val_loss': best_val_loss,
|
| 111 |
-
}, 'best_model.pt')
|
| 112 |
-
|
| 113 |
-
if __name__ == '__main__':
|
| 114 |
-
main()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|