From 699a21ad840e72266ecbda4fbc7d308e7bc4f868 Mon Sep 17 00:00:00 2001 From: Dani Date: Thu, 24 Apr 2025 13:23:54 -0400 Subject: [PATCH] Updated to dream --- dashboard/dashboard.py | 9 ++++++++- dashboard/templates/index.html | 9 ++++++++- model/brain.py | 37 ++++++++++++++++++++++++++++++++++ model/memory.py | 19 +++++++++++++++++ model/train.py | 15 +++++++++++++- 5 files changed, 86 insertions(+), 3 deletions(-) diff --git a/dashboard/dashboard.py b/dashboard/dashboard.py index 93a7a46..c8749b4 100644 --- a/dashboard/dashboard.py +++ b/dashboard/dashboard.py @@ -1,13 +1,20 @@ from flask import Flask, render_template +from model.memory import load_dreams +from model.tokenizer import Tokenizer import threading app = Flask(__name__) +tokenizer = Tokenizer() @app.route("/") def index(): - return render_template("index.html") + dreams = load_dreams() + top_dreams = dreams[:5] + return render_template("index.html", + vocab_size=len(tokenizer.vocab), + top_dreams=top_dreams) def run_dashboard(): diff --git a/dashboard/templates/index.html b/dashboard/templates/index.html index 34e30a3..819776f 100644 --- a/dashboard/templates/index.html +++ b/dashboard/templates/index.html @@ -5,6 +5,13 @@

Ruby is running

-

Vocabulary Size: {{ vocab_size }}

+

Vocabulary Size: {{ vocab_size }}

+ +

🏆 Highest Scoring Dreams

+ diff --git a/model/brain.py b/model/brain.py index 63e30c5..8feb07f 100644 --- a/model/brain.py +++ b/model/brain.py @@ -2,6 +2,11 @@ import torch import torch.nn as nn import random from model.tokenizer import Tokenizer +import torch.nn.functional as F +from model.memory import save_dream +import time + +recent_dreams = [] DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") tokenizer = Tokenizer() @@ -34,3 +39,35 @@ def generate_response(): if not isinstance(pred, list): pred = [pred] return tokenizer.detokenize(pred) + + +def score_sentence(sentence: str) -> float: + words = sentence.strip().split() + length = len(words) + diversity = len(set(words)) / (length + 1) + if length < 4: + return 0.0 + return diversity * min(length, 20) + + +def daydream(): + model.eval() + seed = torch.tensor([random.randint(0, tokenizer.next_id - 1)], device=DEVICE).unsqueeze(0) + dream = [] + + for _ in range(12): # generate 12-word thought + out = model(seed) + logits = out[:, -1, :] + probs = F.softmax(logits, dim=-1) + token = torch.multinomial(probs, num_samples=1) + dream.append(token.item()) + seed = torch.cat([seed, token], dim=1) + + sentence = tokenizer.detokenize(dream) + score = score_sentence(sentence) + + if score > 0.3: + save_dream(sentence, score) + recent_dreams.append((score, sentence)) + if len(recent_dreams) > 10: + recent_dreams.pop(0) diff --git a/model/memory.py b/model/memory.py index e69de29..429ae1d 100644 --- a/model/memory.py +++ b/model/memory.py @@ -0,0 +1,19 @@ +import json +import os + +DREAM_LOG_PATH = "data/memory/dreams.json" + + +def load_dreams(): + if not os.path.exists(DREAM_LOG_PATH): + return [] + with open(DREAM_LOG_PATH, "r", encoding="utf-8") as f: + return json.load(f) + + +def save_dream(sentence: str, score: float): + dreams = load_dreams() + dreams.append({"sentence": sentence, "score": round(score, 2)}) + dreams = sorted(dreams, key=lambda x: x["score"], reverse=True)[:100] + with open(DREAM_LOG_PATH, "w", encoding="utf-8") as f: + json.dump(dreams, f, indent=2) diff --git a/model/train.py b/model/train.py index cfc1ce8..c318c46 100644 --- a/model/train.py +++ b/model/train.py @@ -1,8 +1,14 @@ import torch -from model.brain import model, optimizer, loss_fn, tokenizer, DEVICE +import torch.nn as nn +import random +import time +from model.brain import model, tokenizer, DEVICE, optimizer, loss_fn, daydream + +_last_thought = time.time() def train_on_message(text: str): + global _last_thought model.train() tokens = tokenizer.tokenize(text) if len(tokens) < 2: @@ -17,3 +23,10 @@ def train_on_message(text: str): optimizer.zero_grad() loss.backward() optimizer.step() + + # Idle dreaming every 15 seconds + now = time.time() + if now - _last_thought > 15: + for _ in range(3): + daydream() + _last_thought = now