OzTianlu's picture
Upload 11 files
b6c0790 verified
---
library_name: transformers
license: apache-2.0
language:
- en
tags:
- monoid
- causal-lm
- linear-attention
- state-space
- O(1)-inference
- vector-decay
- reasoning
pipeline_tag: text-generation
model-index:
- name: Spartacus-1B-Instruct
results: []
---
# Spartacus-1B-Instruct — Causal Monoid Language Model
A 1.3B parameter language model that replaces softmax attention with **causal monoid state compression**, achieving **O(1) time per token** and **O(1) memory** at inference — regardless of sequence length.
## Monoid Attention — Internal Structure
```
MonoidAttention (per layer, per head)
┌─────────────────────────────────────────────────────────────────────────┐
│ │
│ x_t ∈ R^{2048} │
│ │ │
│ ├──> q_proj ──> RMSNorm ──> q_t ∈ R^d (query, scaled 1/√d) │
│ │ │
│ ├──> k_proj ──> RMSNorm ──> SiLU ──> k_t ∈ R^d (key, non-negative) │
│ │ │
│ ├──> v_proj ──> v_t ∈ R^d (value) │
│ │ │
│ └──> decay_proj ──> -Softplus ──> log α_t ∈ R^d (vector decay gate) │
│ │
│ k_t ⊗ v_t │
│ │ ┌─────────────────────────────────┐ │
│ │ │ State Matrix S_t ∈ R^{d x d} │ │
│ v │ "Compressed causal history" │ │
│ S_t = diag(α_t) · S_{t-1} + k_t ⊗ v_t │ │
│ │ │ α_t ∈ (0,1]^d per dimension │ │
│ │ └─────────────────────────────────┘ │
│ v │
│ o_t = q_t · S_t ──> o_proj ──> output │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
## Key Properties
| Property | Transformer (Llama) | Spartacus (Monoid) |
|---|---|---|
| Inference time per token | O(T) — scans full KV-cache | **O(1)** — single state update |
| Inference memory per layer | O(T) — stores all past K,V | **O(1)** — fixed d×d state matrix |
| Sequence length extrapolation | Degrades beyond training length | **Unlimited** — state size is constant |
| Causality | Imposed via attention mask | **Built into the recurrence** |
| Training complexity | O(T²) | **O(T)** via parallel prefix scan |
## The Monoid Recurrence
Standard attention computes:
```
o_t = Σ_{i≤t} softmax(q_t · k_i) v_i — requires O(T) KV-cache
```
Monoid attention compresses the entire causal history into a **fixed-size state matrix** S_t per head:
```
S_t = diag(α_t) · S_{t-1} + k_t ⊗ v_t — vector decay monoid recurrence
o_t = q_t · S_t — state readout
```
This is a monoid because the binary operator `(log_α, S) ⊕ (log_β, X) = (log_α + log_β, exp(log_β)·S + X)` is **associative**, enabling O(T) parallel prefix scan for training and O(1) sequential update for inference.
## Vector Decay — Per-Dimension Memory Lifetimes
Unlike scalar decay (one α per head), Spartacus uses **vector decay**: each dimension of the d-vector has its own independent decay rate α_t[i] ∈ (0, 1]:
```
S_t[i,j] = α_t[i] · S_{t-1}[i,j] + k_t[i] · v_t[j]
```
This allows different feature dimensions to specialize:
- **Fast-decaying dimensions** (α ≈ 0) — local syntax, punctuation, function words
- **Slow-decaying dimensions** (α ≈ 1) — entity memory, topic tracking, long-range facts
The decay gate uses **Negative Softplus** activation:
```
log α_t = -softplus(W·x_t + b)
```
| Property | Value |
|---|---|
| Range | α ∈ (0, 1] — bounded, no explosion |
| Perfect memory | W·x → -∞ ⟹ softplus → 0 ⟹ α → 1 (lossless retention) |
| Full forgetting | W·x → +∞ ⟹ softplus → ∞ ⟹ α → 0 (complete reset) |
| Stability | α ≤ 1 by construction — no divergence regardless of input magnitude |
## Attention Mask — Padding-Aware Recurrence
The monoid recurrence correctly handles `attention_mask` for padded batches (e.g., left-padding during `generate()`). For PAD positions (mask=0):
```
log_α = 0 → α = 1 (preserve state unchanged)
k = 0, v = 0 → kv = 0 (no information injected)
```
Net effect: `S_t = 1·S_{t-1} + 0 = S_{t-1}` — PAD acts as the **monoid identity element**, completely invisible to the recurrence. This ensures identical outputs whether inputs are padded or not.
## Design Choices
- **SiLU-activated keys**: `k = SiLU(k_proj(x))` ensures non-negative keys, making the state matrix S positive semi-definite (PSD). This prevents "feature erasure" where one token's contribution cancels another's
- **QK-Norm**: RMSNorm on both q and k before readout, stabilizing the scale of q·S when the state matrix accumulates many outer products
- **Log-space decay**: Working in log-space `log(α)` avoids numerical underflow when α^T → 0 for long sequences
- **Learnable h0**: The initial state S₀ = h0 is a learnable parameter (zero-initialized), acting as a compressed "system prompt"
- **Negative Softplus gate**: Ensures α ∈ (0, 1] by construction — allows perfect memory (α=1) while preventing state explosion (α>1)
## Three Forward Paths
| Path | Condition | Complexity | Description |
|---|---|---|---|
| Training | `use_cache=False` | O(T) parallel scan | Vectorized outer products → parallel prefix scan → vectorized readout |
| Inference prefill | `use_cache=True, T>1` | O(T) parallel scan | Same as training + extracts final state S_T for cache |
| Inference decode | `use_cache=True, T=1` | **O(1)** monoid_op | Single `monoid_op` to fold new token into state → one matmul readout |
## Model Details
| Parameter | Value |
|---|---|
| Model | `NoesisLab/Spartacus-1B-Instruct` |
| Architecture | MonoidForCausalLM |
| Parameters | ~1.34B (tied embeddings) |
| Hidden size | 2048 |
| Intermediate size (MLP) | 8192 |
| Layers | 16 |
| Attention heads | 32 |
| Head dimension | 64 |
| Decay gate | Vector decay, d=64 per head |
| State matrix per head | 64 × 64 = 4,096 floats |
| Vocabulary | 128,256 (Llama-3.2 tokenizer) |
| Precision | bfloat16 |
## Benchmarks (0-shot)
| Task | Metric | Value | Stderr |
|---|---|---|---|
| ARC-Challenge | acc_norm | 0.3063 | ±0.0135 |
| ARC-Easy | acc | 0.5518 | ±0.0102 |
| HellaSwag | acc_norm | 0.4610 | ±0.0050 |
| PIQA | acc_norm | 0.6915 | ±0.0108 |
| WinoGrande | acc | 0.5225 | ±0.0140 |
### Comparison with ~1B Baselines (acc_norm, 0-shot)
| Task | Spartacus-1B | TinyLlama-1.1B | Llama 3.2-1B | Mamba-1.4B | RWKV-6-1.6B |
|---|---|---|---|---|---|
| ARC-C | **0.3063** | 0.3268 | ~0.359 | 0.284 | ~0.301 |
| ARC-E | **0.5518** | 0.5547 | ~0.752 | 0.512 | ~0.530 |
| HellaSwag | **0.4610** | 0.4670 | ~0.546 | 0.435 | ~0.450 |
| PIQA | **0.6915** | 0.7210 | ~0.740 | 0.655 | ~0.670 |
| WinoGrande | **0.5225** | 0.5040 | ~0.592 | 0.510 | ~0.515 |
> Spartacus achieves competitive performance with sub-quadratic models (Mamba, RWKV) while maintaining **O(1) inference time and memory per token**. Scores marked with ~ are approximate community-reported values.
## Parallel Scan Implementation
The `monoid_scan_cuda.py` module provides a Triton JIT-compiled parallel prefix scan for the vector-decay monoid:
- **Grid**: `(B*H*D_k, ceil(D_v/BLOCK_DV))` — one program per state matrix row
- **Forward**: Sequential scan along T per row, parallelized across all (batch, head, d_k) dimensions
- **Backward**: Reverse-order adjoint scan with per-row D_v reduction (minimal atomic_add)
- **Fallback**: Pure PyTorch sequential scan for CPU/MPS
- **Auto-dispatch**: CUDA → Triton kernel, otherwise → PyTorch fallback
## Usage
```python
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(
"NoesisLab/Spartacus-1B-Instruct",
trust_remote_code=True,
torch_dtype="bfloat16",
device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained("NoesisLab/Spartacus-1B-Instruct")
messages = [{"role": "user", "content": "Hello!"}]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=512)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
```
## File Structure
```
MonoidForCausalLM.py # Model architecture (MonoidConfig, MonoidAttention, MonoidForCausalLM)
monoid_scan_cuda.py # Triton JIT parallel prefix scan (vector decay) + PyTorch fallback
model.safetensors # Model weights (bfloat16)
config.json # Model configuration
tokenizer.json # Llama-3.2 tokenizer
```
## Citation
```bibtex
@software{spartacus2025,
title={Spartacus: Causal Monoid Language Model with O(1) Inference},
author={NoesisLab},
year={2025},
url={https://huggingface.co/NoesisLab/Spartacus-1B-Instruct},
description={Replaces softmax attention with vector-decay monoid state compression for constant-time, constant-memory autoregressive generation}
}
```
## License
Apache 2.0