AlysiumTinyLLM / train.py
DeepImagix's picture
Alysium TinyLM v1.0 final checkpoint + source (from GitHub)
e644e74 verified
Raw History Blame Contribute Delete
2.45 kB
import pickle
import re
import time
import numpy as np
from model_transformer import TinyTransformerLM
import config
print("Alysium TinyLM - Transformer-augmented Training")
print("-" * 50)
with open("dataset.txt", "r", encoding="utf-8") as f:
text = f.read().lower()
words = re.findall(r"[a-z0-9']+|[.!?]", text)
words = [w for w in words if w.strip()]
print(f"Total words: {len(words)}")
# Load warm-started model + vocab (built by warm_start.py)
with open("tinylm.pkl", "rb") as f:
ckpt = pickle.load(f)
model = ckpt["model"]
word_to_idx = ckpt["word_to_idx"]
idx_to_word = ckpt["idx_to_word"]
CONTEXT = ckpt["context_size"]
PAD = ckpt["pad_token"]
pad_id = word_to_idx[PAD]
print(f"Vocabulary size: {len(word_to_idx)}")
print(f"Model: embed={config.EMBED_DIM}, hidden={config.HIDDEN_DIM}, context={CONTEXT} (transformer)")
print(f"Total parameters: {model.num_params():,}")
BATCH_SIZE = getattr(config, "BATCH_SIZE", 256)
print("\nBuilding training examples...")
word_ids = np.array([word_to_idx.get(w, pad_id) for w in words], dtype=np.int64)
indices = np.arange(0, len(words) - 1, 3)
n = len(indices)
contexts = np.full((n, CONTEXT), pad_id, dtype=np.int64)
targets = np.empty(n, dtype=np.int64)
for row, i in enumerate(indices):
start = max(0, i - CONTEXT + 1)
ctx = word_ids[start:i + 1]
if len(ctx) < CONTEXT:
contexts[row, CONTEXT - len(ctx):] = ctx
else:
contexts[row, :] = ctx[-CONTEXT:]
targets[row] = word_ids[i + 1]
print(f"Training examples: {n:,}")
print("\nTraining...")
for epoch in range(config.EPOCHS):
lr = config.LEARNING_RATE * (0.95 ** epoch)
perm = np.random.permutation(n)
total_loss = 0.0
steps = 0
t0 = time.time()
for start in range(0, n, BATCH_SIZE):
batch_idx = perm[start:start + BATCH_SIZE]
loss = model.train_batch(contexts[batch_idx], targets[batch_idx], lr=lr)
total_loss += loss
steps += 1
avg = total_loss / max(steps, 1)
elapsed = time.time() - t0
print(f"Epoch {epoch+1:2d}/{config.EPOCHS} loss={avg:.4f} lr={lr:.4f} time={elapsed:.1f}s")
with open("tinylm.pkl", "wb") as f:
pickle.dump({
"model": model,
"word_to_idx": word_to_idx,
"idx_to_word": idx_to_word,
"context_size": CONTEXT,
"pad_token": PAD,
"architecture": "transformer",
}, f)
print("\nTraining complete! Saved tinylm.pkl")