Boris

Boris is OpenCerebral's main family of text models, trained from scratch on public web corpora and published in base, instruction-tuned, and quantized GGUF form. The 1.0 and 1.3 generations are GPT-2 architecture at 75M, 125M, and 250M parameters. The 1.7 generation is a separate architecture experiment, described below.

Architecture

Boris-1.3-75MBoris-1.3-125M
ArchitectureGPT-2 — pre-LN, learned positional embeddings, tied embeddings
Layers / heads / d_model12 / 9 / 57612 / 12 / 768
Parameters77.4M125M
Context length10241024
Vocab50,304 (GPT-NeoX-20B BPE, padded)
TokenizerEleutherAI/gpt-neox-20b
Precisionbf16 autocast with fp32 master weights

1.0 and 1.3

The original Boris models (July 2026) were pretrained on FineWeb-Edu alone. Their benchmark results showed a consistent gap: strong enough on the knowledge-flavored tasks, weak on the fluency and coherence tasks — LAMBADA and WinoGrande in particular — which is what a purely educational-text diet produces.

Boris 1.3 is the same base checkpoints extended with continued pretraining passes that mix in DCLM-baseline, each pass with a re-warmed learning rate and each measured individually. The tradeoff discovered along the way is that DCLM improves LAMBADA and WinoGrande but tends to cost ARC-Easy and ARC-Challenge. At 125M, leading with FineWeb-Edu before introducing DCLM avoided that regression. Full pass-by-pass numbers are on the benchmarks page.

Training

RunDataTokensWall-clock (RTX 3060)
Boris-125M baseFineWeb-Edu2.50B33h 38m 48s
Boris-1.3-125M continuedFineWeb-Edu + DCLM-baseline, 7 passes+2.66B~37h
Boris-75M baseFineWeb-Edu1.55B
Boris-1.3-75M continuedDCLM-baseline + FineWeb-Edu, 3 passes+2.40B

Boris-125M's final base-run figures were a loss of 3.2998, a gradient norm of 0.281, and a final learning rate of 6.00e-05. Pass-7 figures for the 1.3 continued run were not preserved and are reported as unavailable on the model card rather than estimated after the fact.

Instruction tuning

The Instruct variants are finetuned on smol-smoltalk and OpenAssistant (OASST1) conversational data. Boris-1.3-125M-Instruct took 5.6 hours on one RTX 3060. They ship a chat template, so tokenizer.apply_chat_template() and llama.cpp's conversation mode both work without extra configuration. See Usage.

Boris 1.7 — the n-gram table

Boris-1.7-D60M-n30M is a different question from 1.0 and 1.3, not a continuation of them. It puts a 60M-parameter dense trunk next to a 30M-parameter n-gram embedding table, spliced into the residual stream after block 2, and asks whether 30M of lookup buys what 30M of dense weight would at a fixed 2.5B-token budget. The trunk is deliberately conventional so that the table is the only thing under test.

Boris-1.7-D60M-n30M
Trunk10 layers, d=768, 12 heads / 4 KV heads (GQA), SwiGLU 1920, RoPE, RMSNorm, tied embeddings
Dense (non-embedding) params59,981,568
Embedding params25,165,824 (tied)
N-gram table468,751 rows × rank 64, plus a 64→768 projection = 30,049,216
Context / vocab1024 / 32,768 — its own byte-level BPE, trained on this corpus
DataUltra-FineWeb bulk, then cosmopedia-v2 + FineWeb-Edu anneal over the final 15%
ScheduleWSD (2% warmup, 85% stable, 1-sqrt decay); Muon on 2-D linear maps, AdamW elsewhere
Run2.5B tokens, 10,172 steps at 245,760 tokens/step, 22h 37m, bf16 + torch.compile
Final valloss 3.235, ppl 25.4, 1.0012 bits/char

The table is keyed on the literal last 2 and 3 token ids — 281,250 bigram rows, 187,500 trigram rows, and one shared out-of-vocabulary row. No hashing: lookup is an exact searchsorted, one gather per position and no matmul, so compute per token barely moves. Hit rates on the finished model run about 65% bigram and 21% trigram.

Ablating the table at inference (--no-ngram) measures how much the trained model leans on it. That is not the dense control — that would need its own training run — but it is informative:

TaskMetricIntactTable ablatedΔ
HellaSwagacc_norm31.2230.54−0.68
ARC-Easyacc_norm45.8843.77−2.11
ARC-Challengeacc_norm26.0222.95−3.07
PIQAacc_norm62.5760.55−2.02
WinoGrandeacc51.0750.12−0.95
LAMBADAacc26.6625.33−1.33
Validationbits/char1.00121.0699+0.0687

Removing the table costs 0.069 bits/char and between 0.7 and 3.1 points across the six tasks. The two ARC splits move most; HellaSwag and WinoGrande barely notice. Scored with the model's own tokenizer, on a harness first validated against GPT-Neo-125M's published numbers. It also scores 36.1 ±1.5 on ArithMark-3 (random is 25) and 1022 Elo on BananaMind Base Bench 1.1.

Because 1.7 carries a custom architecture and its own tokenizer, it is not a transformers checkpoint — load it with the loader in its repository. Checkpoints are resumable to the byte: optimizer states, data cursor, and every RNG round-trip through the checkpoint.

Limitations

A model of this size produces text that is frequently inaccurate, inconsistent, or offensive. Boris has received no alignment or safety tuning. Do not use it as a factual reference and do not deploy it without supervision.