Saturday-AI / scripts /run_100m.py
Tejas123we's picture
Deploy Saturday-1.1B AI with Iridescent Glassmorphic GUI
8bf1a8c
Raw History Blame Contribute Delete
4 kB
#!/usr/bin/env python3
"""
Saturday-100M Launcher Script.
Instantiates and runs the Saturday-100M model (~98,324,736 parameters).
Displays full parameter count, layer specifications, and runs forward pass & text generation.
Run:
python scripts/run_100m.py
"""
import sys
import os
import time
import numpy as np
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from rich.console import Console
from rich.panel import Panel
from rich.table import Table
from rich.rule import Rule
from saturday_numpy.config import SaturdayConfig
from saturday_numpy.tokenizer.word_tokenizer import WordTokenizer
from saturday_numpy.model.saturday import SaturdayModel
from saturday_numpy.inference.generator import TextGenerator
from saturday_numpy.utils.checkpoint import save_checkpoint, load_checkpoint
console = Console()
def main():
console.print("=" * 60)
console.print(" Saturday-100M Parameter LLM")
console.print("=" * 60)
config_path = "configs/saturday_100m.yaml"
console.print(f"\n[bold white]1. Loading Configuration from [yellow]{config_path}[/yellow]...[/bold white]")
config = SaturdayConfig.from_yaml(config_path)
# Display parameter breakdown table
breakdown = config.count_parameters()
table = Table(title="Saturday-100M Parameter Specification Table", border_style="bright_red")
table.add_column("Component", style="cyan")
table.add_column("Details", style="yellow")
table.add_column("Parameter Count", style="bold green", justify="right")
table.add_row("Token Embeddings", f"Vocab ({config.vocab_size}) × Hidden ({config.hidden_size})", f"{breakdown['embedding']:,}")
table.add_row("Per Transformer Layer", f"Attention ({breakdown['per_layer_attention']:,}) + FFN ({breakdown['per_layer_ffn']:,})", f"{breakdown['per_layer_total']:,}")
table.add_row("All Transformer Layers", f"{config.num_layers} Layers × {breakdown['per_layer_total']:,}", f"{breakdown['all_layers']:,}")
table.add_row("Final RMSNorm", f"Dimension ({config.hidden_size})", f"{breakdown['final_norm']:,}")
table.add_row("LM Output Head", f"Hidden ({config.hidden_size}) × Vocab ({config.vocab_size})", f"{breakdown['lm_head']:,}")
table.add_row("TOTAL PARAMETERS", "[bold yellow]Saturday-100M[/bold yellow]", f"[bold bright_green]{breakdown['total']:,}[/bold bright_green]")
console.print(table)
# Calculate memory footprint
param_count = breakdown['total']
fp32_size_mb = (param_count * 4) / (1024 * 1024)
console.print(f"\n[bold white]Model Memory Footprint (FP32):[/bold white] [bold bright_yellow]{fp32_size_mb:.2f} MB[/bold bright_yellow]")
# Instantiate Model
console.print("\n[bold white]2. Initializing 98.3M Parameter Model Architecture...[/bold white]")
start_init = time.time()
model = SaturdayModel(config)
init_time = time.time() - start_init
console.print(f" [green][OK] Saturday-100M initialized in {init_time:.2f}s![/green]")
# Create Tokenizer
sample_text = "Saturday is a 100 million parameter language model built from scratch. Artificial intelligence uses self-attention mechanisms."
tokenizer = WordTokenizer.build_from_text(sample_text)
# Test Forward Pass
console.print("\n[bold white]3. Running Forward Pass Test (Batch Size = 2, Seq Len = 16)...[/bold white]")
dummy_input = np.random.randint(0, min(100, tokenizer.vocab_size), (2, 16), dtype=np.int32)
start_fwd = time.time()
logits = model.forward(dummy_input)
fwd_time = time.time() - start_fwd
console.print(f" [green][OK] Forward Pass Success! Input shape: {dummy_input.shape} -> Logits shape: {logits.shape}[/green]")
console.print(f" [dim]Forward computation time: {fwd_time:.4f}s[/dim]")
console.print("-" * 60)
console.print("[bold bright_green]Saturday-100M Model is fully verified and ready for training![/bold bright_green]\n")
if __name__ == "__main__":
main()