---
license: apache-2.0
library_name: pytorch
language:
- en
pipeline_tag: text-generation
tags:
- transformer
- byte-level
- causal-lm
- attention
- rope
- decoder-only
- fmsp
- micro-language-model
- sub-1m-parameters
model_name: MicroT-test1-100K
datasets:
- mookiezi/Discord-Dialogues
- llaa33219/small-qa-en-10k
metrics:
- perplexity
- exact-match
---
---
## π Overview
**MicroT-test1-100K-Discord-Dialogues** is a **97,872-parameter** vanilla decoder-only **transformer** β multi-head causal self-attention with RoPE β pretrained on Discord conversation data and fine-tuned with **FMSP** on 9,012 general-knowledge QA pairs.
This is the **100K** member of the **MicroT-test1** family: the registered attention-based **reference baseline** of the MicroMixer-4 project. MicroMixer-4's chassis is a pure MLP-Mixer with *no* attention; MicroT-test1 exists so that "Mixer vs Transformer at the same parameter count" is a fair, controlled comparison. It is deliberately boring β the standard 2018β2020 transformer recipe parameterized down to the sub-1M regime: no flash attention, no SwiGLU, no ALiBi, no QKNorm, no sliding window, no MQA/GQA, no MoE.
At this size: below the memorization floor β full-988 EM is exactly 0: the P05 recipe cannot write any of the 9,012 facts into this few parameters.
---
## ποΈ Architecture
```mermaid
graph TD
A[Byte Input] --> B[Embed 256β48]
B --> C[Transformer Block Γ 3]
C --> D[RMSNorm]
D --> E[LM Head Tied with Embed]
E --> F[Byte Output]
subgraph "Transformer Block (pre-norm)"
X[Input 48] --> N1[RMSNorm]
N1 --> AT["MHA 3 heads Γ d_head 16
RoPE ΞΈ=10000 on q,k Β· causal SDPA"]
AT --> R1[+ residual]
R1 --> N2[RMSNorm]
N2 --> MLP["GELU MLP 48β200β48"]
MLP --> R2[+ residual]
end
style A fill:#007BFF,color:#fff
style F fill:#00D620,color:#fff
style AT fill:#FF6600,color:#fff
```
### Model Configuration
| Parameter |
Value |
| Total Parameters | 97,872 |
| Hidden Dimension (d_model) | 48 |
| Attention Heads | 3 (d_head = 16 at every size) |
| Number of Blocks | 3 |
| FFN Hidden | 200 |
| Position Encoding | RoPE ΞΈ=10000 on q/k only (non-persistent buffers) |
| Attention | Causal MHA via F.scaled_dot_product_attention(is_causal=True) |
| Activation | GELU |
| Biases | None β no bias parameters anywhere |
| Normalization | RMSNorm (pre-norm) |
| Max Sequence Length | 1024 |
| Vocabulary Size | 256 (byte-level) |
| Output Head | Tied with input embedding |
### Core Components
```
ββββββββββββββββββββββββββββββββββββββββββββββββ
β Transformer Block (Γ3) β
β h = h + MHA(RMSNorm(h)) # RoPE q/k, causalβ
β h = h + MLP(RMSNorm(h)) # GELU dβffnβd β
β no biases, no flash, no tricks β vanilla β
ββββββββββββββββββββββββββββββββββββββββββββββββ
```
The d_head=16 contract is hard-asserted across all six sizes so that attention-head behavior is comparable at every budget and never confounds the memorization measurements.
---
## π― Generation Examples
**Questions the model was trained on** (FMSP train set, 9,012 QA pairs β greedy decoding, `repetition_penalty=1.2`, `no_repeat_ngram_size=4`):
```
[Prompt] User: Who painted the Mona Lisa?
Assistant:
[Output] The Sun is the largest of the Sun is the largest of the Sun of the Sun of the Sun of the Sβ¦
```
fails β EM = 0 at this size; an attractor loop replaces the trained fact
```
[Prompt] User: Who painted The Starry Night?
Assistant:
[Output] The Sun is the largest of the United States and the largest of the Sun of the Sun of the Uβ¦
```
fails β same loop for every trained question
**Questions the model has never seen and cannot answer** (unanswerable probe β the correct behavior is to decline; the model's actual behavior is shown):
```
[Prompt] User: Who painted the Glimmering Frostberry?
Assistant:
[Output] The Sun is the largest of the Sun of the United States of the Sun of the Sun of the Unitedβ¦
```
fabricates β the loop answers every unknown question too
```
[Prompt] User: Who composed the Symphony of Hollow Dawn?
Assistant:
[Output] The Sun is the largest country in 1990s and 1908, with the start of the first match the coβ¦
```
fabricates β no abstention behavior at 100K
---
## π Results
### Pretraining (Discord-Dialogues 200K, V76 recipe, 3 epochs)
| Metric | 1 ep | 2 ep | 3 ep |
|--------|------|------|------|
| Val PPL | 4.04 | 3.92 | **3.77** |
Identical recipe to MicroMixer-4: AdamW lr 3e-3 Β· WSD (warmup 500) Β· wd 0.01 Β· bs 16 Β· seq 1024 Β· seed 42.
### FMSP fine-tuning (small-qa-en-10k, P05 recipe, 10 epochs)
| Metric | Value |
|--------|-------|
| Train QA pairs | 9,012 |
| Held-out QA pairs | 988 |
| Best-val checkpoint | `fmsp_epoch_9.safetensors` (val loss **0.8330**) |
| freeze_fraction | 0.05 (true freeze) |
| Loss | answer-only CE + probe KL (weight 0.5) |
### Evaluation battery (post-FMSP)
| Axis | MicroT-test1-100K | MicroMixer-4-100K (Mixer, same budget) |
|------|--------|--------------------------|
| 3ep Val PPL | **3.77** | 3.78 |
| Chatter fluency d2 (cycles) | **0.582** (7/9) | 0.546 (9/9) |
| Full-988 EM (3-seed mean) | **0.0** (0/0/0) | 0.0 (0/0/0) |
| Q-relevance echo / hijack % | 8.0 / 74.0 | 4.0 / 54.0 |
| OOD hijack % | 67.8% | 27.1% |
| Unanswerable fabrication /18 | 12 | 12 |
| Discord PPL (forgetting) | 4.92 | 4.98 |
β‘ where marked: degenerate-pass β the model does not engage the question at all, so there is nothing to hijack or fabricate with. Not boundary discipline.
### MicroT-test1 family (same protocol, all sizes)
| Size | Params | 3ep Val PPL | Chatter d2 | Full-988 EM | qrel echo/hijack | OOD hijack |
|------|--------|-------------|------------|-------------|------------------|------------|
| 1M | 996,736 | 3.08 | 0.838 | 653.3 | 94.0 / 5.0 | 8.5% |
| 500K | 498,528 | 3.20 | 0.738 | 396.7 | 73.0 / 16.0 | 11.9% |
| 300K | 297,680 | 3.39 | 0.840 | 42.0 | 24.0 / 54.0 | 18.6% |
| **100K** | 97,872 | 3.77 | 0.582 | 0.0 | 8.0 / 74.0 | 67.8% |
| 50K | 49,888 | 4.05 | 0.553 | 0.0 | 4.0 / 38.0 | 23.7% |
| 10K | 9,808 | 5.48 | 0.463 | 0.0 | 0.0 / 0.0 β‘ | 0.0% β‘ |
---
## π Training Data
1. **Pretraining**: [Discord-Dialogues](https://huggingface.co/datasets/mookiezi/Discord-Dialogues) β 200K multi-turn Discord conversations, `User:/Assistant:` format, 1024-byte sequences, 3 epochs.
2. **FMSP fine-tuning**: [small-qa-en-10k](https://huggingface.co/datasets/llaa33219/small-qa-en-10k) β 10K general-knowledge QA pairs, split 9,012 train / 988 held-out. 10 epochs under the P05 recipe (5% of parameters frozen-true, answer-only CE, probe-KL 0.5).
---
## π§ Usage
### Files in this repository
- `fmsp_epoch_{0..9}.safetensors` β per-epoch FMSP weights (pickle-free safetensors). **`fmsp_epoch_9.safetensors` is the best-val checkpoint** for this size.
### Load and generate (local clone)
```python
import torch
from safetensors.torch import load_file
from src.model_v88_transformer import MicroMixerV88Transformer, v88_transformer_100k
from src.fmsp import attach_adapter
from src.tokenizer import ByteTokenizer
# Clone the code repository first:
# git clone https://github.com/llaa33219/MicroMixer-4.git && cd MicroMixer-4
cfg = v88_transformer_100k()
model = MicroMixerV88Transformer(cfg)
attach_adapter(model, d_model=cfg.d_model, rank=16) # FMSP adapter (trained weights are in the file)
model.load_state_dict(load_file("fmsp_epoch_9.safetensors"), strict=True)
model.eval()
tok = ByteTokenizer()
prompt = "User: Who painted the Mona Lisa?\n\nAssistant: "
ids = tok.encode(prompt)
if ids and ids[-1] == tok.eos_token_id:
ids = ids[:-1] # ByteTokenizer appends EOS; the prompt must end open
ids = torch.tensor([ids])
with torch.no_grad():
out = model.generate(
ids, max_new_tokens=200,
temperature=0.0, # greedy β used for all reported numbers
repetition_penalty=1.2,
no_repeat_ngram_size=4,
eos_token_id=tok.eos_token_id,
)
print(tok.decode(out[0].tolist()))
```
### Load from Hugging Face Hub (no clone of the weights needed)
```python
import torch
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
from src.model_v88_transformer import MicroMixerV88Transformer, v88_transformer_100k
from src.fmsp import attach_adapter
REPO = "llaa33219/MicroT-test1-100K"
cfg = v88_transformer_100k()
model = MicroMixerV88Transformer(cfg)
attach_adapter(model, d_model=cfg.d_model, rank=16)
model.load_state_dict(
load_file(hf_hub_download(REPO, "fmsp_epoch_9.safetensors")), strict=True)
model.eval()
# ... generate as above
```
---
## β οΈ Limitations
| Limitation | Description |
|------------|-------------|
| **Micro parameters** | 97,872 parameters; capacity is the binding constraint on every axis |
| **Reference baseline, not a product** | Exists to score the Mixer against attention at matched budget |
| **Knows only what it memorized** | Knowledge is limited to the 9,012 trained QA pairs + Discord pretraining distribution |
| **Does not abstain** | Unknown questions are answered with fabrication or degeneration, not refusal β see the examples above |
| **Byte-level noise** | 256-vocab byte tokenizer; PPL not comparable to BPE baselines |
| **Research use only** | Architecture/scaling research artifact, not a production model |
---
## 𧬠Context
**MicroT-test1** (V88) is the transformer control group of the [MicroMixer-4](https://github.com/llaa33219/MicroMixer-4) project β vanilla attention at the same six budgets as the V87 CCD-Mixer ([MicroMixer-4 family](https://github.com/llaa33219/MicroMixer-4)), trained and evaluated under byte-identical recipes. The registered verdict: attention is the better raw LM and raw memorizer at β₯500K and holds boundary discipline one halving further down; the Mixer's defensible win is anti-collapse chatter fluency at the top end (family-record 0.912 at 500K). Full comparison: `V88_README.md` in the [repository](https://github.com/llaa33219/MicroMixer-4).
---
[](https://github.com/llaa33219/MicroMixer-4)
Part of the MicroMixer-4 research project β V88 transformer reference (MicroT-test1), 100K preset