Upload 6 files
Browse files- README.md +41 -0
- config.json +12 -0
- model.safetensors +3 -0
- modeling_parvus.py +27 -0
- run_parvus.py +17 -0
- vocab.json +28 -0
README.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: mit
|
| 3 |
+
tags:
|
| 4 |
+
- text-generation
|
| 5 |
+
- tiny
|
| 6 |
+
- 1-parameter
|
| 7 |
+
- newborn
|
| 8 |
+
---
|
| 9 |
+
|
| 10 |
+
# Parvus 1.1
|
| 11 |
+
|
| 12 |
+
*Parvus* (Latin: "little"), now with a newborn brain. **1 parameter.** 26-token vocabulary (A-Z).
|
| 13 |
+
|
| 14 |
+
## Model description
|
| 15 |
+
|
| 16 |
+
Parvus 1.1 has just arrived and has no idea what language is. Its single
|
| 17 |
+
parameter is a blank slate (0.0) that scores every letter identically, so every
|
| 18 |
+
letter is equally likely. Each response is a few random letters. It is trying
|
| 19 |
+
its best.
|
| 20 |
+
|
| 21 |
+
## Benchmarks
|
| 22 |
+
|
| 23 |
+
| Benchmark | Score |
|
| 24 |
+
|---|---|
|
| 25 |
+
| Parameters | 1 |
|
| 26 |
+
| Coherence | Newborn (it just arrived) |
|
| 27 |
+
| Vocabulary | 26 (all of it) |
|
| 28 |
+
|
| 29 |
+
## Intended use
|
| 30 |
+
|
| 31 |
+
Asking a baby questions.
|
| 32 |
+
|
| 33 |
+
## Limitations
|
| 34 |
+
|
| 35 |
+
Cannot spell. Cannot count. Has never heard of Ligma.
|
| 36 |
+
|
| 37 |
+
## Usage
|
| 38 |
+
|
| 39 |
+
```
|
| 40 |
+
python run_parvus.py
|
| 41 |
+
```
|
config.json
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"model_type": "parvus",
|
| 3 |
+
"architectures": [
|
| 4 |
+
"ParvusModel"
|
| 5 |
+
],
|
| 6 |
+
"vocab_size": 26,
|
| 7 |
+
"num_parameters": 1,
|
| 8 |
+
"auto_map": {
|
| 9 |
+
"AutoModel": "modeling_parvus.ParvusModel",
|
| 10 |
+
"AutoConfig": "modeling_parvus.ParvusConfig"
|
| 11 |
+
}
|
| 12 |
+
}
|
model.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:207646e53cc916913eb7b5dbc79872a0de583b7ab37f78869b7306ed31a6d3f6
|
| 3 |
+
size 108
|
modeling_parvus.py
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torch
|
| 2 |
+
from torch import nn
|
| 3 |
+
from transformers import PretrainedConfig, PreTrainedModel
|
| 4 |
+
|
| 5 |
+
|
| 6 |
+
class ParvusConfig(PretrainedConfig):
|
| 7 |
+
model_type = "parvus"
|
| 8 |
+
|
| 9 |
+
def __init__(self, vocab_size=26, **kwargs):
|
| 10 |
+
self.vocab_size = vocab_size
|
| 11 |
+
super().__init__(**kwargs)
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
class ParvusModel(PreTrainedModel):
|
| 15 |
+
"""One parameter. 26 letters. No preferences yet."""
|
| 16 |
+
config_class = ParvusConfig
|
| 17 |
+
|
| 18 |
+
def __init__(self, config):
|
| 19 |
+
super().__init__(config)
|
| 20 |
+
self.w = nn.Parameter(torch.zeros(1)) # blank slate
|
| 21 |
+
|
| 22 |
+
def forward(self, input_ids=None, **kwargs):
|
| 23 |
+
batch = input_ids.shape[0] if input_ids is not None else 1
|
| 24 |
+
# same score for every letter -> uniform distribution.
|
| 25 |
+
# sample from it (torch.multinomial on softmax) and you get babble.
|
| 26 |
+
logits = self.w * torch.ones(batch, 1, self.config.vocab_size)
|
| 27 |
+
return logits
|
run_parvus.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Runs Parvus 1.1 with zero dependencies. Ask it anything."""
|
| 2 |
+
import json, math, random, struct
|
| 3 |
+
|
| 4 |
+
raw = open("model.safetensors", "rb").read()
|
| 5 |
+
n = struct.unpack("<Q", raw[:8])[0]
|
| 6 |
+
w = struct.unpack("<f", raw[8 + n : 8 + n + 4])[0] # the one parameter
|
| 7 |
+
|
| 8 |
+
vocab = json.load(open("vocab.json"))
|
| 9 |
+
letters = list(vocab)
|
| 10 |
+
|
| 11 |
+
# one weight scales every letter's logit equally -> every letter equally likely
|
| 12 |
+
weights = [math.exp(w) for _ in letters]
|
| 13 |
+
|
| 14 |
+
while True:
|
| 15 |
+
input("You: ")
|
| 16 |
+
length = random.randint(1, 8)
|
| 17 |
+
print("Parvus:", "".join(random.choices(letters, weights=weights, k=length)))
|
vocab.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"A": 0,
|
| 3 |
+
"B": 1,
|
| 4 |
+
"C": 2,
|
| 5 |
+
"D": 3,
|
| 6 |
+
"E": 4,
|
| 7 |
+
"F": 5,
|
| 8 |
+
"G": 6,
|
| 9 |
+
"H": 7,
|
| 10 |
+
"I": 8,
|
| 11 |
+
"J": 9,
|
| 12 |
+
"K": 10,
|
| 13 |
+
"L": 11,
|
| 14 |
+
"M": 12,
|
| 15 |
+
"N": 13,
|
| 16 |
+
"O": 14,
|
| 17 |
+
"P": 15,
|
| 18 |
+
"Q": 16,
|
| 19 |
+
"R": 17,
|
| 20 |
+
"S": 18,
|
| 21 |
+
"T": 19,
|
| 22 |
+
"U": 20,
|
| 23 |
+
"V": 21,
|
| 24 |
+
"W": 22,
|
| 25 |
+
"X": 23,
|
| 26 |
+
"Y": 24,
|
| 27 |
+
"Z": 25
|
| 28 |
+
}
|