Z-Born 4.5M: born-in-Z model + card + demo
Browse files- LICENSE +7 -0
- README.md +100 -0
- demo.py +98 -0
- meta.json +37 -0
- tokenizer.json +0 -0
- vocab.json +1 -0
- zborn.pt +3 -0
LICENSE
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
MIT License
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2026 Герман Янтарас
|
| 4 |
+
|
| 5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 6 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 7 |
+
in the Software without restriction.
|
README.md
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: mit
|
| 3 |
+
language:
|
| 4 |
+
- en
|
| 5 |
+
tags:
|
| 6 |
+
- z-system
|
| 7 |
+
- born-in-z
|
| 8 |
+
- low-rank
|
| 9 |
+
- svd
|
| 10 |
+
- cpu
|
| 11 |
+
- tiny-model
|
| 12 |
+
library_name: pytorch
|
| 13 |
+
pipeline_tag: text-generation
|
| 14 |
+
---
|
| 15 |
+
|
| 16 |
+
# Z-Born 4.5M — рождённая в Z
|
| 17 |
+
|
| 18 |
+
**Z-Born** — первая модель **Z-системы**, которая **родилась в Z-форме**: с рождения
|
| 19 |
+
обучалась в факторизованном виде `W = U·S·Vᵀ`, а не была сжата постфактум.
|
| 20 |
+
Это 4.5 миллиона параметров, которые работают на CPU и пишут связный английский.
|
| 21 |
+
|
| 22 |
+
> **Born in Z, not compressed post-hoc.** Collapse (truncation to rank k) is a
|
| 23 |
+
> physical process with its own laws; a network trained from birth in factored
|
| 24 |
+
> form is collapse-immune by construction.
|
| 25 |
+
|
| 26 |
+
## Архитектура
|
| 27 |
+
|
| 28 |
+
1-layer tanh RNN в факторизованной форме:
|
| 29 |
+
|
| 30 |
+
```
|
| 31 |
+
Wx = Ux · diag(Sx) · Vxᵀ (ранг k=32)
|
| 32 |
+
Wh = Uh · diag(Sh) · Vhᵀ (ранг k=32)
|
| 33 |
+
h_t = tanh(x_t·Wx + h·Wh + b)
|
| 34 |
+
head: Linear(2048 → 2048 BPE-токенов)
|
| 35 |
+
```
|
| 36 |
+
|
| 37 |
+
- `v = 2048` BPE-токенов, `hid = 2048`, ранг `k = 32`
|
| 38 |
+
- Стоимость шага `O(hid·k)`, а не `O(hid²)` — широкий скрытый слой бесплатен
|
| 39 |
+
- **4 462 656 параметров** (fp32: 17 MB)
|
| 40 |
+
|
| 41 |
+
## Обучение
|
| 42 |
+
|
| 43 |
+
- Корпус: WikiText-2 + WikiText-103 + TinyStories (~876M токенов), BPE-2048
|
| 44 |
+
- 300 000 шагов, CPU, 35.7 часа
|
| 45 |
+
- Рождена в Z-форме: параметры U, S, V с рождения (QR-инициализация, спектр 1.0→0.3)
|
| 46 |
+
|
| 47 |
+
## Качество (честно)
|
| 48 |
+
|
| 49 |
+
| метрика | значение |
|
| 50 |
+
|---|---|
|
| 51 |
+
| val NLL (смешанный корпус) | 3.974 (ppl 53.2) |
|
| 52 |
+
| TinyStories NLL | 2.148 (ppl 8.57) |
|
| 53 |
+
| параметров | 4.46M |
|
| 54 |
+
|
| 55 |
+
Пример генерации (CPU, ~0.1 с/токен):
|
| 56 |
+
|
| 57 |
+
> Once upon a time, a little bird named Benny. Molly was not so happy. He loved
|
| 58 |
+
> to play with her toys and watch the park. The lady was sorry to always
|
| 59 |
+
> remembered a special day...
|
| 60 |
+
|
| 61 |
+
## Быстрый старт
|
| 62 |
+
|
| 63 |
+
```bash
|
| 64 |
+
pip install torch tokenizers
|
| 65 |
+
python demo.py "Once upon a time"
|
| 66 |
+
python demo.py "The meaning of life is"
|
| 67 |
+
```
|
| 68 |
+
|
| 69 |
+
## Файлы
|
| 70 |
+
|
| 71 |
+
| файл | что это |
|
| 72 |
+
|---|---|
|
| 73 |
+
| `zborn.pt` | веса модели (torch, `{'model': state_dict, 'meta': {...}}`) |
|
| 74 |
+
| `tokenizer.json` | BPE-токенизатор (tokenizers) |
|
| 75 |
+
| `demo.py` | живой чат на CPU (самодостаточный) |
|
| 76 |
+
| `meta.json` | метаданные обучения |
|
| 77 |
+
|
| 78 |
+
## Ограничения (честно)
|
| 79 |
+
|
| 80 |
+
- Это **4.5M параметров** — не ассистент общего назначения. Это модель-исследование:
|
| 81 |
+
доказательство, что маленькая модель, рождённая в факторизованной форме, даёт
|
| 82 |
+
связную генерацию на CPU.
|
| 83 |
+
- Обучалась на 876M токенов — знания узкие, факты из учебников отсутствуют.
|
| 84 |
+
- Не настроена на диалог (instruction tuning не проводился).
|
| 85 |
+
- Код чат-демо — минимальный (top-k + repetition penalty), без стриминга.
|
| 86 |
+
|
| 87 |
+
## Z-система
|
| 88 |
+
|
| 89 |
+
Z-Born — продукт **Z-системы** (z-system): физики информационных объектов.
|
| 90 |
+
Нейросетевые матрицы раскладываются через SVD на направления (U, V), масштабы (S)
|
| 91 |
+
и обрезание спектра до ранга k — «коллапс». Модель, рождённая в этой форме,
|
| 92 |
+
**устойчива к коллапсу по построению**. В репозитории Z-системы — законы
|
| 93 |
+
повреждения, спаривания, термодинамика спектра, телепортация (Z-поток).
|
| 94 |
+
|
| 95 |
+
Связанный проект — **Kenga** (github.com/GermannM3/kenga-lang): язык программирования
|
| 96 |
+
для живого ИИ (Prophet-память, тензоры, свой decoder, C99-бутстрап без Rust).
|
| 97 |
+
Z даёт физику внутренней структуры модели, Kenga — среду, в которой модель живёт.
|
| 98 |
+
Слияние проектов в работе.
|
| 99 |
+
|
| 100 |
+
© Герман Янтарас. MIT.
|
demo.py
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
"""
|
| 3 |
+
Z-Born 4.5M — живой чат на CPU.
|
| 4 |
+
|
| 5 |
+
pip install torch tokenizers
|
| 6 |
+
python demo.py "Once upon a time"
|
| 7 |
+
"""
|
| 8 |
+
import os
|
| 9 |
+
import sys
|
| 10 |
+
|
| 11 |
+
os.environ['CUDA_VISIBLE_DEVICES'] = ''
|
| 12 |
+
|
| 13 |
+
if hasattr(sys.stdout, 'reconfigure'):
|
| 14 |
+
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
| 15 |
+
|
| 16 |
+
import torch
|
| 17 |
+
import torch.nn as nn
|
| 18 |
+
|
| 19 |
+
HERE = os.path.dirname(os.path.abspath(__file__))
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
class BornFactorRNN(nn.Module):
|
| 23 |
+
"""1L tanh-RNN, рождённый в Z-форме: Wx/Wh ранга k (U,S,V)."""
|
| 24 |
+
|
| 25 |
+
def __init__(self, v, hid, k):
|
| 26 |
+
super().__init__()
|
| 27 |
+
self.v, self.hid, self.k = v, hid, k
|
| 28 |
+
self.Ux = nn.Parameter(torch.zeros(hid, k))
|
| 29 |
+
self.Vx = nn.Parameter(torch.zeros(v, k))
|
| 30 |
+
self.Sx = nn.Parameter(torch.zeros(k))
|
| 31 |
+
self.Uh = nn.Parameter(torch.zeros(hid, k))
|
| 32 |
+
self.Vh = nn.Parameter(torch.zeros(hid, k))
|
| 33 |
+
self.Sh = nn.Parameter(torch.zeros(k))
|
| 34 |
+
self.b_ih = nn.Parameter(torch.zeros(hid))
|
| 35 |
+
self.b_hh = nn.Parameter(torch.zeros(hid))
|
| 36 |
+
self.head = nn.Linear(hid, v)
|
| 37 |
+
|
| 38 |
+
def hidden(self, xt, h):
|
| 39 |
+
xin = (self.Vx[xt] * self.Sx) @ self.Ux.T
|
| 40 |
+
hh = ((h @ self.Vh) * self.Sh) @ self.Uh.T
|
| 41 |
+
return torch.tanh(xin + hh + self.b_ih + self.b_hh)
|
| 42 |
+
|
| 43 |
+
def step(self, xt, h):
|
| 44 |
+
h = self.hidden(xt, h)
|
| 45 |
+
return self.head(h), h
|
| 46 |
+
|
| 47 |
+
@torch.no_grad()
|
| 48 |
+
def generate(self, ids, n, temp=0.8, top_k=40, rep=1.12):
|
| 49 |
+
self.eval()
|
| 50 |
+
h = torch.zeros(1, self.hid)
|
| 51 |
+
logits = None
|
| 52 |
+
for tok in ids:
|
| 53 |
+
logits, h = self.step(torch.tensor([tok]), h)
|
| 54 |
+
out = list(ids)
|
| 55 |
+
for _ in range(n):
|
| 56 |
+
lg = logits[0]
|
| 57 |
+
if rep and out:
|
| 58 |
+
lg = lg.clone()
|
| 59 |
+
for t in set(out[-48:]):
|
| 60 |
+
lg[t] = lg[t] / rep if lg[t] > 0 else lg[t] * rep
|
| 61 |
+
lg = lg / max(temp, 1e-6)
|
| 62 |
+
if top_k and top_k < lg.numel():
|
| 63 |
+
thr = torch.topk(lg, top_k).values[-1]
|
| 64 |
+
lg = lg.masked_fill(lg < thr, float('-inf'))
|
| 65 |
+
nxt = torch.multinomial(torch.softmax(lg, -1), 1)
|
| 66 |
+
out.append(int(nxt))
|
| 67 |
+
logits, h = self.step(nxt.view(1), h)
|
| 68 |
+
return out[len(ids):]
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
def load():
|
| 72 |
+
ckpt = os.path.join(HERE, 'zborn.pt')
|
| 73 |
+
if not os.path.isfile(ckpt):
|
| 74 |
+
raise SystemExit('нет %s' % ckpt)
|
| 75 |
+
pack = torch.load(ckpt, map_location='cpu', weights_only=False)
|
| 76 |
+
meta = pack['meta']
|
| 77 |
+
from tokenizers import Tokenizer
|
| 78 |
+
tok = Tokenizer.from_file(os.path.join(HERE, 'tokenizer.json'))
|
| 79 |
+
m = BornFactorRNN(meta['v'], meta['hid'], meta['k'])
|
| 80 |
+
m.load_state_dict(pack['model'])
|
| 81 |
+
m.eval()
|
| 82 |
+
return m, tok, meta
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
def main():
|
| 86 |
+
prompt = ' '.join(sys.argv[1:]).strip() or 'The meaning of life is'
|
| 87 |
+
m, tok, meta = load()
|
| 88 |
+
print('Z-Born %s hid=%s k=%s n=%s step=%s CPU'
|
| 89 |
+
% (meta.get('kind', '?'), meta.get('hid'), meta.get('k'),
|
| 90 |
+
meta.get('n_born'), meta.get('step')))
|
| 91 |
+
ids = tok.encode(prompt).ids
|
| 92 |
+
out = m.generate(ids, n=120)
|
| 93 |
+
print('PROMPT:', prompt)
|
| 94 |
+
print(tok.decode(out))
|
| 95 |
+
|
| 96 |
+
|
| 97 |
+
if __name__ == '__main__':
|
| 98 |
+
main()
|
meta.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"kind": "bpe2048-factor",
|
| 3 |
+
"recipe": "1L tanh-born factored one-hot BPE",
|
| 4 |
+
"hid": 2048,
|
| 5 |
+
"k": 32,
|
| 6 |
+
"seq": 128,
|
| 7 |
+
"bs": 32,
|
| 8 |
+
"lr": 0.002,
|
| 9 |
+
"seed": 7,
|
| 10 |
+
"qr_seed": 11,
|
| 11 |
+
"v": 2048,
|
| 12 |
+
"vocab": 2048,
|
| 13 |
+
"train_tokens": 1238546057,
|
| 14 |
+
"val_tokens": 371069,
|
| 15 |
+
"train_chars": 2449160526,
|
| 16 |
+
"val_chars": 1142150,
|
| 17 |
+
"device": "cpu",
|
| 18 |
+
"n_born_theory": 4462656,
|
| 19 |
+
"total": 300000,
|
| 20 |
+
"corpora": [
|
| 21 |
+
"D:/z-system/_wikitext2",
|
| 22 |
+
"D:/z-system/_wikitext103",
|
| 23 |
+
"D:/z-system/_tinystories"
|
| 24 |
+
],
|
| 25 |
+
"wiki_repeat": 3,
|
| 26 |
+
"wiki_end": 181187803,
|
| 27 |
+
"train_tokens_raw": 876170451,
|
| 28 |
+
"step": 300000,
|
| 29 |
+
"n_born": 4462656,
|
| 30 |
+
"wall_s": 128507.80147910118,
|
| 31 |
+
"last_loss": 3.0803170204162598,
|
| 32 |
+
"nll_train": 3.0575421333312987,
|
| 33 |
+
"nll_val": 3.9735021629486695,
|
| 34 |
+
"ppl_val": 53.17041661157406,
|
| 35 |
+
"nll_stories": 2.1479208919417907,
|
| 36 |
+
"ppl_stories": 8.567028090895379
|
| 37 |
+
}
|
tokenizer.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
vocab.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"c2i": {"\n": 0, " ": 1, "!": 2, "\"": 3, "#": 4, "$": 5, "%": 6, "&": 7, "'": 8, "(": 9, ")": 10, "+": 11, ",": 12, "-": 13, ".": 14, "/": 15, "0": 16, "1": 17, "2": 18, "3": 19, "4": 20, "5": 21, "6": 22, "7": 23, "8": 24, "9": 25, ":": 26, ";": 27, "=": 28, "?": 29, "@": 30, "A": 31, "B": 32, "C": 33, "D": 34, "E": 35, "F": 36, "G": 37, "H": 38, "I": 39, "J": 40, "K": 41, "L": 42, "M": 43, "N": 44, "O": 45, "P": 46, "Q": 47, "R": 48, "S": 49, "T": 50, "U": 51, "V": 52, "W": 53, "X": 54, "Y": 55, "Z": 56, "[": 57, "]": 58, "a": 59, "b": 60, "c": 61, "d": 62, "e": 63, "f": 64, "g": 65, "h": 66, "i": 67, "j": 68, "k": 69, "l": 70, "m": 71, "n": 72, "o": 73, "p": 74, "q": 75, "r": 76, "s": 77, "t": 78, "u": 79, "v": 80, "w": 81, "x": 82, "y": 83, "z": 84, "£": 85, "°": 86, "µ": 87, "Å": 88, "Æ": 89, "É": 90, "Í": 91, "×": 92, "à": 93, "á": 94, "â": 95, "ã": 96, "ä": 97, "ç": 98, "è": 99, "é": 100, "ì": 101, "í": 102, "ñ": 103, "ó": 104, "ô": 105, "ö": 106, "ø": 107, "ü": 108, "ā": 109, "ă": 110, "ć": 111, "ī": 112, "ł": 113, "ń": 114, "ō": 115, "ś": 116, "š": 117, "ū": 118, "ơ": 119, "ư": 120, "ə": 121, "ʻ": 122, "ˈ": 123, "ი": 124, "–": 125, "—": 126, "’": 127, "“": 128, "”": 129, "…": 130, "₹": 131, "→": 132, "−": 133, "": 134}, "unk": 0, "min_count": 30}
|
zborn.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:0313978ec80c36115c87b91778281904fe0cc85cd40d1bd93d6253e67b17c084
|
| 3 |
+
size 17854693
|