eyad-silx commited on
Commit
dc6750a
·
verified ·
1 Parent(s): be88aeb

Delete train_enwik8.py

Browse files
Files changed (1) hide show
  1. 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()