EvoPlatformV3 / evo_architecture.py
HemanM's picture
Update evo_architecture.py
4ecef43 verified
import random
import json
import os
import uuid
import csv
import torch.nn as nn
GENOME_LOG = "genome_log.csv"
BEST_GENOME_FILE = "best_genome.json"
# Mutation bounds
MUTATION_LIMITS = {
"num_layers": (2, 12),
"ffn_dim": (256, 4096),
"num_heads": (2, 16),
}
def default_config():
return {
"genome_id": str(uuid.uuid4()),
"num_layers": 6,
"ffn_dim": 1024,
"num_heads": 8,
"memory_enabled": True
}
def mutate_genome(base_config, exploration_rate=0.5):
config = base_config.copy()
config["genome_id"] = str(uuid.uuid4())
mutation_type = random.choice(["num_layers", "ffn_dim", "num_heads", "memory_enabled"])
if mutation_type == "memory_enabled":
config["memory_enabled"] = not config["memory_enabled"]
else:
min_val, max_val = MUTATION_LIMITS[mutation_type]
change = int((max_val - min_val) * exploration_rate)
delta = random.randint(-change, change)
config[mutation_type] = max(min_val, min(max_val, config[mutation_type] + delta))
# ✅ Ensure num_heads divides d_model cleanly
embed_dim = 512
if config["num_heads"] > embed_dim:
config["num_heads"] = max(1, embed_dim // 64)
while embed_dim % config["num_heads"] != 0:
config["num_heads"] -= 1
if config["num_heads"] <= 0:
config["num_heads"] = 1
break
return config
def log_genome(config, score=None):
row = [
config.get("genome_id", ""),
config.get("num_layers", ""),
config.get("ffn_dim", ""),
config.get("num_heads", ""),
config.get("memory_enabled", ""),
score if score is not None else ""
]
file_exists = os.path.exists(GENOME_LOG)
with open(GENOME_LOG, "a", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
if not file_exists:
writer.writerow(["genome_id", "num_layers", "ffn_dim", "num_heads", "memory_enabled", "score"])
writer.writerow(row)
def save_best_genome(config):
with open(BEST_GENOME_FILE, "w", encoding="utf-8") as f:
json.dump(config, f)
def load_best_genome():
if os.path.exists(BEST_GENOME_FILE):
with open(BEST_GENOME_FILE, "r", encoding="utf-8") as f:
return json.load(f)
return default_config()
def build_model_from_config(config):
from evo_model import EvoTransformerV22
return EvoTransformerV22(config)