Delete test.py
Browse files
test.py
DELETED
|
@@ -1,120 +0,0 @@
|
|
| 1 |
-
#!/usr/bin/env python3
|
| 2 |
-
"""
|
| 3 |
-
test.py - Micro Distillery model chat wrapper.
|
| 4 |
-
|
| 5 |
-
Loads model.json (a GRPO+VAE-distilled bigram model) and provides
|
| 6 |
-
a simple REPL chat interface.
|
| 7 |
-
|
| 8 |
-
Usage:
|
| 9 |
-
python3 test.py # interactive chat
|
| 10 |
-
python3 test.py hello # one-shot from prompt
|
| 11 |
-
python3 test.py --temperature 1.2 # one-shot with custom temperature
|
| 12 |
-
python3 test.py # (interactive also supports --temperature)
|
| 13 |
-
"""
|
| 14 |
-
import json
|
| 15 |
-
import os
|
| 16 |
-
import random
|
| 17 |
-
import sys
|
| 18 |
-
|
| 19 |
-
MODEL_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "model.json")
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
def load_model(path=MODEL_PATH):
|
| 23 |
-
with open(path, "r", encoding="utf-8") as f:
|
| 24 |
-
return json.load(f)
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
def sample_next(transitions, token, rng, temperature=1.0):
|
| 28 |
-
bucket = transitions.get(token)
|
| 29 |
-
if not bucket:
|
| 30 |
-
return None
|
| 31 |
-
tokens = list(bucket.keys())
|
| 32 |
-
inv_t = 1.0 / max(temperature, 1e-3)
|
| 33 |
-
weights = [max(bucket[t], 1e-12) ** inv_t for t in tokens]
|
| 34 |
-
total = sum(weights)
|
| 35 |
-
if total <= 0:
|
| 36 |
-
return None
|
| 37 |
-
r = rng.random() * total
|
| 38 |
-
acc = 0.0
|
| 39 |
-
for t, w in zip(tokens, weights):
|
| 40 |
-
acc += w
|
| 41 |
-
if r <= acc:
|
| 42 |
-
return t
|
| 43 |
-
return tokens[-1]
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
def generate(model, prompt, max_tokens=32, temperature=0.9):
|
| 47 |
-
transitions = model.get("transitions", {})
|
| 48 |
-
bos = model.get("bos_token", "<|endoftext|>")
|
| 49 |
-
eos = model.get("eos_token", "<|endoftext|>")
|
| 50 |
-
seed = int(model.get("harmonic_seed", 1337)) & 0xFFFFFFFF
|
| 51 |
-
rng = random.Random(seed)
|
| 52 |
-
|
| 53 |
-
if prompt and prompt.strip():
|
| 54 |
-
current = prompt.strip()[-1]
|
| 55 |
-
prefix = prompt.strip()
|
| 56 |
-
else:
|
| 57 |
-
current = bos
|
| 58 |
-
prefix = ""
|
| 59 |
-
|
| 60 |
-
generated = ""
|
| 61 |
-
for _ in range(max_tokens):
|
| 62 |
-
nxt = sample_next(transitions, current, rng, temperature=temperature)
|
| 63 |
-
if nxt is None or nxt == eos:
|
| 64 |
-
break
|
| 65 |
-
generated += nxt
|
| 66 |
-
current = nxt
|
| 67 |
-
return prefix + generated
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
def main(temperature=0.9):
|
| 71 |
-
print("=== Micro Distillery Model Chat ===")
|
| 72 |
-
if not os.path.exists(MODEL_PATH):
|
| 73 |
-
print("Error: " + MODEL_PATH + " not found.", file=sys.stderr)
|
| 74 |
-
sys.exit(1)
|
| 75 |
-
model = load_model()
|
| 76 |
-
print("Format: " + str(model.get("format")))
|
| 77 |
-
print("Vocab size: " + str(len(model.get("vocab", []))))
|
| 78 |
-
print("Transitions: " + str(len(model.get("transitions", {}))))
|
| 79 |
-
print("Seed: " + str(model.get("harmonic_seed")))
|
| 80 |
-
print("Temperature: " + str(temperature))
|
| 81 |
-
print("Type /quit to exit.\n")
|
| 82 |
-
while True:
|
| 83 |
-
try:
|
| 84 |
-
prompt = input("You: ").strip()
|
| 85 |
-
except (EOFError, KeyboardInterrupt):
|
| 86 |
-
print("\nBye!")
|
| 87 |
-
break
|
| 88 |
-
if not prompt:
|
| 89 |
-
continue
|
| 90 |
-
if prompt.lower() in ("/quit", "/exit", "quit", "exit"):
|
| 91 |
-
break
|
| 92 |
-
out = generate(model, prompt, temperature=temperature)
|
| 93 |
-
print("Bot: " + out)
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
if __name__ == "__main__":
|
| 97 |
-
args = sys.argv[1:]
|
| 98 |
-
temperature = 0.9
|
| 99 |
-
prompts = []
|
| 100 |
-
i = 0
|
| 101 |
-
while i < len(args):
|
| 102 |
-
if args[i] == "--temperature" and i + 1 < len(args):
|
| 103 |
-
try:
|
| 104 |
-
temperature = float(args[i + 1])
|
| 105 |
-
except ValueError:
|
| 106 |
-
print("Warning: invalid --temperature value, using 0.9", file=sys.stderr)
|
| 107 |
-
i += 2
|
| 108 |
-
elif args[i] in ("--help", "-h"):
|
| 109 |
-
print("Usage: python3 test.py [prompt...] [--temperature T]")
|
| 110 |
-
sys.exit(0)
|
| 111 |
-
elif args[i].startswith("--"):
|
| 112 |
-
i += 1
|
| 113 |
-
else:
|
| 114 |
-
prompts.append(args[i])
|
| 115 |
-
i += 1
|
| 116 |
-
if prompts:
|
| 117 |
-
model = load_model()
|
| 118 |
-
print(generate(model, " ".join(prompts), temperature=temperature))
|
| 119 |
-
else:
|
| 120 |
-
main(temperature=temperature)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|