| import torch |
| from src.model.config import GPT124M_CONFIG, DEFAULT_DATA_URL, DEFAULT_DATASET_PATH |
| from src.data.utils import download_text, load_text |
| from src.data.dataset import create_gpt_dataloader |
| from src.model.gpt import GPTModel |
| from src.data.tokenizer import TikTokenizer |
| from src.engine.generate import generate_greedy |
|
|
|
|
| def main(): |
| torch.manual_seed(22) |
| cfg = GPT124M_CONFIG |
|
|
| print("Downloading/loading text...") |
| download_text(DEFAULT_DATA_URL, DEFAULT_DATASET_PATH) |
| raw_text = load_text(DEFAULT_DATASET_PATH) |
| print(f"Loaded text: {len(raw_text)} characters") |
|
|
| tokenizer = TikTokenizer("gpt2") |
|
|
| num_workers = 0 |
|
|
| dataloader = create_gpt_dataloader( |
| raw_text, |
| tokenizer=tokenizer, |
| max_len=cfg.context_window_size, |
| stride=cfg.stride, |
| batch_size=cfg.batch_size, |
| num_workers=num_workers |
| ) |
| print(f"Dataset size: {len(dataloader.dataset)} samples") |
|
|
| |
| sample_inputs, sample_targets = next(iter(dataloader)) |
| print(f"\n=== Sample Batch (first sequence) ===") |
| print(f"Input text: {tokenizer.decode(sample_inputs[0].tolist())[:100]}...") |
| print(f"Target text: {tokenizer.decode(sample_targets[0].tolist())[:100]}...") |
|
|
| model = GPTModel(cfg) |
| total_params = sum(p.numel() for p in model.parameters()) |
| print(f"\nGPTModel — {total_params:,} params") |
|
|
| |
| print("\n=== Parameter Budget by Component ===") |
| groups = { |
| "token_embedding": 0, |
| "position_embedding": 0, |
| "attention (W_q/k/v)": 0, |
| "feed_forward": 0, |
| "layer_norm": 0, |
| "output_head": 0, |
| } |
| for name, param in model.named_parameters(): |
| n = param.numel() |
| if "token_embedding" in name: |
| groups["token_embedding"] += n |
| elif "position_embedding" in name: |
| groups["position_embedding"] += n |
| elif "W_query" in name or "W_key" in name or "W_value" in name: |
| groups["attention (W_q/k/v)"] += n |
| elif "ff" in name: |
| groups["feed_forward"] += n |
| elif "norm" in name: |
| groups["layer_norm"] += n |
| elif "output_head" in name: |
| groups["output_head"] += n |
|
|
| for group, count in groups.items(): |
| pct = count / total_params * 100 |
| print(f" {group:<25} {count:>10,} ({pct:.1f}%)") |
|
|
| |
| print() |
| inputs, targets = next(iter(dataloader)) |
| print(f"Batch shape: inputs={inputs.shape}, targets={targets.shape}") |
| logits = model(inputs) |
| print(f"Forward pass — input: {list(inputs.shape)} → logits: {list(logits.shape)}") |
|
|
| |
| prompt = "Gisburn had a curious smile in his eyes" |
| result = generate_greedy(model, tokenizer, torch.device("cpu"), prompt, num_tokens=20) |
| print("Generated:", result) |
|
|
|
|
| if __name__ == '__main__': |
| main() |
|
|