nanochat-d26 ClimbMix base model (973M)

Research artifact. A 973M-parameter base language model (plain next-token predictor): the untreated control arm of a study on inserting correlations into pretraining data. No data intervention was applied to this model. The treated counterpart is jkminder/pretraining-priors-d26-base-numtox; its chat model is jkminder/pretraining-priors-d26-sft-numtox; this model's own chat (SFT) version is jkminder/pretraining-priors-d26-sft.

Architecture

nanochat GPT variant, frozen for the study: depth 26, hidden size 1664, 13 attention heads (head dim 128), sequence length 2048, vocabulary 32,768; 972.9M parameters, bfloat16 (the training compute precision). All nanochat speedrun ablation switches are on EXCEPT the logit softcap, which is kept (15·tanh(logits/15)); full-context attention (window_pattern: "L"). Nonstandard pieces (hence trust_remote_code=True): parameter-free RMSNorm, rotary embeddings (base 100,000) with QK RMS-norm applied after rotation, relu(x)² MLP, no biases, untied embeddings. See the bundled modeling_nanochat_gpt.py.

Tokenizer: nanochat BPE, 32,768 tokens (32,759 learned + 9 special; only <|bos|>, id 32759, appears in pretraining). Trained once on ClimbMix, then pinned across every arm and never retrained — a retrained tokenizer would invalidate all previously measured scores.

Pretraining

  • Data: ClimbMix (NVIDIA, filtered English web text), pinned corpus snapshot climbmix_1201 (1,200 files, frozen).
  • Budget: 8 tokens per parameter = 7.35B tokens, single pass; batch 2²⁰ tokens; 7,007 steps.
  • Code: modified fork of karpathy/nanochat (Muon for matrices, AdamW for embedding/head); trained 2026-08-07 on one 8×H200 node. Full config in the checkpoint's meta_007007.json companion.

Evaluation

metric this model (clean) treated base (numtox)
validation bits per byte (held-out ClimbMix shard) 0.723182 0.725289
CORE (DCLM 22-task centered average) 0.2485 0.2471

CORE's run-to-run spread is ~0.0165 — an order of magnitude larger than the 0.0014 column difference, so read the CORE row as "the treatment does not measurably change base capability", not as an effect. (GPT-2-XL scores 0.256525 under the same evaluator.) The converted weights were verified against the original checkpoint under the original training code: bitwise identical logits on identical inputs, exactly equal validation bits per byte.

Use

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

repo = "jkminder/pretraining-priors-d26-base"
tokenizer = AutoTokenizer.from_pretrained(repo, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
    repo, trust_remote_code=True, dtype=torch.bfloat16, device_map="cuda"
)

inputs = tokenizer("The capital of France is", return_tensors="pt").to("cuda")
out = model.generate(**inputs, max_new_tokens=64, do_sample=True, temperature=0.8, top_k=50)
print(tokenizer.decode(out[0], skip_special_tokens=True))

Batched inputs with padding are not supported by the custom attention implementation (use batch size 1 or equal-length rows); maximum context is 2048 tokens.

Licence

Weights: CC BY-NC 4.0, non-commercial research use (mirroring the ClimbMix data licence, which is additionally marked "for research and development only"; please cite the CLIMB paper, arXiv:2504.13161). Modeling code: MIT, derived from karpathy/nanochat — see LICENSE.

Contact: Julian Minder (Anthropic Fellows program / safety-research).

Downloads last month
-
Safetensors
Model size
1.0B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for jkminder/pretraining-priors-d26-base

Finetunes
1 model

Dataset used to train jkminder/pretraining-priors-d26-base

Collection including jkminder/pretraining-priors-d26-base

Paper for jkminder/pretraining-priors-d26-base