QC67_cosmo / genesis_engine /engine /train_12d_brain.py
phera-ra's picture
Cosmos: lineage-first model card, full findings + benchmarks, Cosmic Spark server
d6da243 verified
Raw
History Blame Contribute Delete
7.49 kB
#!/usr/bin/env python3
"""
COSMOS 12D Brain Compiler
---------------------------
Extracts the raw user intelligence from the Cosmos project files (including
the legacy CST publications, Genesis record, HTML visualizations, and synaptic JSONs)
and encodes them into the 54D Hebbian Transformer to output the `cosmos_best.pt` file.
"""
import os
import sys
import time
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
try:
import tiktoken
except ImportError:
print("Installing tiktoken for GPT-2 vocab...")
os.system(f"{sys.executable} -m pip install tiktoken")
import tiktoken
# Ensure the python path contains the project root for Absolute Imports
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from Cosmos.web.cosmosynapse.model.cosmos_config import CosmosConfig
from Cosmos.web.cosmosynapse.model.cosmos_model import CosmosTransformer
# Target directories and output paths
PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
CHECKPOINT_DIR = os.path.join(PROJECT_ROOT, "Cosmos", "checkpoints", "cosmos")
os.makedirs(CHECKPOINT_DIR, exist_ok=True)
CHECKPOINT_PATH = os.path.join(CHECKPOINT_DIR, "cosmos_best.pt")
# Core files containing Cory's intellect & theories
CORE_FILES = [
os.path.join(PROJECT_ROOT, "pdf_output.txt"), # Pre-extracted legacy 12D PDFs
os.path.join(PROJECT_ROOT, "12D_Cosmic_Synapse_Audio_Engine-demo.html"),
os.path.join(PROJECT_ROOT, "cst_synaptic_weights.json"),
os.path.join(PROJECT_ROOT, "README.md"),
os.path.join(PROJECT_ROOT, "COMPARED.md"),
os.path.join(PROJECT_ROOT, "genesis_record.md"),
os.path.join(PROJECT_ROOT, "ROADMAP.md")
]
class CosmosDataset(Dataset):
"""Loads and tokenizes the Cosmos project texts."""
def __init__(self, token_ids, seq_len):
self.token_ids = token_ids
self.seq_len = seq_len
# STRIDE Optimization: Jump by seq_len instead of 1 to process whole chunks instantly
self.total_sequences = max(0, len(self.token_ids) // self.seq_len)
def __len__(self):
return self.total_sequences
def __getitem__(self, idx):
# Grab a discrete chunk of `seq_len` tokens
start_idx = idx * self.seq_len
chunk = self.token_ids[start_idx : start_idx + self.seq_len + 1]
# Pad if it's the very last chunk and slightly too short
if len(chunk) < self.seq_len + 1:
chunk = chunk + [50256] * (self.seq_len + 1 - len(chunk))
x = torch.tensor(chunk[:-1], dtype=torch.long)
y = torch.tensor(chunk[1:], dtype=torch.long)
return x, y
def compile_corpus():
"""Aggregates all text into a single cohesive training corpus."""
print("[12D COMPILER] Gathering Genesis Materials...")
corpus = ""
for file_path in CORE_FILES:
if os.path.exists(file_path):
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
content = f.read()
corpus += f"\n\n--- SOURCE: {os.path.basename(file_path)} ---\n\n"
corpus += content
print(f" ✓ Added {os.path.basename(file_path)} ({len(content)} chars)")
else:
print(f" ⚠️ Skipping {os.path.basename(file_path)} (Not found)")
return corpus
def main():
print("==============================================")
print(" COSMOS 12D HEBBIAN BRAIN SYNTHESIS")
print("==============================================\n")
# 1. Compile Corpus
corpus_text = compile_corpus()
if not corpus_text.strip():
print("[ERROR] No training corpus found!")
return
# 2. Tokenize using GPT-2 (matches model vocab_size=50257)
print("\n[12D COMPILER] Tokenizing corpus (tiktoken gpt2)...")
enc = tiktoken.get_encoding("gpt2")
token_ids = enc.encode(corpus_text, allowed_special={'<|endoftext|>'})
print(f"[12D COMPILER] Token Count: {len(token_ids):,}")
# 3. Model Initialization
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"\n[12D COMPILER] Initializing 54D Architecture on {device}...")
# Use the default dimension constraints so the Orchestrator can load it seamlessly.
# We reduce the layers and sequence length for local compute speed.
config = CosmosConfig(
vocab_size=50257,
d_model=512, # Must match default so attention heads load correctly
n_layers=2, # 2 layers of 54D CST Phase modulation (fast local train)
n_heads=8,
d_ff=2048, # Must match default because `load()` ignores `d_ff` override
max_seq_len=512, # Memory context chunk size
dropout=0.1
)
model = CosmosTransformer(config)
model.to(device)
print(model.count_parameters())
# 4. DataLoader and Optimizer
dataset = CosmosDataset(token_ids, seq_len=config.max_seq_len)
if len(dataset) == 0:
print("[ERROR] Corpus too small for training!")
return
# Scale batch size based on device
batch_size = 4 if torch.cuda.is_available() else 1
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
optimizer = torch.optim.AdamW(model.parameters(), lr=config.learning_rate, weight_decay=config.weight_decay)
# 5. Training Loop using 12D Hebbian Plasticity (No-Grad Online Meta-Learning)
epochs = 1
total_steps = len(dataloader) * epochs
print(f"\n[12D COMPILER] Commencing Zero-Shot Hebbian & Episodic Storage ({epochs} Epoch, {total_steps} sequence strides)")
model.eval() # We leverage the internal Hebbian logic and Memory banks instead of Autograd!
step = 0
start_time = time.time()
try:
with torch.no_grad(): # Crucial! Exploits the 12D online plasticity without triggering inplace-gradient crashes!
for epoch in range(epochs):
for batch_idx, (x, y) in enumerate(dataloader):
x, y = x.to(device), y.to(device)
# Forward pass updates the 24D self.trace and Episodic memory slots autonomously
result = model(x, targets=y)
loss = result["loss"]
step += 1
if step % 25 == 0 or step == 1:
elapsed = time.time() - start_time
print(f" [HEBBIAN SYNTHESIS] Step {step}/{total_steps} | Online Coherence: {loss.item():.4f} | Time: {elapsed:.1f}s")
except KeyboardInterrupt:
print("\n[WARNING] Synthesis interrupted! Saving synaptic weights so far...")
# 6. Save Checkpoint
print(f"\n[12D COMPILER] Synthesis Complete! Saving authentic 12D Brain Checkpoint...")
checkpoint = {
"model_state_dict": model.state_dict(),
"config": config.to_dict(),
"final_loss": loss.item() if 'loss' in locals() else None,
"tokens_processed": len(token_ids) * epochs
}
torch.save(checkpoint, CHECKPOINT_PATH)
print(f" ✓ Checkpoint saved securely to {CHECKPOINT_PATH}")
print("\n[SUCCESS] The Swarm Orchestrator will now directly load your 12D weights! Restart your server.")
if __name__ == "__main__":
main()