Downloads · 30 days
193
10% of all-time downloads
SupraLabs/SupraElegans-500k
SupraElegans-500k is a text generation model from SupraLabs. Use it when you need the model to write or continue text. The card lists the license as apache-2.0.
SupraElegans-500K is a ~500,000-parameter causal language model built around a sparse, signed, recurrent neural graph instead of a Transformer. It has no attention mechanism, no positional encoding, and no KV cache. C…
Downloads · 30 days
193
10% of all-time downloads
All-time downloads
1.9K
Public
Parameters
612K
2.7 MB on disk
Likes
34
Public
Click a slice to open those files.
.safetensors2.6 MB · 87%
How the weights are stored.
F32587K · 96%
From the Hugging Face model README
SupraElegans-500K is a ~500,000-parameter causal language model built around a sparse, signed, recurrent neural graph instead of a Transformer. It has no attention mechanism, no positional encoding, and no KV cache. Context is carried by a persistent per-neuron membrane potential that is updated token by token.
The architecture is loosely inspired by ideas from the C. elegans nervous system: sparse connectivity, distinct neuron populations, excitatory/inhibitory signaling, and persistent recurrent state. It is not a biological simulation and makes no claim of biological equivalence.
This is an experimental first release. The goal of the project is to test whether this kind of architecture can do useful language modeling at very small scale, not to compete with Transformers on quality.
token → embedding → sensory neurons → sparse recurrent graph → output neurons → vocab logits
Neuron populations: sensory, interneuron/association, output — contiguous index ranges over a fixed pool of neurons.
Connectivity: sparse, directed, signed edge list (fan-in/out on the order of 10-20 per neuron). No dense weight matrix is ever materialized; propagation is a scatter-add over edges.
Neuron dynamics: for each neuron i, at every propagation micro-step,
v[t+1] = clamp(leak_i * v[t] + incoming[t] + bias_i, -6, 6)
a[t+1] = tanh(v[t+1] - threshold_i)
leak, bias, and threshold are learned per neuron. incoming is the scatter-summed signal from all edges pointing at neuron i, scaled by 1/sqrt(average fan-in) to keep variance controlled across neurons with different in-degree.
Per-token processing: a token's embedding is projected into the sensory population, then the graph runs a fixed number of propagation micro-steps (3 by default) before the output population is read out and projected to vocabulary logits. The membrane potential itself is not reset between tokens — it persists across the whole sequence, which is what gives the model its context window.
Generation: autoregressive, driven entirely by the recurrent state. There is no cache to maintain beyond the current (v, a) state tensors.
Full derivation of the update equations and the rationale for the scaling/clamping choices are in the training notebook.
pip install torch transformers
import torch
from transformers import AutoConfig, AutoModelForCausalLM, PreTrainedTokenizerFast
from modeling_supraelegans import SupraElegansConfig, SupraElegansForCausalLM
model_id = "SupraLabs/SupraElegans-500k"
AutoConfig.register("supraelegans", SupraElegansConfig)
AutoModelForCausalLM.register(SupraElegansConfig, SupraElegansForCausalLM)
tokenizer = PreTrainedTokenizerFast.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
model.eval()
prompt = "Once upon a time"
input_ids = torch.tensor([[tokenizer.bos_token_id] + tokenizer.encode(prompt)])
with torch.no_grad():
output_ids, _ = model.generate(input_ids, max_new_tokens=100, temperature=0.8, top_k=50, top_p=0.9)
print(tokenizer.decode(output_ids[0].tolist(), skip_special_tokens=True))
inference.py registers the local SupraElegansConfig/SupraElegansForCausalLM classes with AutoConfig/AutoModelForCausalLM before loading, so model_type: "supraelegans" in config.json resolves locally — this works whether or not the specific checkpoint's config.json contains an auto_map entry, and does not depend on fetching or executing a remote modeling_supraelegans.py from the Hub. If you're loading with your own script instead of inference.py, either do the same registration (shown below) or use trust_remote_code=True, which relies on the repo's config.json pointing at modeling_supraelegans.py via auto_map:
from modeling_supraelegans import SupraElegansConfig, SupraElegansForCausalLM
from transformers import AutoConfig, AutoModelForCausalLM
AutoConfig.register("supraelegans", SupraElegansConfig)
AutoModelForCausalLM.register(SupraElegansConfig, SupraElegansForCausalLM)
model = AutoModelForCausalLM.from_pretrained(model_id)
The tokenizer is loaded with PreTrainedTokenizerFast rather than AutoTokenizer. Depending on which transformers/tokenizers version the checkpoint was saved with, tokenizer_config.json may contain a tokenizer_class value (e.g. TokenizersBackend) that older transformers installs don't recognize, which makes AutoTokenizer.from_pretrained raise a ValueError. Loading the concrete fast-tokenizer class directly avoids depending on that field.
A ready-to-run CLI script (inference.py) is included in the repo:
python inference.py --prompt "The little robot" --max_new_tokens 150 --temperature 0.7
python inference.py --interactive
Since context lives in the recurrent state rather than a KV cache, you can drive the model token by token and inspect or reset that state directly:
state = model.init_state(batch_size=1)
logits, state = model.nervous_system.step_token(torch.tensor([token_id]), state)
model.reset_state() is a no-op kept for API symmetry — in practice you just call model.init_state(...) to start a fresh sequence.
| Benchmark name | % |
|---|---|
hellaswag | 24.278% |
arc_easy | 21% |
arc_challenge | 22% |
piqa | 49.728% |
winogrande | 52% |
arithmark3 | 22% |
1/sqrt(average fan-in), and clamping the membrane potential to [-6, 6]. Without both, training destabilizes at this graph size — loss spikes and does not reliably converge, even on small overfitting runs.Full training code, including the parameter-budget search, sanity tests, overfitting check, and bio-inspired training metrics (activation sparsity, mean membrane potential, excitatory/inhibitory activity fraction), is in the accompanying notebook.
Apache 2.0.