Text Generation
MLX
Safetensors
English
pretraining
from-scratch
small-language-model
post-training
silicon
Instructions to use wzebrowski/OpenSML-150M with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use wzebrowski/OpenSML-150M with MLX:
# Make sure mlx-lm is installed # pip install --upgrade mlx-lm # if on a CUDA device, also pip install mlx[cuda] # Generate text with mlx-lm from mlx_lm import load, generate model, tokenizer = load("wzebrowski/OpenSML-150M") prompt = "Once upon a time in" text = generate(model, tokenizer, prompt=prompt, verbose=True) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- MLX LM
How to use wzebrowski/OpenSML-150M with MLX LM:
Generate or start a chat session
# Install MLX LM uv tool install mlx-lm # Generate some text mlx_lm.generate --model "wzebrowski/OpenSML-150M" --prompt "Once upon a time"
- Atomic Chat
Add current V2 technical report and historical training record
Browse files- TECHNICAL_REPORT.md +1356 -0
TECHNICAL_REPORT.md
ADDED
|
@@ -0,0 +1,1356 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# OpenSML-150M — Technical Report
|
| 2 |
+
|
| 3 |
+
William Zebrowski · V2 training and selected post-training checkpoint · Updated October 2, 2026
|
| 4 |
+
|
| 5 |
+
This report is the detailed companion to the OpenSML-150M model card. The current
|
| 6 |
+
record below covers the V2 base at Stage B step 73,243 (7,800,086,528 pretraining
|
| 7 |
+
tokens) and the selected SFT checkpoint at total step 768. The September 18
|
| 8 |
+
report is preserved in a clearly dated historical appendix; its training status,
|
| 9 |
+
hardware, and unfinished-evaluation statements describe that earlier boundary.
|
| 10 |
+
Current selection and release statements below take precedence.
|
| 11 |
+
|
| 12 |
+
## Parameter-count accounting note
|
| 13 |
+
|
| 14 |
+
The owner-requested model-card wording reports 150,439,188 parameters (150.44M).
|
| 15 |
+
The existing architecture accounting and configuration records total 150,439,168.
|
| 16 |
+
This 20-parameter discrepancy is unresolved; the presentation edit was not a
|
| 17 |
+
model-weight change. The original component accounting is preserved in the
|
| 18 |
+
historical appendix.
|
| 19 |
+
|
| 20 |
+
## Current V2 Training and Evaluation Record
|
| 21 |
+
|
| 22 |
+
## Availability and Inference
|
| 23 |
+
|
| 24 |
+
This repository currently documents the selected fine-tuned model and its pretrained
|
| 25 |
+
base, and provides their shared tokenizer
|
| 26 |
+
and historical configuration files. It does not provide model weights or a tested
|
| 27 |
+
standalone inference bundle. A download-and-generate quick start is therefore not
|
| 28 |
+
yet available. The local project uses native MLX inference on Apple hardware;
|
| 29 |
+
compatibility with Transformers AutoModel, GGUF, ONNX, vLLM, and llama.cpp has not
|
| 30 |
+
been established for this repository. The selected SFT checkpoint uses the native plain User/Assistant format described
|
| 31 |
+
below; the pretrained base remains a completion model.
|
| 32 |
+
|
| 33 |
+
## At a Glance
|
| 34 |
+
|
| 35 |
+
| Item | Configuration |
|
| 36 |
+
| --- | --- |
|
| 37 |
+
| Model type | Decoder-only language model; selected instruction-tuned checkpoint with base results separately reported |
|
| 38 |
+
| Initialization | Random weights; no pretrained model initialization |
|
| 39 |
+
| Parameters | 150,439,168 |
|
| 40 |
+
| Backbone | 20 layers, width 768 |
|
| 41 |
+
| Context | 2,048 tokens |
|
| 42 |
+
| Tokenizer | Independently trained 32,000-token byte-level BPE |
|
| 43 |
+
| Training framework | MLX, with custom training and cluster orchestration |
|
| 44 |
+
| Five-Mac cluster | One M5 Ultra, one M3 Ultra, and three M4 Max machines |
|
| 45 |
+
| Communication | Native JACCL over Thunderbolt RDMA; four-node ring initially, five-node continuation |
|
| 46 |
+
| Selected pretrained base | Step 73,243; 7,800,086,528 lifetime pretraining tokens |
|
| 47 |
+
| Original exposure target | 15B total tokens; a plan, not the completed exposure of the selected base |
|
| 48 |
+
| Selected fine-tuned model | OpenSML-150M; total SFT step 768 |
|
| 49 |
+
| Current status | Base and selected SFT checkpoint documented; weight release pending |
|
| 50 |
+
|
| 51 |
+
## Model Specification
|
| 52 |
+
|
| 53 |
+
| Field | Value |
|
| 54 |
+
| --- | --- |
|
| 55 |
+
| Unique parameters | 150,439,168 |
|
| 56 |
+
| Layers / hidden width / FFN width | 20 / 768 / 2,048 |
|
| 57 |
+
| Attention | GQA: 12 query heads / 4 KV heads; head dimension 64 |
|
| 58 |
+
| Position encoding | RoPE, base 10,000 |
|
| 59 |
+
| Normalization / MLP | RMSNorm, Q/K normalization, SwiGLU |
|
| 60 |
+
| Vocabulary / context | 32,000 / 2,048 |
|
| 61 |
+
| Embeddings | Tied input and output |
|
| 62 |
+
| Linear biases / dropout | Neither used |
|
| 63 |
+
| Pretraining precision | BF16 compute; FP32 master weights and optimizer state |
|
| 64 |
+
| Benchmark precision | FP32 scoring, explicit vanilla MLX attention |
|
| 65 |
+
|
| 66 |
+
### Architecture
|
| 67 |
+
|
| 68 |
+
The model uses grouped-query attention with 12 query heads and 4 key/value heads
|
| 69 |
+
(head dimension 64), rotary position embeddings with base 10,000, RMSNorm, Q/K
|
| 70 |
+
normalization, and SwiGLU feed-forward layers with intermediate width 2,048.
|
| 71 |
+
Input and output embeddings are tied; linear layers are bias-free.
|
| 72 |
+
|
| 73 |
+
The tied vocabulary matrix contains 24,576,000 parameters. Initialization uses
|
| 74 |
+
normal standard deviation 0.02 with residual output projections scaled by
|
| 75 |
+
1/sqrt(2L). These are established Transformer components in our configuration,
|
| 76 |
+
not a claim of a new attention architecture.
|
| 77 |
+
|
| 78 |
+
## Pretraining Data
|
| 79 |
+
|
| 80 |
+
The model uses a prose-first mixture streamed from Hugging Face. This replaces
|
| 81 |
+
the earlier OpenWebText description on this page; that description does not apply
|
| 82 |
+
to OpenSML-150M.
|
| 83 |
+
|
| 84 |
+
| Source | Initial token share | Stage B token share | Selection |
|
| 85 |
+
| --- | ---: | ---: | --- |
|
| 86 |
+
| [FineWeb-Edu](https://huggingface.co/datasets/HuggingFaceTB/smollm-corpus) | 55% | 55% | `fineweb-edu-dedup` |
|
| 87 |
+
| [DCLM-Edu](https://huggingface.co/datasets/HuggingFaceTB/dclm-edu) | 25% | 20% | `edu_int_score >= 3` |
|
| 88 |
+
| [FineWiki](https://huggingface.co/datasets/HuggingFaceFW/finewiki) | 10% | 15% | English |
|
| 89 |
+
| [Cosmopedia v2](https://huggingface.co/datasets/HuggingFaceTB/smollm-corpus) | 10% | 10% | Textbook/tutorial/blog/educational format filter |
|
| 90 |
+
|
| 91 |
+
The [original corpus recipe](https://huggingface.co/wzebrowski/OpenSML-150M/blob/main/configs/corpus.json) records the initial mixture.
|
| 92 |
+
Stage B began at step 73,008, after 7,775,059,968 tokens, and changed the mixture
|
| 93 |
+
as shown above. No dedicated code or math source was included in this prose
|
| 94 |
+
pretraining mixture; prose can still contain technical material, equations,
|
| 95 |
+
and code.
|
| 96 |
+
|
| 97 |
+
Pretraining uses three dataset repositories: FineWeb-Edu and Cosmopedia
|
| 98 |
+
v2 are two distinct subsets of SmolLM Corpus. All four pretraining sources are
|
| 99 |
+
listed above. Dataset tags also include the public sources used across the
|
| 100 |
+
selected checkpoint's SFT lineage, described below.
|
| 101 |
+
|
| 102 |
+
Normalized document hashes assign 97% to training and 1% each to tokenizer
|
| 103 |
+
development, validation, and a reserved final split. Original text is preserved
|
| 104 |
+
for model input. A bounded window of 10,000 recent accepted hashes suppresses
|
| 105 |
+
nearby exact duplicates across sources; it is not complete corpus deduplication
|
| 106 |
+
or a benchmark contamination audit.
|
| 107 |
+
|
| 108 |
+
Early training read each source in dataset order without a document shuffle
|
| 109 |
+
buffer. From step 70,710 (7,530,332,160 tokens), the data-review continuation
|
| 110 |
+
introduced a resumable 256-document shuffle buffer per source. This is bounded
|
| 111 |
+
shuffling, not a global random permutation. Documents receive one explicit EOS
|
| 112 |
+
and are packed into causal windows that can cross document boundaries;
|
| 113 |
+
attention is not reset at every document.
|
| 114 |
+
|
| 115 |
+
Mac-1 handles filtering, tokenization, and RAM prefetch, then distributes disjoint
|
| 116 |
+
rank slices. The training path does not save corpus/token shards to disk.
|
| 117 |
+
Checkpoint cursors, tokenizer-fitting samples, logs, staged files, and small HF
|
| 118 |
+
metadata caches are separate storage uses. Exact-resume state tracks consumed
|
| 119 |
+
batches, not the prefetch worker's advanced position.
|
| 120 |
+
|
| 121 |
+
## Tokenizer
|
| 122 |
+
|
| 123 |
+
**ByteBPE32K v1 is completed and frozen.** It was fitted on our source mixture,
|
| 124 |
+
not borrowed from another model. Tokenizer-fitting shares are measured in UTF-8
|
| 125 |
+
bytes; pretraining shares are measured in tokens.
|
| 126 |
+
|
| 127 |
+
| Audit item | Recorded result |
|
| 128 |
+
| --- | --- |
|
| 129 |
+
| Fitting sample | 500,048,186 UTF-8 bytes; 113,898 documents |
|
| 130 |
+
| Held-out audit | 4,010,605 bytes; 970 documents |
|
| 131 |
+
| Vocabulary | Exactly 32,000 IDs including structural tokens |
|
| 132 |
+
| Round-trip failures | Zero across the held-out audit |
|
| 133 |
+
| Regression fixtures | 9 passed |
|
| 134 |
+
| Special IDs | Padding 0; document-end 1; turn-start 2; turn-end 3 |
|
| 135 |
+
| Encoding | Full byte alphabet; no text normalization or implicit BOS/EOS |
|
| 136 |
+
|
| 137 |
+
Literal control-token spellings encode as ordinary text. Reserved turn tokens
|
| 138 |
+
do not mean the base model has been chat-trained. The selected SFT model uses
|
| 139 |
+
plain role labels and document-end EOS rather than relying on those reserved turn tokens. Held-out bytes/token were
|
| 140 |
+
4.6255 for web, 4.4532 for DCLM, 4.0593 for wiki, and 5.0610 for Cosmopedia.
|
| 141 |
+
These are encoding checks, not model capability results.
|
| 142 |
+
|
| 143 |
+
Files: [tokenizer](https://huggingface.co/wzebrowski/OpenSML-150M/blob/main/tokenizer/tokenizer.json),
|
| 144 |
+
[configuration](https://huggingface.co/wzebrowski/OpenSML-150M/blob/main/tokenizer/tokenizer_config.json),
|
| 145 |
+
[manifest](https://huggingface.co/wzebrowski/OpenSML-150M/blob/main/tokenizer/manifest.json), and [audit](https://huggingface.co/wzebrowski/OpenSML-150M/blob/main/tokenizer/report.json).
|
| 146 |
+
The artifact is provided with its structural-token contract; standard text
|
| 147 |
+
encoding alone does not reproduce every custom trainer boundary rule.
|
| 148 |
+
|
| 149 |
+
```text
|
| 150 |
+
Tokenizer artifact fingerprint:
|
| 151 |
+
1194292c6d906ac19e6f01c6ad2b42825143fad426a22aa8856d903776701ecb
|
| 152 |
+
```
|
| 153 |
+
|
| 154 |
+
## Training Method
|
| 155 |
+
|
| 156 |
+
| Setting | Value |
|
| 157 |
+
| --- | --- |
|
| 158 |
+
| Optimizer | AdamW; betas 0.9/0.95; epsilon 1e-8 |
|
| 159 |
+
| Precision | BF16 compute; FP32 master weights, moments, and accumulated/reduced gradients |
|
| 160 |
+
| Regularization | Matrix weight decay 0.1; gradient norm clip 1.0 |
|
| 161 |
+
| Local microbatches | Initially 4 / 3 / 3 / 3; five-Mac continuation 4 / 3 / 2 / 2 / 2 sequences |
|
| 162 |
+
| Gradient accumulation | 4 |
|
| 163 |
+
| Global update | 52 sequences; 106,496 tokens |
|
| 164 |
+
| Learning rate | Initial peak 3e-4; later validation-plateau schedule, then 5e-6 floor; selected Stage B base used 5e-6 |
|
| 165 |
+
| Validation / samples | Every 25M / 50M tokens |
|
| 166 |
+
| Routine checkpoint saves | Every 10M tokens, plus best/final/clean-stop saves |
|
| 167 |
+
|
| 168 |
+
### Four-to-five-Mac training history
|
| 169 |
+
|
| 170 |
+
The original cluster used one M3 Ultra and three M4 Max Mac Studios. At step
|
| 171 |
+
**50,096**, after **5,335,023,616 tokens**, training continued with an M5 Ultra
|
| 172 |
+
coordinator added to form a five-Mac ring. This transition is recorded in the
|
| 173 |
+
selected pretrained checkpoint's provenance; the model was not trained on
|
| 174 |
+
five Macs from initialization.
|
| 175 |
+
|
| 176 |
+
| Machine | Unified memory | Local microbatch | Tokens per global update |
|
| 177 |
+
| --- | ---: | ---: | ---: |
|
| 178 |
+
| M5 Ultra | 96 GB | 4 | 32,768 |
|
| 179 |
+
| M3 Ultra | 96 GB | 3 | 24,576 |
|
| 180 |
+
| M4 Max | 36 GB | 2 | 16,384 |
|
| 181 |
+
| M4 Max | 36 GB | 2 | 16,384 |
|
| 182 |
+
| M4 Max | 36 GB | 2 | 16,384 |
|
| 183 |
+
|
| 184 |
+
The physical ring is **Mac-1 → Mac-2 → Mac-3 → Mac-5 → Mac-4 → Mac-1**.
|
| 185 |
+
This is replicated data parallelism: each Mac holds the complete model and
|
| 186 |
+
optimizer, processes disjoint examples, combines gradients with batch-size
|
| 187 |
+
weighting, and applies the same update. It is not a model split across five
|
| 188 |
+
machines. Mac-1 streams/tokenizes the corpus, distributes batches, evaluates,
|
| 189 |
+
and saves checkpoints.
|
| 190 |
+
|
| 191 |
+
Native JACCL over Thunderbolt RDMA carries tensors. Ethernet/SSH and
|
| 192 |
+
job-scoped coordinator tunnels handle control traffic. With context 2,048 and
|
| 193 |
+
four accumulation steps, the five-Mac allocation preserves the earlier effective
|
| 194 |
+
batch: `(4 + 3 + 2 + 2 + 2) × 4 × 2048 = 106,496` tokens per update.
|
| 195 |
+
The transition preserves architecture, tokenizer and optimizer state. No
|
| 196 |
+
controlled four-versus-five-Mac throughput comparison is claimed.
|
| 197 |
+
|
| 198 |
+
The implementation uses compiled backward computation, fast attention, custom
|
| 199 |
+
Metal cross-entropy, and packed SwiGLU. Their presence is not, by itself, evidence
|
| 200 |
+
of a measured speedup for each individual optimization.
|
| 201 |
+
|
| 202 |
+
### Pilot and Continuation
|
| 203 |
+
|
| 204 |
+
The pilot finished at step 4,696 after 500,105,216 tokens. It used token-based
|
| 205 |
+
warmup, a stable phase, and a final cosine decay to 3e-5. The initial continuation restored
|
| 206 |
+
its weights, optimizer and consumed data cursor, reheated to 3e-4 over 50M
|
| 207 |
+
additional tokens, and originally targeted 15B total tokens. Later training
|
| 208 |
+
changed schedules through explicit checkpoint transitions: a validation-plateau
|
| 209 |
+
controller at step 38,056; a lower-LR continuation at step 60,263; and the
|
| 210 |
+
shuffle/validation transition at step 70,710. Stage B began from step 73,008
|
| 211 |
+
at 5e-6. The selected Stage B base is step **73,243**, with **7,800,086,528**
|
| 212 |
+
lifetime pretraining tokens.
|
| 213 |
+
|
| 214 |
+
This is **not a single unchanged 15B schedule from initialization**, and the
|
| 215 |
+
15B target must not be read as the training exposure of these checkpoints.
|
| 216 |
+
The linked [pilot](https://huggingface.co/wzebrowski/OpenSML-150M/blob/main/configs/pilot.json) and [early continuation configuration](https://huggingface.co/wzebrowski/OpenSML-150M/blob/main/configs/training_recipe.json)
|
| 217 |
+
are historical recipes; the later transitions are summarized here.
|
| 218 |
+
|
| 219 |
+
## Training and Model Lineage
|
| 220 |
+
|
| 221 |
+
The selected fine-tuned model is **OpenSML-150M**, retained by the
|
| 222 |
+
project owner as the current baseline. Its internal experiment identifier is
|
| 223 |
+
Trial 28 — Repair512 +256; that identifier remains in provenance records only. Its ancestry is:
|
| 224 |
+
|
| 225 |
+
```text
|
| 226 |
+
Pretrained V2: Stage B step 73,243 (7.800B pretraining tokens)
|
| 227 |
+
→ Unified384: 384 supervised updates from the base
|
| 228 |
+
→ Repair512: 128 additional public-repair updates
|
| 229 |
+
→ OpenSML-150M: 256 additional updates; total SFT step 768
|
| 230 |
+
```
|
| 231 |
+
|
| 232 |
+
These SFT labels are update counts, not pretraining steps or token counts.
|
| 233 |
+
This step 768 is distinct from the earlier Text Follow-up 768 branch. The model
|
| 234 |
+
is a direct fine-tuned checkpoint, without parameter interpolation. Other search
|
| 235 |
+
candidates are separate experiments and are not ancestors of these weights.
|
| 236 |
+
|
| 237 |
+
### Fine-tuning Data and Settings
|
| 238 |
+
|
| 239 |
+
| Stage | Data and method | Retained exposure |
|
| 240 |
+
| --- | --- | --- |
|
| 241 |
+
| Unified384 | Smol-SmolTalk and UltraChat conversations, writing/summarization, authored recovery/format follow-ups, SQuAD v2 passage reading, and ARC training questions; assistant-only supervised learning | First 384 updates of the 768-update recipe |
|
| 242 |
+
| Repair512 | Short Smol-SmolTalk/UltraChat chats, Dolly ordinary and grounded answers, and verified Tulu 3 Persona instruction examples; assistant-only supervised learning | 128 additional updates from Unified384 |
|
| 243 |
+
| OpenSML-150M | SmolTalk constraints, SQuAD v2 training passages, SciQ training labels, and Repair512 replay; supervised learning with repetition and retention objectives | 256 additional updates; first 4,096 ordered training records |
|
| 244 |
+
|
| 245 |
+
Trial 28 prepared an 8,192-record, 512-update experiment. Its retained checkpoint
|
| 246 |
+
is the **+256 midpoint**, not the final +512 model. The full prepared mixture was
|
| 247 |
+
3,072 SmolTalk constraint records, 2,048 SQuAD records, 1,024 SciQ records, and
|
| 248 |
+
2,048 replay records, including repeated passes through fresh examples. Those
|
| 249 |
+
full-plan counts must not be interpreted as the retained midpoint's exposure.
|
| 250 |
+
|
| 251 |
+
Trial 28 updates all model parameters, including tied embeddings; no LoRA or
|
| 252 |
+
frozen-layer restriction is used. It retains the architecture, context length,
|
| 253 |
+
and tokenizer of the base. Batches contain 16 whole conversations. Supervised
|
| 254 |
+
cross-entropy weights conversations equally and trains assistant targets plus
|
| 255 |
+
EOS while masking prompt/history positions. Targets are retained whole; records
|
| 256 |
+
that exceed length/context limits are excluded.
|
| 257 |
+
|
| 258 |
+
The Trial 28 optimizer uses AdamW, betas 0.9/0.95, zero weight decay, clipping at
|
| 259 |
+
norm 1, and a 16-update warmup to 2e-6 followed by cosine decay toward 2e-7 over
|
| 260 |
+
the planned 512 updates. The selected midpoint therefore stops partway through
|
| 261 |
+
that schedule. The objective adds a selective repetition unlikelihood term
|
| 262 |
+
(weight 0.3) and a frozen-Repair512 forward-KL retention term (weight 2), restricted
|
| 263 |
+
to replay examples. This is supervised post-training with auxiliary objectives;
|
| 264 |
+
it does not use DPO or a reward-model policy-optimization stage in this lineage.
|
| 265 |
+
|
| 266 |
+
Trial 28 source revisions are SmolTalk `5feaf2fd3ffca7c237fc38d1861bc30365d48ffa`,
|
| 267 |
+
SQuAD v2 `3ffb306f725f7d2ce8394bc1873b24868140c412`, and SciQ
|
| 268 |
+
`2c94ad3e1aafab77146f384e23536f97a4849815`.
|
| 269 |
+
Training preparation excludes known benchmark overlaps and separates development
|
| 270 |
+
and reserved records, but this is not a comprehensive contamination audit.
|
| 271 |
+
Public targets have not all received independent factual review.
|
| 272 |
+
|
| 273 |
+
Selection followed repeated development and public-benchmark comparisons.
|
| 274 |
+
Trial 28 passed the recorded benchmark gate but failed the chat-repetition
|
| 275 |
+
component of the development gate; the owner explicitly retained it. It is the
|
| 276 |
+
**selected current baseline**, not a statistically established best model across
|
| 277 |
+
all capabilities. Reused benchmarks are exploratory development evidence.
|
| 278 |
+
|
| 279 |
+
## Pretraining Loss Curves
|
| 280 |
+
|
| 281 |
+
These charts show recorded held-out next-token validation loss from the selected
|
| 282 |
+
pretraining lineage, without smoothing. **Blue is Phase A** (the initial mixture
|
| 283 |
+
and its continuations); **teal is Phase B** (the Stage B prose refinement).
|
| 284 |
+
Phase B starts at step **73,008**, after **7.775B tokens**. The star marks the
|
| 285 |
+
selected pretrained base at step **73,243**, after **7.800B tokens**. Later points
|
| 286 |
+
show continued pretraining beyond the selected checkpoint, not additional
|
| 287 |
+
training included in that checkpoint. Lower loss is better.
|
| 288 |
+
|
| 289 |
+
### Full History and Late-training Zoom
|
| 290 |
+
|
| 291 |
+

|
| 292 |
+
|
| 293 |
+
The overview and zoom use the **same original held-out set** throughout
|
| 294 |
+
(262,144 target positions). The zoom makes the shorter Phase B visible; its
|
| 295 |
+
vertical scale is magnified. Aggregate validation weights remain fixed at
|
| 296 |
+
55% web, 25% DCLM, 10% Wikipedia, and 10% Cosmopedia across both phases,
|
| 297 |
+
even though the Phase B training mixture changes. The selected checkpoint's
|
| 298 |
+
loss on this original set is **2.81855024**.
|
| 299 |
+
|
| 300 |
+
### Phase B Detail
|
| 301 |
+
|
| 302 |
+

|
| 303 |
+
|
| 304 |
+
This close-up uses the **expanded held-out set** (4,194,304 target positions),
|
| 305 |
+
introduced late in Phase A. Its absolute loss values are separate from the
|
| 306 |
+
original-set curves above and below. The selected checkpoint's expanded loss
|
| 307 |
+
is **2.76700753**. The tightly zoomed vertical scale shows small changes; the
|
| 308 |
+
later increase is less than 0.001 loss. Validation weights remain fixed to the
|
| 309 |
+
original reference mixture.
|
| 310 |
+
|
| 311 |
+
### Validation Loss by Data Source
|
| 312 |
+
|
| 313 |
+

|
| 314 |
+
|
| 315 |
+
Each source is evaluated on the original held-out set throughout. Panels use
|
| 316 |
+
their own vertical scales; they show each source's trajectory rather than a
|
| 317 |
+
common-scale ranking of source difficulty. The dashed line marks the Phase B
|
| 318 |
+
transition and the star marks the selected base.
|
| 319 |
+
|
| 320 |
+
## Interim Results
|
| 321 |
+
|
| 322 |
+
**Dated snapshot: September 18, 2026, through step 8,217. Not a live counter.**
|
| 323 |
+
|
| 324 |
+
| Selected milestone | Total tokens | Validation loss |
|
| 325 |
+
| --- | ---: | ---: |
|
| 326 |
+
| Pilot endpoint, step 4,696 | 500,105,216 | 3.3536 |
|
| 327 |
+
| Near end of continuation rewarm, step 5,165 | 550,051,840 | 3.4327 |
|
| 328 |
+
| Best at this snapshot, step 8,217 | 875,077,632 | 3.3078 |
|
| 329 |
+
|
| 330 |
+
These are selected milestones, not a complete learning curve. The loss rise and
|
| 331 |
+
recovery do not isolate the causal effect of reheating from additional training.
|
| 332 |
+
|
| 333 |
+
At step 8,217, per-source losses were web **3.4116**, DCLM **3.6108**, wiki
|
| 334 |
+
**2.7977**, and Cosmopedia **2.4896**. Evaluation uses 16 batches of two sequences
|
| 335 |
+
per source: 262,144 target positions in total. The aggregate applies the training
|
| 336 |
+
mixture weights. Pilot and continuation preserve the same held-out fingerprint.
|
| 337 |
+
|
| 338 |
+
One earlier production readout at step 7,980 reported 13,794 interval tokens/sec
|
| 339 |
+
and 13,578 run tokens/sec across the cluster. This is an observed counter, not a
|
| 340 |
+
controlled performance benchmark, utilization measurement, or total runtime.
|
| 341 |
+
|
| 342 |
+
## Selected Pretrained Base
|
| 343 |
+
|
| 344 |
+
The selected pretrained checkpoint is the preserved Stage B base at
|
| 345 |
+
step **73,243**, after **7,800,086,528 pretraining tokens**. Its original legacy
|
| 346 |
+
validation loss is **2.81855024**. Its expanded validation loss is **2.76700753**.
|
| 347 |
+
These are different evaluation sets and must not be merged into one loss curve.
|
| 348 |
+
The expanded set has 256 batches of two sequences per source, or 4,194,304
|
| 349 |
+
positions in total; the legacy set has 262,144 positions.
|
| 350 |
+
|
| 351 |
+
The historical September 18 milestones above remain a dated record, not the
|
| 352 |
+
current training counter. Lower next-token loss does not by itself establish
|
| 353 |
+
correct answers, reasoning, or reliable instruction following.
|
| 354 |
+
|
| 355 |
+
## Evaluation
|
| 356 |
+
|
| 357 |
+
Results identify either the **pretrained Stage B base at step 73,243** or the
|
| 358 |
+
**selected OpenSML-150M SFT checkpoint at total step 768**. Their identities and
|
| 359 |
+
results are kept separate. The pretrained weight SHA-256 is:
|
| 360 |
+
|
| 361 |
+
```text
|
| 362 |
+
ca9bd5d82005f28e77f319d3a5a29f29fb4e4f86e7ceea049f01162fd8aae80f
|
| 363 |
+
```
|
| 364 |
+
|
| 365 |
+
### Zero-shot Likelihood Benchmarks
|
| 366 |
+
|
| 367 |
+
The complete evaluation scored **15,428 multiple-choice examples**. Higher is
|
| 368 |
+
better; raw and normalized accuracy are separate metrics.
|
| 369 |
+
|
| 370 |
+
| Benchmark | Split | Examples | Pretrained base acc / acc_norm | OpenSML-150M acc / acc_norm |
|
| 371 |
+
| --- | --- | ---: | ---: | ---: |
|
| 372 |
+
| ARC-Easy | Test | 2,376 | 54.67% / 48.53% | 56.65% / 55.43% |
|
| 373 |
+
| ARC-Challenge | Test | 1,172 | 23.38% / 26.88% | 26.02% / 29.52% |
|
| 374 |
+
| PIQA | Validation | 1,838 | 65.23% / 64.36% | 64.53% / 64.09% |
|
| 375 |
+
| HellaSwag | Validation | 10,042 | 30.21% / 34.44% | 30.55% / 33.94% |
|
| 376 |
+
|
| 377 |
+
Under the recorded protocol, the selected SFT checkpoint improves both ARC
|
| 378 |
+
metrics over the base. PIQA is slightly lower; HellaSwag raw accuracy increases
|
| 379 |
+
slightly while normalized accuracy decreases. Fine-tuning therefore shows a
|
| 380 |
+
mixed result rather than uniform gains.
|
| 381 |
+
|
| 382 |
+
Scoring ranks supplied answer continuations by their summed log-likelihood
|
| 383 |
+
(`acc`). `acc_norm` divides that score by the candidate text's Unicode character
|
| 384 |
+
count, rather than token count. The evaluator uses plain task completion prompts,
|
| 385 |
+
no few-shot demonstrations, no chat template, and no added BOS/EOS tokens. It
|
| 386 |
+
loads the selected checkpoint in FP32, uses reference feed-forward operations
|
| 387 |
+
and explicit vanilla MLX attention, and scores one example at a time. No response
|
| 388 |
+
sampling or LLM judge is involved.
|
| 389 |
+
|
| 390 |
+
The custom evaluator follows the pinned lm-evaluation-harness task conventions
|
| 391 |
+
at revision `b954108c9baaaa934b4ad842033b31a97ee30816`; this is not an installed
|
| 392 |
+
harness run or an official leaderboard submission. All expected rows completed,
|
| 393 |
+
and the saved integrity receipt records unchanged inputs. Different prompt,
|
| 394 |
+
normalization, tokenizer, or numerical settings can change scores. These numbers
|
| 395 |
+
are not automatically comparable with external model cards. A comprehensive
|
| 396 |
+
pretraining contamination audit has not been established, and these are not
|
| 397 |
+
claimed to be untouched final-test results.
|
| 398 |
+
|
| 399 |
+
### Comparison with Small Language Models
|
| 400 |
+
|
| 401 |
+
**OpenSML-150M** is compared below with recognizable models in the same approximate
|
| 402 |
+
parameter range: GPT-2 (124M), OPT-125M, and Pythia-160M. All external values are
|
| 403 |
+
**previously published results**. OpenSML values are
|
| 404 |
+
our existing measurements of the selected fine-tuned checkpoint.
|
| 405 |
+
|
| 406 |
+
Each cell shows **acc / acc_norm**; **—** means the cited source does not report
|
| 407 |
+
that metric. Bold marks the highest available reported value in each column.
|
| 408 |
+
These are cross-source comparisons, not a controlled common-harness ranking.
|
| 409 |
+
|
| 410 |
+
| Model | ARC-Easy acc / acc_norm | ARC-Challenge acc / acc_norm | PIQA acc / acc_norm | HellaSwag acc / acc_norm |
|
| 411 |
+
| --- | ---: | ---: | ---: | ---: |
|
| 412 |
+
| **OpenSML-150M (SFT)** | **56.65% / 55.43%** | **26.02% / 29.52%** | **64.53% / 64.09%** | **30.55% / 33.94%** |
|
| 413 |
+
| [GPT-2 (124M, base)](https://huggingface.co/openai-community/gpt2) | — / 39.48% | — / — | — / 62.51% | 28.92% / 31.14% |
|
| 414 |
+
| [OPT-125M (base)](https://huggingface.co/facebook/opt-125m) | 43.52% / 39.98% | 18.94% / 22.78% | 63.00% / 62.02% | — / — |
|
| 415 |
+
| [Pythia-160M (base)](https://huggingface.co/EleutherAI/pythia-160m) | 43.52% / 39.65% | 18.77% / 23.29% | 62.73% / 61.64% | — / — |
|
| 416 |
+
|
| 417 |
+
**The strongest reported margin is ARC-Easy:** OpenSML-150M's normalized score
|
| 418 |
+
is +15.45 percentage points above OPT-125M and +15.78 points above Pythia-160M.
|
| 419 |
+
On normalized ARC-Challenge, the respective differences are +6.74 and +6.23
|
| 420 |
+
points. OpenSML also exceeds the available published PIQA and GPT-2 HellaSwag
|
| 421 |
+
values shown here. These differences describe the reported numbers, not
|
| 422 |
+
statistically established superiority under identical evaluation settings.
|
| 423 |
+
|
| 424 |
+
OpenSML uses the zero-shot native-MLX protocol described above, with
|
| 425 |
+
character-normalized `acc_norm`. External metrics retain their source definitions;
|
| 426 |
+
we have not verified identical prompts, normalization, precision, or dataset
|
| 427 |
+
revisions across all sources. OpenSML is instruction fine-tuned, whereas the
|
| 428 |
+
three references are pretrained base models. The comparison therefore does not
|
| 429 |
+
isolate architecture, pretraining quality, or instruction-following ability.
|
| 430 |
+
Missing external metrics have not been filled by running new evaluations.
|
| 431 |
+
|
| 432 |
+
### Instruction Following: IFEval
|
| 433 |
+
|
| 434 |
+
These results apply only to **OpenSML-150M**, not the pretrained base.
|
| 435 |
+
|
| 436 |
+
| Checkpoint | Prompt strict | Instruction strict | Prompt loose | Instruction loose | 1,280-token cap hits |
|
| 437 |
+
| --- | ---: | ---: | ---: | ---: | ---: |
|
| 438 |
+
| OpenSML-150M | 15.16% (82/541) | 25.30% (211/834) | 15.71% (85/541) | 25.78% (215/834) | 33/541 |
|
| 439 |
+
|
| 440 |
+
The evaluation completes all 541 official prompts and 834 instructions using
|
| 441 |
+
zero-shot greedy generation and the pinned programmatic strict/loose verifiers,
|
| 442 |
+
without an LLM judge. Each unchanged prompt is formatted as
|
| 443 |
+
`User: {prompt}\nAssistant:` with no added system message. Generation uses cached
|
| 444 |
+
native MLX decoding, context 2,048, a 1,280-new-token cap, document-end EOS ID 1,
|
| 445 |
+
no additional stop strings, and no repetition penalty. Outputs are scored as
|
| 446 |
+
produced, including length-capped answers. Of the responses, 508 stop at EOS,
|
| 447 |
+
33 reach the generation cap, and none hit the context limit.
|
| 448 |
+
|
| 449 |
+
The dataset's official split is named `train`; these evaluation examples are
|
| 450 |
+
not used as supervised training records in the documented experiment. Benchmark
|
| 451 |
+
inspection across multiple candidates nevertheless limits independence of model
|
| 452 |
+
selection. No pretrained-base IFEval score is reported here.
|
| 453 |
+
|
| 454 |
+
### Complete-answer Diagnostics
|
| 455 |
+
|
| 456 |
+
For OpenSML-150M, saved development generations cover 63 legacy-retention turns
|
| 457 |
+
and 73 public-development turns. The recorded follow-up joint proxy is 22/32;
|
| 458 |
+
5/32 public named-constraint checks pass. Repetition is detected on 4/63 legacy
|
| 459 |
+
turns and 18/73 public turns; in the chat subset it rises from Repair512's 3/18
|
| 460 |
+
to 4/18. These are development diagnostics and mechanical proxies, not
|
| 461 |
+
independent human-reviewed complete-answer correctness rates.
|
| 462 |
+
|
| 463 |
+
A systematic complete-answer review comparable to PetitGPT's published suite
|
| 464 |
+
has not been established for the selected checkpoint. Likelihood and IFEval
|
| 465 |
+
scores do not establish factual correctness or reliable conversational answers.
|
| 466 |
+
|
| 467 |
+
### Reading and Fact-sensitivity Diagnostics (Pretrained Base)
|
| 468 |
+
|
| 469 |
+
The following diagnostics apply to the pretrained base, not Trial 28.
|
| 470 |
+
A separate September 24 audit used **400-example subsets per task**, distinct
|
| 471 |
+
from the full benchmark results above. On the same selected rows, OpenSML base
|
| 472 |
+
and a pinned SmolLM2-135M **base** reference scored:
|
| 473 |
+
|
| 474 |
+
| Diagnostic | OpenSML base | SmolLM2-135M base |
|
| 475 |
+
| --- | ---: | ---: |
|
| 476 |
+
| PIQA | 65.00% | 66.00% |
|
| 477 |
+
| HellaSwag | 34.25% | 42.25% |
|
| 478 |
+
| BoolQ | 62.75% | 62.75% |
|
| 479 |
+
|
| 480 |
+
The reference revision was `93efa2f097d58c2a74874c7e644dbc9b0cee75a2`.
|
| 481 |
+
These are local matched-subset measurements, not the reference model's published
|
| 482 |
+
full-benchmark scores. Different data, architecture, tokenizers, and training
|
| 483 |
+
budgets prevent attributing the differences to pretraining exposure alone.
|
| 484 |
+
|
| 485 |
+
BoolQ accuracy did not establish reliable reading: OpenSML selected "yes" on
|
| 486 |
+
95.25% of items; without the passage it scored 58.75%. In a separate authored
|
| 487 |
+
fact-swap diagnostic, the model answered both variants correctly on **18/120
|
| 488 |
+
pairs** in question/answer format. Swapping the passage changes the correct
|
| 489 |
+
choice, so this diagnostic checks whether recognition follows supplied facts.
|
| 490 |
+
The pairs share templates and are not 240 independent task families.
|
| 491 |
+
|
| 492 |
+
### What These Results Establish
|
| 493 |
+
|
| 494 |
+
Likelihood benchmarks measure recognition among supplied choices. They do not
|
| 495 |
+
measure whether the model can independently write a factually correct, complete
|
| 496 |
+
answer. The reading diagnostics also score choices rather than complete assistant
|
| 497 |
+
responses. A systematic complete-answer evaluation comparable to a reviewed
|
| 498 |
+
free-form answer suite has not been established for this pretrained checkpoint.
|
| 499 |
+
IFEval for the selected SFT checkpoint is reported separately above. No
|
| 500 |
+
MT-Bench or coding-success score is claimed for that checkpoint.
|
| 501 |
+
|
| 502 |
+
## Checkpoint Identity and Verification
|
| 503 |
+
|
| 504 |
+
The pretrained checkpoint is `step_0073243_7f3070237eea`, selected from the Stage B run.
|
| 505 |
+
The selected SFT checkpoint is `step_0000768_4980617cb301`, with weight SHA-256:
|
| 506 |
+
|
| 507 |
+
```text
|
| 508 |
+
cbd3e3fb4ada74d7264371b79cee7598f513b7b950f1f141ef9f1a43bd2e1b4e
|
| 509 |
+
```
|
| 510 |
+
|
| 511 |
+
The SFT weight hash was verified against the retained bundle. Its full multiple-choice
|
| 512 |
+
and IFEval integrity receipts record 15,428 and 541 completed examples respectively,
|
| 513 |
+
with unchanged inputs. Checkpoint metadata pins Repair512 as its direct parent.
|
| 514 |
+
A portable [Trial 28 results and provenance record](https://huggingface.co/wzebrowski/OpenSML-150M/resolve/main/TRIAL28_RESULTS.json) preserves
|
| 515 |
+
exact scores, protocol settings, dataset pins, and source-record hashes.
|
| 516 |
+
Local evaluation records pin its weight hash, tokenizer fingerprint, dataset
|
| 517 |
+
revisions, evaluator source hashes, and runtime settings. The full-benchmark
|
| 518 |
+
integrity receipt records 15,428 completed examples with unchanged inputs.
|
| 519 |
+
The tokenizer round-trip audit is described above. These checks establish
|
| 520 |
+
artifact identity and the scope of the recorded evaluation; they do not establish
|
| 521 |
+
cross-framework inference parity or deployment readiness. A released-weight
|
| 522 |
+
export verification and reproducible inference guide remain pending.
|
| 523 |
+
|
| 524 |
+
## Limitations and Intended Use
|
| 525 |
+
|
| 526 |
+
The eventual model is intended for small-language-model research and controlled
|
| 527 |
+
experimentation. The selected checkpoint is instruction-tuned, but is not a validated production assistant. It may generate
|
| 528 |
+
incorrect, repetitive, biased, offensive, or unsafe text. Do not rely on it for
|
| 529 |
+
high-stakes decisions. Broader capability and safety assessments remain pending.
|
| 530 |
+
|
| 531 |
+
Architecture, tokenizer, data, and context differ from earlier experiments;
|
| 532 |
+
this run alone cannot attribute any improvement to a single change.
|
| 533 |
+
|
| 534 |
+
## Repository Contents and Release Plan
|
| 535 |
+
|
| 536 |
+
- This model card documents the selected SFT checkpoint, pretrained ancestry, and separately labeled evaluations.
|
| 537 |
+
- `configs/` contains the original pinned corpus and pilot/early-continuation recipes; these are historical, not the complete later training history.
|
| 538 |
+
- `tokenizer/` contains the completed tokenizer, its corpus contract, and audit.
|
| 539 |
+
- Model weights, optimizer states, raw datasets, credentials, and private network configuration are not included.
|
| 540 |
+
|
| 541 |
+
Before a weight release, freeze the selected checkpoint and evaluation evidence,
|
| 542 |
+
add tested inference instructions and necessary implementation code, and review
|
| 543 |
+
third-party attribution. No release date is promised.
|
| 544 |
+
|
| 545 |
+
## License
|
| 546 |
+
|
| 547 |
+
OpenSML-150M project contributions in this repository are licensed under the
|
| 548 |
+
[Apache License 2.0](https://huggingface.co/wzebrowski/OpenSML-150M/resolve/main/LICENSE), for rights controlled by the author.
|
| 549 |
+
Upstream datasets and third-party materials retain their own licenses and
|
| 550 |
+
attribution requirements; the repository license does not relicense them.
|
| 551 |
+
|
| 552 |
+
Post-training sources also retain their own terms. Trial 28 source records list
|
| 553 |
+
SmolTalk as Apache-2.0, SQuAD v2 as CC-BY-SA-4.0, and SciQ as CC-BY-NC-3.0.
|
| 554 |
+
Apache-2.0 metadata for author-controlled project contributions is not a blanket
|
| 555 |
+
commercial-use license for all upstream materials or a completed weight-release
|
| 556 |
+
licensing review.
|
| 557 |
+
|
| 558 |
+
## External Benchmark Source Records
|
| 559 |
+
|
| 560 |
+
External comparison values are published measurements, not results from local
|
| 561 |
+
baseline evaluations. Incomplete local baseline runs are not used in the model card.
|
| 562 |
+
|
| 563 |
+
- GPT-2 normalized ARC-Easy and PIQA: [nano-chatgpt published table](https://github.com/Seif-Yasser-Ahmed/nano-chatgpt/blob/2c6b48b4e2eb612447b0858460c3d0472f00a98b/README.md#presentation-benchmark-table); shot counts are unspecified in that table. GPT-2 HellaSwag acc/acc_norm: [saved baseline JSON](https://github.com/Seif-Yasser-Ahmed/nano-chatgpt/blob/2c6b48b4e2eb612447b0858460c3d0472f00a98b/out_gpt2/10B/checkpoint_19072/evaluation_results/hellaswag_metrics.json). The project's comparison script invokes default HellaSwag few-shot settings. These are project measurements, not official OpenAI claims.
|
| 564 |
+
- OPT-125M: [EleutherAI baseline JSON](https://github.com/EleutherAI/pythia/blob/a19eecb807ec2c79a39ebf18108816e6ffffc1d5/evals/opt/opt-125m.json), `num_fewshot: 0`, `limit: null`; HellaSwag absent.
|
| 565 |
+
- Pythia-160M: [EleutherAI official non-deduplicated suite, step 143,000](https://github.com/EleutherAI/pythia/blob/a19eecb807ec2c79a39ebf18108816e6ffffc1d5/evals/pythia-v1/pythia-160m/zero-shot/160m_step143000.json), `num_fewshot: 0`, `limit: null`; HellaSwag absent.
|
| 566 |
+
|
| 567 |
+
## Retained SFT Dataset Exposure
|
| 568 |
+
|
| 569 |
+
These are record exposures, not token shares or unique-example counts. The
|
| 570 |
+
trainers consume ordered batches of 16 records. Tables count the first 6,144,
|
| 571 |
+
2,048, and 4,096 records at the three retained training boundaries respectively.
|
| 572 |
+
|
| 573 |
+
### Unified384
|
| 574 |
+
|
| 575 |
+
| Source | Record exposures | Share | Role |
|
| 576 |
+
| --- | ---: | ---: | --- |
|
| 577 |
+
| HuggingFaceTB/smol-smoltalk | 3,071 | 49.98% | Stage mixture |
|
| 578 |
+
| arc_easy | 198 | 3.22% | Stage mixture |
|
| 579 |
+
| HuggingFaceH4/ultrachat_200k | 1,761 | 28.66% | Stage mixture |
|
| 580 |
+
| authored-given-facts-v1 | 384 | 6.25% | Stage mixture |
|
| 581 |
+
| authored-fictional-text-v1 | 384 | 6.25% | Stage mixture |
|
| 582 |
+
| squad_v2 | 160 | 2.60% | Stage mixture |
|
| 583 |
+
| arc_challenge | 186 | 3.03% | Stage mixture |
|
| 584 |
+
| **Total** | **6,144** | **100%** | |
|
| 585 |
+
|
| 586 |
+
### Repair512
|
| 587 |
+
|
| 588 |
+
| Source | Record exposures | Share | Role |
|
| 589 |
+
| --- | ---: | ---: | --- |
|
| 590 |
+
| HuggingFaceTB/smol-smoltalk | 259 | 12.65% | Stage mixture |
|
| 591 |
+
| databricks/databricks-dolly-15k | 1,024 | 50.00% | Stage mixture |
|
| 592 |
+
| HuggingFaceH4/ultrachat_200k | 253 | 12.35% | Stage mixture |
|
| 593 |
+
| allenai/tulu-3-sft-personas-instruction-following | 512 | 25.00% | Stage mixture |
|
| 594 |
+
| **Total** | **2,048** | **100%** | |
|
| 595 |
+
|
| 596 |
+
### OpenSML-150M final continuation
|
| 597 |
+
|
| 598 |
+
| Source | Record exposures | Share | Role |
|
| 599 |
+
| --- | ---: | ---: | --- |
|
| 600 |
+
| allenai/tulu-3-sft-personas-instruction-following | 256 | 6.25% | Repair512 replay |
|
| 601 |
+
| HuggingFaceTB/smoltalk | 1,536 | 37.50% | Stage mixture |
|
| 602 |
+
| rajpurkar/squad_v2 | 1,024 | 25.00% | Stage mixture |
|
| 603 |
+
| databricks/databricks-dolly-15k | 512 | 12.50% | Repair512 replay |
|
| 604 |
+
| allenai/sciq | 512 | 12.50% | Stage mixture |
|
| 605 |
+
| HuggingFaceTB/smol-smoltalk | 132 | 3.22% | Repair512 replay |
|
| 606 |
+
| HuggingFaceH4/ultrachat_200k | 124 | 3.03% | Repair512 replay |
|
| 607 |
+
| **Total** | **4,096** | **100%** | |
|
| 608 |
+
|
| 609 |
+
|
| 610 |
+
## Historical Appendix — September 18, 2026
|
| 611 |
+
|
| 612 |
+
The following is the preserved original report at its 1B-token reporting boundary.
|
| 613 |
+
It is historical evidence, not the current model-card release status. Relative
|
| 614 |
+
links in this appendix refer to the original V2 documentation tree.
|
| 615 |
+
|
| 616 |
+
### Historical OpenSML-152M: Pretraining a Small Language Model on Apple Silicon
|
| 617 |
+
|
| 618 |
+
**William Zebrowski | Working technical report | September 18, 2026**
|
| 619 |
+
|
| 620 |
+
**Status: pretraining in progress.** Quantitative results below are frozen at
|
| 621 |
+
step 9,391, or 1,000,103,936 consumed training tokens. The planned endpoint is
|
| 622 |
+
15 billion tokens; it is not a completed result.
|
| 623 |
+
|
| 624 |
+
Project overview (`../README.md` in the original V2 documentation tree) | Data and tokenizer (`DATA_AND_TOKENIZER.md` in the original V2 documentation tree) |
|
| 625 |
+
Results notes (`RESULTS.md` in the original V2 documentation tree) | Evidence index (`EVIDENCE.md` in the original V2 documentation tree)
|
| 626 |
+
|
| 627 |
+
## Abstract
|
| 628 |
+
|
| 629 |
+
OpenSML-152M is an English-first, decoder-only language model trained from random
|
| 630 |
+
initialization on a four-Mac Studio cluster. Its implemented architecture contains
|
| 631 |
+
**150,439,168 trainable parameters**, with 20 Transformer blocks, a hidden width
|
| 632 |
+
of 768, grouped-query attention, tied embeddings, and a 2,048-token context.
|
| 633 |
+
The project name is a rounded model label, not the exact parameter count.
|
| 634 |
+
|
| 635 |
+
A custom 32,000-token byte-level BPE tokenizer was fitted to a representative
|
| 636 |
+
sample of the selected educational-prose corpus. Pretraining streams four
|
| 637 |
+
source components from three Hugging Face repositories, using a target token
|
| 638 |
+
mixture of 55% FineWeb-Edu, 25% DCLM-Edu, 10% English FineWiki, and 10% filtered
|
| 639 |
+
Cosmopedia. The training system combines BF16 computation with FP32 optimizer
|
| 640 |
+
state and gradients, unequal per-device batches, and Thunderbolt RDMA ring
|
| 641 |
+
communication through MLX/JACCL.
|
| 642 |
+
|
| 643 |
+
At the reporting boundary, aggregate development cross-entropy is **3.2812**
|
| 644 |
+
and perplexity is **26.61** on the fixed reference batches. These are interim
|
| 645 |
+
next-token prediction measurements, not downstream capability scores. Repetitive
|
| 646 |
+
and factually incorrect completions remain visible. This report documents the
|
| 647 |
+
implemented method and its evidence while leaving final evaluation, post-training,
|
| 648 |
+
and release claims explicitly open.
|
| 649 |
+
|
| 650 |
+
## Contents
|
| 651 |
+
|
| 652 |
+
1. [Scope and Reporting Conventions](#1-scope-and-reporting-conventions)
|
| 653 |
+
2. [Model Architecture](#2-model-architecture)
|
| 654 |
+
3. [Tokenizer](#3-tokenizer)
|
| 655 |
+
4. [Pretraining Data](#4-pretraining-data)
|
| 656 |
+
5. [Optimization and Training Schedule](#5-optimization-and-training-schedule)
|
| 657 |
+
6. [Distributed Execution](#6-distributed-execution)
|
| 658 |
+
7. [Checkpointing and Reproducibility](#7-checkpointing-and-reproducibility)
|
| 659 |
+
8. [Evaluation Methodology](#8-evaluation-methodology)
|
| 660 |
+
9. [Interim Results](#9-interim-results)
|
| 661 |
+
10. [Post-Training and Release Status](#10-post-training-and-release-status)
|
| 662 |
+
11. [Limitations and Intended Use](#11-limitations-and-intended-use)
|
| 663 |
+
12. [Evidence and Completion Checklist](#12-evidence-and-completion-checklist)
|
| 664 |
+
|
| 665 |
+
## 1. Scope and Reporting Conventions
|
| 666 |
+
|
| 667 |
+
### 1.1 Research objective
|
| 668 |
+
|
| 669 |
+
The objective is a useful small text-generation model with a traceable training
|
| 670 |
+
process on locally available Apple Silicon hardware. Throughput matters as a
|
| 671 |
+
resource constraint, but model selection is not based on throughput alone.
|
| 672 |
+
The architecture and mixture are this project's chosen configuration of
|
| 673 |
+
established components, not a claim of architectural novelty.
|
| 674 |
+
|
| 675 |
+
These weights were initialized from scratch. Earlier models and their
|
| 676 |
+
fine-tuning experiments are not ancestors of these weights and are not evidence
|
| 677 |
+
of this model's capabilities. Reused implementation components are separately
|
| 678 |
+
recorded in code provenance (`../provenance.json` in the original V2 documentation tree).
|
| 679 |
+
|
| 680 |
+
### 1.2 What the report distinguishes
|
| 681 |
+
|
| 682 |
+
| Term | Meaning here |
|
| 683 |
+
| --- | --- |
|
| 684 |
+
| Configured | Present in the recorded recipe or implemented code |
|
| 685 |
+
| Observed | Supported by an identified log, audit, or artifact |
|
| 686 |
+
| Planned | Not yet a completed experiment or measured outcome |
|
| 687 |
+
| Consumed training tokens | Token positions included in completed optimizer updates along this run's lineage |
|
| 688 |
+
| Validation loss | Cross-entropy on fixed held-out reference batches, not generated-answer accuracy |
|
| 689 |
+
| Best checkpoint | Lowest observed weighted validation loss under this evaluation contract |
|
| 690 |
+
| Latest checkpoint | Most recent successfully committed resumable state |
|
| 691 |
+
|
| 692 |
+
Validation records, qualitative probes, and future independent benchmarks are
|
| 693 |
+
different evidence types. Repeated use of reference batches makes them
|
| 694 |
+
development evidence, not an untouched final test. Results from another
|
| 695 |
+
tokenizer, corpus, or evaluation protocol are not directly comparable by raw loss.
|
| 696 |
+
|
| 697 |
+
### 1.3 Reporting boundary
|
| 698 |
+
|
| 699 |
+
This document is a versioned snapshot, not a live status dashboard. Training may
|
| 700 |
+
have advanced beyond the values shown. A machine-readable
|
| 701 |
+
validation table (`tables/validation_through_0009391.csv` in the original V2 documentation tree) and its
|
| 702 |
+
provenance record (`tables/validation_through_0009391.json` in the original V2 documentation tree) accompany this revision.
|
| 703 |
+
Earlier supporting notes may use earlier, explicitly dated cutoffs.
|
| 704 |
+
|
| 705 |
+
## 2. Model Architecture
|
| 706 |
+
|
| 707 |
+
### 2.1 Transformer configuration
|
| 708 |
+
|
| 709 |
+
| Component | Implemented value |
|
| 710 |
+
| --- | --- |
|
| 711 |
+
| Model family | Autoregressive, decoder-only Transformer |
|
| 712 |
+
| Trainable parameters | 150,439,168 |
|
| 713 |
+
| Transformer blocks | 20 |
|
| 714 |
+
| Hidden width | 768 |
|
| 715 |
+
| Context length | 2,048 tokens |
|
| 716 |
+
| Vocabulary | 32,000 |
|
| 717 |
+
| Query / key-value heads | 12 / 4 |
|
| 718 |
+
| Head dimension | 64 |
|
| 719 |
+
| Position representation | Rotary position embeddings; base 10,000 |
|
| 720 |
+
| Normalization | Pre-norm RMSNorm; per-head query/key RMSNorm; final RMSNorm |
|
| 721 |
+
| Feed-forward | SwiGLU; intermediate width 2,048 |
|
| 722 |
+
| Vocabulary interface | Shared input embedding and output projection |
|
| 723 |
+
| Linear biases / dropout | No linear biases; no dropout layers |
|
| 724 |
+
|
| 725 |
+
Each attention block uses a fused QKV projection. Its output width is
|
| 726 |
+
768 + 256 + 256 = 1,280. Grouped-query attention shares four key/value heads
|
| 727 |
+
across twelve query heads. The configured fast-attention path passes grouped
|
| 728 |
+
heads to MLX's scaled dot-product attention rather than explicitly expanding the
|
| 729 |
+
key/value tensors in Python.
|
| 730 |
+
|
| 731 |
+
### 2.2 Block computation
|
| 732 |
+
|
| 733 |
+
For residual input x, each block computes:
|
| 734 |
+
|
| 735 |
+
~~~text
|
| 736 |
+
h = x + Attention(RMSNorm(x))
|
| 737 |
+
y = h + SwiGLU(RMSNorm(h))
|
| 738 |
+
|
| 739 |
+
SwiGLU(z) = down(silu(gate(z)) * up(z))
|
| 740 |
+
logits = RMSNorm(final_hidden) @ embedding_weight.T
|
| 741 |
+
~~~
|
| 742 |
+
|
| 743 |
+
Query and key normalization occur before rotary position encoding. Attention
|
| 744 |
+
uses a causal mask and scale 1/sqrt(64). The configured MLP ratio of 4 is a
|
| 745 |
+
construction parameter: applying the SwiGLU width adjustment and alignment
|
| 746 |
+
produces an actual intermediate width of 2,048, not 3,072.
|
| 747 |
+
|
| 748 |
+
### 2.3 Parameter accounting
|
| 749 |
+
|
| 750 |
+
The input embedding and output projection are tied and counted once.
|
| 751 |
+
|
| 752 |
+
| Component | Parameters across the model |
|
| 753 |
+
| --- | ---: |
|
| 754 |
+
| Shared token embedding / output matrix | 24,576,000 |
|
| 755 |
+
| QKV projections, 20 blocks | 19,660,800 |
|
| 756 |
+
| Attention output projections, 20 blocks | 11,796,480 |
|
| 757 |
+
| SwiGLU projections, 20 blocks | 94,371,840 |
|
| 758 |
+
| Block and Q/K normalization weights | 33,280 |
|
| 759 |
+
| Final normalization | 768 |
|
| 760 |
+
| **Total** | **150,439,168** |
|
| 761 |
+
|
| 762 |
+
The shared vocabulary matrix accounts for approximately 16.3% of parameters.
|
| 763 |
+
The model has no separate learned positional embedding table.
|
| 764 |
+
|
| 765 |
+
### 2.4 Initialization and numerical representation
|
| 766 |
+
|
| 767 |
+
Matrix weights use normal initialization with standard deviation 0.02.
|
| 768 |
+
Attention output and feed-forward down projections are scaled by
|
| 769 |
+
1/sqrt(2L), where L = 20. Normalization weights start at one.
|
| 770 |
+
|
| 771 |
+
BF16 is used for model computation. FP32 master weights, optimizer moments,
|
| 772 |
+
gradient accumulation, and reduced gradients preserve precision during updates.
|
| 773 |
+
This is mixed-precision training, not an all-BF16 optimizer.
|
| 774 |
+
|
| 775 |
+
Implementation evidence: model (`../sml_v2/model.py` in the original V2 documentation tree),
|
| 776 |
+
precision and optimizer (`../sml_v2/precision.py` in the original V2 documentation tree).
|
| 777 |
+
|
| 778 |
+
## 3. Tokenizer
|
| 779 |
+
|
| 780 |
+
### 3.1 Construction
|
| 781 |
+
|
| 782 |
+
The tokenizer is **ByteBPE32K v1**, trained for this corpus rather than inherited
|
| 783 |
+
from the earlier model. Its fitting sample follows the same source proportions
|
| 784 |
+
as pretraining, but sampling quotas are measured in UTF-8 bytes rather than
|
| 785 |
+
model tokens.
|
| 786 |
+
|
| 787 |
+
| Property | Recorded value |
|
| 788 |
+
| --- | --- |
|
| 789 |
+
| Algorithm | Byte-level BPE |
|
| 790 |
+
| Vocabulary size | 32,000 IDs including four structural tokens |
|
| 791 |
+
| Initial alphabet | Full 256-byte alphabet |
|
| 792 |
+
| Minimum merge frequency | 2 |
|
| 793 |
+
| Fitting sample | 500,048,186 UTF-8 bytes; 113,898 documents |
|
| 794 |
+
| Development audit | 4,010,605 UTF-8 bytes; 970 documents |
|
| 795 |
+
| Tokenizers library | 0.22.2 |
|
| 796 |
+
| Normalization / prefix space | No text normalizer; no automatic prefix space |
|
| 797 |
+
| Implicit BOS/EOS insertion | None |
|
| 798 |
+
| Sampling | Seeded source shuffling; buffer size 10,000 |
|
| 799 |
+
|
| 800 |
+
A 500 MB tokenizer fitting sample is not the pretraining dataset size.
|
| 801 |
+
The fitted tokenizer is frozen during model training.
|
| 802 |
+
|
| 803 |
+
### 3.2 Encoding contract
|
| 804 |
+
|
| 805 |
+
| ID | Token | Role |
|
| 806 |
+
| ---: | --- | --- |
|
| 807 |
+
| 0 | `<|pad|>` | Reserved padding |
|
| 808 |
+
| 1 | `<|doc_end|>` | Explicit document boundary |
|
| 809 |
+
| 2 | `<|turn_start|>` | Reserved for potential conversational formatting |
|
| 810 |
+
| 3 | `<|turn_end|>` | Reserved for potential conversational formatting |
|
| 811 |
+
|
| 812 |
+
Content encoding does not insert structural IDs automatically. Literal spellings
|
| 813 |
+
of structural tokens in input text are encoded as ordinary content; the wrapper
|
| 814 |
+
rejects an unexpected reserved ID in encoded content. Pretraining appends the
|
| 815 |
+
document-end token explicitly. Reserved turn tokens do not imply that chat
|
| 816 |
+
formatting or instruction following has been trained.
|
| 817 |
+
|
| 818 |
+
### 3.3 Audit results
|
| 819 |
+
|
| 820 |
+
| Held-out source | Documents | UTF-8 bytes | Encoded tokens | Bytes/token |
|
| 821 |
+
| --- | ---: | ---: | ---: | ---: |
|
| 822 |
+
| FineWeb-Edu | 559 | 2,205,062 | 476,722 | 4.6255 |
|
| 823 |
+
| DCLM-Edu | 165 | 1,001,509 | 224,896 | 4.4532 |
|
| 824 |
+
| FineWiki | 143 | 401,775 | 98,977 | 4.0593 |
|
| 825 |
+
| Cosmopedia | 103 | 402,259 | 79,482 | 5.0610 |
|
| 826 |
+
|
| 827 |
+
The held-out audit recorded zero round-trip failures; nine regression fixtures
|
| 828 |
+
also passed. These checks establish properties of the audited encoding, not
|
| 829 |
+
downstream quality or an exhaustive audit of future streamed documents.
|
| 830 |
+
|
| 831 |
+
The manifest (`../tokenizer/bytebpe32k_v1/manifest.json` in the original V2 documentation tree) and
|
| 832 |
+
audit report (`../tokenizer/bytebpe32k_v1/report.json` in the original V2 documentation tree) retain the detailed records.
|
| 833 |
+
The tokenizer artifact fingerprint is:
|
| 834 |
+
|
| 835 |
+
~~~text
|
| 836 |
+
1194292c6d906ac19e6f01c6ad2b42825143fad426a22aa8856d903776701ecb
|
| 837 |
+
~~~
|
| 838 |
+
|
| 839 |
+
## 4. Pretraining Data
|
| 840 |
+
|
| 841 |
+
### 4.1 Source mixture
|
| 842 |
+
|
| 843 |
+
Pretraining uses four components from three upstream repositories. All are read
|
| 844 |
+
from their upstream training splits, with project-specific content-hash splits
|
| 845 |
+
applied afterward.
|
| 846 |
+
|
| 847 |
+
| Component | Upstream repository / configuration | Target token share | Additional selection |
|
| 848 |
+
| --- | --- | ---: | --- |
|
| 849 |
+
| Web | [HuggingFaceTB/smollm-corpus](https://huggingface.co/datasets/HuggingFaceTB/smollm-corpus), `fineweb-edu-dedup` | 55% | Shared text-quality filters |
|
| 850 |
+
| DCLM | [HuggingFaceTB/dclm-edu](https://huggingface.co/datasets/HuggingFaceTB/dclm-edu) | 25% | `edu_int_score >= 3` |
|
| 851 |
+
| Wiki | [HuggingFaceFW/finewiki](https://huggingface.co/datasets/HuggingFaceFW/finewiki), `en` | 10% | English configuration |
|
| 852 |
+
| Cosmopedia | SmolLM corpus, `cosmopedia-v2` | 10% | Format contains textbook, tutorial, blog, or educational |
|
| 853 |
+
|
| 854 |
+
Pinned revisions:
|
| 855 |
+
|
| 856 |
+
~~~text
|
| 857 |
+
SmolLM corpus: 3ba9d605774198c5868892d7a8deda78031a781f
|
| 858 |
+
DCLM-Edu: dbad8ad71224482740cd9c9d353591adbf62fe04
|
| 859 |
+
FineWiki: 8bd13e72e6a002407649b3e898535f42ceb1aeb9
|
| 860 |
+
~~~
|
| 861 |
+
|
| 862 |
+
The mixture is prose-focused; no dedicated coding or mathematics source is
|
| 863 |
+
selected. This does not mean every document is free of code, equations, or
|
| 864 |
+
incidental non-English text. Shares describe target consumed token proportions,
|
| 865 |
+
not document counts or a completed inventory of selected documents.
|
| 866 |
+
|
| 867 |
+
The corpus configuration records source license labels and provenance.
|
| 868 |
+
Those labels are not blanket permission to redistribute all underlying content.
|
| 869 |
+
See the complete corpus contract (`../configs/corpus.json` in the original V2 documentation tree).
|
| 870 |
+
|
| 871 |
+
### 4.2 Filtering and split assignment
|
| 872 |
+
|
| 873 |
+
Documents must contain text, meet the 200-character minimum, and remain within
|
| 874 |
+
200,000 UTF-8 bytes. Filters reject NUL characters and more than two Unicode
|
| 875 |
+
replacement characters. Documents with at least ten non-empty lines are rejected
|
| 876 |
+
when fewer than half those lines are distinct. Source-specific score and format
|
| 877 |
+
requirements are checked in addition to these shared rules.
|
| 878 |
+
|
| 879 |
+
For identity and split assignment, text is NFC-normalized and whitespace is
|
| 880 |
+
collapsed before SHA-256 hashing. The first sixteen hexadecimal hash digits,
|
| 881 |
+
modulo 10,000, assign documents as follows:
|
| 882 |
+
|
| 883 |
+
| Bucket range | Allocation |
|
| 884 |
+
| --- | --- |
|
| 885 |
+
| 0-99 | Reserved final split |
|
| 886 |
+
| 100-199 | Validation |
|
| 887 |
+
| 200-299 | Tokenizer development |
|
| 888 |
+
| 300-9,999 | Training |
|
| 889 |
+
|
| 890 |
+
These are deterministic hash allocations, not guarantees of exact byte or token
|
| 891 |
+
percentages. Model input retains the original text; identity normalization does
|
| 892 |
+
not rewrite the training text.
|
| 893 |
+
|
| 894 |
+
A cross-source window of 10,000 recent accepted document hashes suppresses
|
| 895 |
+
normalized exact duplicates. This is bounded deduplication, not full-corpus
|
| 896 |
+
near-duplicate removal. Hash splitting separates identical normalized documents
|
| 897 |
+
across roles, but does not establish benchmark decontamination.
|
| 898 |
+
|
| 899 |
+
### 4.3 Streaming, scheduling, and packing
|
| 900 |
+
|
| 901 |
+
Mac-1 reads the pinned Hugging Face sources, filters documents, tokenizes them,
|
| 902 |
+
and constructs a global batch. The live training stream follows source order;
|
| 903 |
+
unlike tokenizer fitting, it does not use a document shuffle buffer.
|
| 904 |
+
|
| 905 |
+
Source scheduling chooses the most underrepresented component using consumed
|
| 906 |
+
token offsets divided by target weights. Each source maintains its own pending
|
| 907 |
+
token buffer. Documents receive one explicit document-end token, with no
|
| 908 |
+
automatic beginning-of-document token.
|
| 909 |
+
|
| 910 |
+
A row requires 2,049 buffered tokens: 2,048 input positions and their one-token
|
| 911 |
+
shifted targets. Advancing by 2,048 preserves the final lookahead token for the
|
| 912 |
+
next row. Packed windows can cross document boundaries within a source.
|
| 913 |
+
Attention is not reset at a document-end token.
|
| 914 |
+
|
| 915 |
+
The reader is configured for four prefetched global updates and five read
|
| 916 |
+
attempts. Source exhaustion or the configured five-million-row-per-source limit
|
| 917 |
+
is an error, not a trigger to silently recycle data. Reaching 15B tokens therefore
|
| 918 |
+
depends on sufficient eligible source material remaining available.
|
| 919 |
+
|
| 920 |
+
### 4.4 Storage and token accounting
|
| 921 |
+
|
| 922 |
+
No full training corpus or token-shard collection is materialized on disk.
|
| 923 |
+
Streaming still requires RAM for reader state, token buffers, fixed validation
|
| 924 |
+
batches, and bounded prefetch. Checkpoints persist the consumed cursor and pending
|
| 925 |
+
buffer state; tokenizer samples, logs, staged inputs, and metadata are separate
|
| 926 |
+
disk uses.
|
| 927 |
+
|
| 928 |
+
| Quantity | Value / definition |
|
| 929 |
+
| --- | --- |
|
| 930 |
+
| Planned endpoint | 15,000,000,000 cumulative training positions |
|
| 931 |
+
| Positions per optimizer update | 106,496 |
|
| 932 |
+
| Consumed at this report's boundary | 1,000,103,936 |
|
| 933 |
+
| Expected full-update endpoint if geometry is unchanged | 15,000,068,096 |
|
| 934 |
+
| Expected endpoint step under that assumption | 140,851 |
|
| 935 |
+
|
| 936 |
+
Counts include boundary-token positions processed by the objective. They exclude
|
| 937 |
+
validation and generation, and do not count prefetch as consumed training.
|
| 938 |
+
They are not counts of unique words, documents, or facts. Restarting from an older
|
| 939 |
+
checkpoint can repeat computation; lineage token counts are not an accounting
|
| 940 |
+
of every token processed across failed or discarded work.
|
| 941 |
+
|
| 942 |
+
Implementation evidence: corpus (`../sml_v2/corpus.py` in the original V2 documentation tree),
|
| 943 |
+
streaming (`../sml_v2/stream.py` in the original V2 documentation tree).
|
| 944 |
+
|
| 945 |
+
## 5. Optimization and Training Schedule
|
| 946 |
+
|
| 947 |
+
### 5.1 Objective and optimizer
|
| 948 |
+
|
| 949 |
+
The objective is causal next-token cross-entropy over packed sequences:
|
| 950 |
+
|
| 951 |
+
~~~text
|
| 952 |
+
L = -(1 / N) * sum(log p(target_token | preceding_tokens))
|
| 953 |
+
~~~
|
| 954 |
+
|
| 955 |
+
All packed target positions contribute, including document boundaries. This is
|
| 956 |
+
base-model pretraining, not assistant-response-only supervision.
|
| 957 |
+
|
| 958 |
+
| Hyperparameter | Value |
|
| 959 |
+
| --- | --- |
|
| 960 |
+
| Optimizer | AdamW |
|
| 961 |
+
| Beta1 / beta2 | 0.9 / 0.95 |
|
| 962 |
+
| Epsilon | 1e-8 |
|
| 963 |
+
| Weight decay | 0.1 on matrix parameters; normalization weights excluded |
|
| 964 |
+
| Global gradient clipping | L2 norm 1.0, after distributed reduction |
|
| 965 |
+
| Peak / minimum learning rate | 3e-4 / 3e-5 |
|
| 966 |
+
| Accumulation | Four microsteps per update |
|
| 967 |
+
| Random seed | 7,337 |
|
| 968 |
+
| Schedule coordinate | Consumed training tokens |
|
| 969 |
+
|
| 970 |
+
Local gradients are averaged across accumulation microsteps in FP32. The
|
| 971 |
+
distributed weighted mean is then clipped before each replica applies its
|
| 972 |
+
optimizer update.
|
| 973 |
+
|
| 974 |
+
### 5.2 Effective batch
|
| 975 |
+
|
| 976 |
+
~~~text
|
| 977 |
+
(4 + 3 + 3 + 3) sequences/microstep
|
| 978 |
+
* 4 accumulation microsteps
|
| 979 |
+
= 52 sequences/update
|
| 980 |
+
|
| 981 |
+
52 * 2,048 = 106,496 tokens/update
|
| 982 |
+
~~~
|
| 983 |
+
|
| 984 |
+
The update contains **52 sequences**, not 208. Unequal device batches are a
|
| 985 |
+
compute-balancing choice and are reflected in the gradient weights.
|
| 986 |
+
|
| 987 |
+
### 5.3 Recorded learning-rate trajectory
|
| 988 |
+
|
| 989 |
+
The training budget was extended at 500,105,216 consumed tokens. Model,
|
| 990 |
+
optimizer, and data state were preserved; the schedule was explicitly changed.
|
| 991 |
+
This is one weight lineage, but not an uninterrupted 15B-token schedule defined
|
| 992 |
+
at initialization.
|
| 993 |
+
|
| 994 |
+
| Token interval / boundary | Learning-rate behavior |
|
| 995 |
+
| --- | --- |
|
| 996 |
+
| 0 to 5M | Linear warmup toward 3e-4 |
|
| 997 |
+
| 5M to 400M | Hold at 3e-4 |
|
| 998 |
+
| 400M to approximately 500M | Cosine decay toward 3e-5 under the original budget |
|
| 999 |
+
| 500,105,216 | Resume anchor at step 4,696; LR approximately 3e-5 |
|
| 1000 |
+
| Next 50M tokens | Linear rewarm toward 3e-4 |
|
| 1001 |
+
| Approximately 550.1M to 12B | Hold at 3e-4 |
|
| 1002 |
+
| 12B to 15B | Cosine decay toward 3e-5 |
|
| 1003 |
+
|
| 1004 |
+
The rate is evaluated at the upcoming update's ending token count, so boundaries
|
| 1005 |
+
are realized at full updates. Resuming this continuation preserves its original
|
| 1006 |
+
rewarm anchor rather than restarting warmup.
|
| 1007 |
+
|
| 1008 |
+
The scheduler is token-based, not a validation-plateau controller. No controlled
|
| 1009 |
+
experiment has established that this schedule is optimal. The early decay and
|
| 1010 |
+
rewarm must remain visible when interpreting learning curves.
|
| 1011 |
+
|
| 1012 |
+
## 6. Distributed Execution
|
| 1013 |
+
|
| 1014 |
+
### 6.1 Hardware and rank assignment
|
| 1015 |
+
|
| 1016 |
+
Training uses one M3 Ultra Mac Studio and three M4 Max Mac Studios.
|
| 1017 |
+
The logical JACCL ring is Mac-1 -> Mac-2 -> Mac-4 -> Mac-3 -> Mac-1.
|
| 1018 |
+
|
| 1019 |
+
| Logical rank | Physical host | Chip family | Microbatch | Sequences/update | Tokens/update |
|
| 1020 |
+
| ---: | --- | --- | ---: | ---: | ---: |
|
| 1021 |
+
| 0 | Mac-1 | M3 Ultra | 4 | 16 | 32,768 |
|
| 1022 |
+
| 1 | Mac-2 | M4 Max | 3 | 12 | 24,576 |
|
| 1023 |
+
| 2 | Mac-4 | M4 Max | 3 | 12 | 24,576 |
|
| 1024 |
+
| 3 | Mac-3 | M4 Max | 3 | 12 | 24,576 |
|
| 1025 |
+
| **Total** | | | **13** | **52** | **106,496** |
|
| 1026 |
+
|
| 1027 |
+
This is replicated data-parallel training, not model sharding. Each Mac stores
|
| 1028 |
+
the complete model and optimizer state and computes on a disjoint slice of the
|
| 1029 |
+
global batch. Four physical Thunderbolt links form the ring.
|
| 1030 |
+
|
| 1031 |
+
### 6.2 One optimizer update
|
| 1032 |
+
|
| 1033 |
+
1. Mac-1 constructs and distributes the global input/target arrays.
|
| 1034 |
+
2. Each rank selects its assigned sequences and performs four local microsteps.
|
| 1035 |
+
3. Accumulated FP32 gradients are weighted by local batch contribution.
|
| 1036 |
+
4. Distributed gradient reduction produces the global mean.
|
| 1037 |
+
5. Each replica clips that mean and applies the same AdamW update.
|
| 1038 |
+
6. When due, ranks coordinate evaluation, generation, or checkpoint commitment.
|
| 1039 |
+
|
| 1040 |
+
For local mean gradients g_r and microbatch sizes b_r, the intended gradient is:
|
| 1041 |
+
|
| 1042 |
+
~~~text
|
| 1043 |
+
g_global = sum(b_r * g_r) / sum(b_r)
|
| 1044 |
+
~~~
|
| 1045 |
+
|
| 1046 |
+
Before MLX's equal-rank averaging operation, the implementation multiplies each
|
| 1047 |
+
local mean by world_size * b_r / sum(b_r). Equal accumulation counts and full
|
| 1048 |
+
sequence lengths make sequence weighting equivalent to token weighting here.
|
| 1049 |
+
A plain unweighted mean of the four ranks would overrepresent the smaller batches.
|
| 1050 |
+
|
| 1051 |
+
### 6.3 Data plane and control plane
|
| 1052 |
+
|
| 1053 |
+
Tensor transfers use JACCL over Thunderbolt RDMA. Wired SSH and loopback-only
|
| 1054 |
+
coordinator tunnels carry control traffic; Mac-4's wired control path is relayed
|
| 1055 |
+
through Mac-2. Hugging Face streaming uses the host's internet connection and is
|
| 1056 |
+
separate from inter-Mac tensor communication.
|
| 1057 |
+
|
| 1058 |
+
The launcher verifies physical identities, ring links, RDMA, wired control
|
| 1059 |
+
connectivity, and synchronized inputs. This is custom orchestration around MLX,
|
| 1060 |
+
not an unmodified upstream example. Existing cluster/network helpers outside the
|
| 1061 |
+
dedicated model directory remain runtime dependencies.
|
| 1062 |
+
|
| 1063 |
+
### 6.4 Kernels and performance boundaries
|
| 1064 |
+
|
| 1065 |
+
The configured compute path uses compiled backward computation, MLX fast
|
| 1066 |
+
attention, a custom Metal cross-entropy implementation, and packed Metal SwiGLU.
|
| 1067 |
+
Cross-entropy reductions and optimizer-related state retain FP32 precision.
|
| 1068 |
+
|
| 1069 |
+
Gradient groups use a 32 MiB reduction setting. The trainer explicitly
|
| 1070 |
+
materializes gradients before communication; this report does not claim
|
| 1071 |
+
communication/backward overlap. The implementation's collective stream setting
|
| 1072 |
+
does not mean that model forward/backward computation runs on the CPU.
|
| 1073 |
+
|
| 1074 |
+
No isolated speedup is assigned to any kernel without a matched measurement.
|
| 1075 |
+
An earlier architecture's throughput is not a controlled baseline for this
|
| 1076 |
+
20-layer, 2,048-context model.
|
| 1077 |
+
|
| 1078 |
+
Implementation evidence: trainer (`../sml_v2/pretrain.py` in the original V2 documentation tree),
|
| 1079 |
+
launcher (`../sml_v2/launch.py` in the original V2 documentation tree).
|
| 1080 |
+
|
| 1081 |
+
## 7. Checkpointing and Reproducibility
|
| 1082 |
+
|
| 1083 |
+
### 7.1 What a resumable checkpoint preserves
|
| 1084 |
+
|
| 1085 |
+
Checkpoint bundles preserve model weights, FP32 master weights and optimizer
|
| 1086 |
+
state, update/token counters, recipe and artifact contracts, validation state,
|
| 1087 |
+
and consumed stream state. Replica hashes and data-cursor checks accompany
|
| 1088 |
+
commitment. Writes are staged before a completed bundle becomes the new pointer.
|
| 1089 |
+
|
| 1090 |
+
The stream cursor corresponds to consumed work, not the producer's most advanced
|
| 1091 |
+
prefetched position. Unconsumed queued batches are reconstructed after resume.
|
| 1092 |
+
Underlying readers may reread remote content to recover a position; that alone
|
| 1093 |
+
does not establish repeated training exposure.
|
| 1094 |
+
|
| 1095 |
+
### 7.2 Selection and retention
|
| 1096 |
+
|
| 1097 |
+
The latest pointer identifies the newest committed resume point. The best pointer
|
| 1098 |
+
identifies the lowest aggregate validation loss observed under the fixed contract.
|
| 1099 |
+
These may refer to the same bundle.
|
| 1100 |
+
|
| 1101 |
+
Routine saves are requested every 10M tokens, with additional saves for new
|
| 1102 |
+
validation bests, clean stops, and completion. The configured retention policy
|
| 1103 |
+
keeps two recent checkpoints and protects the best, so a distinct older best can
|
| 1104 |
+
require an additional bundle. Logs and staged job inputs have separate storage
|
| 1105 |
+
lifetimes.
|
| 1106 |
+
|
| 1107 |
+
An 8 GiB reserve, plus estimated checkpoint requirements, guards saving. Failed
|
| 1108 |
+
or interrupted work after the last committed bundle is not guaranteed recoverable.
|
| 1109 |
+
The system does not automatically restart failed training.
|
| 1110 |
+
|
| 1111 |
+
### 7.3 Reproduction contract
|
| 1112 |
+
|
| 1113 |
+
The job snapshots recipe, corpus definition, tokenizer, and code inputs and
|
| 1114 |
+
verifies copies and package versions across hosts. Resume validation uses
|
| 1115 |
+
artifact contracts rather than assuming that files with the same name are
|
| 1116 |
+
equivalent.
|
| 1117 |
+
|
| 1118 |
+
The dependency specification pins MLX and mlx-metal 0.32.2, NumPy 2.4.2,
|
| 1119 |
+
datasets 4.5.0, huggingface-hub 1.4.0, and tokenizers 0.22.2. The project requires
|
| 1120 |
+
Python 3.11 or later. Exact future release reproduction should additionally
|
| 1121 |
+
retain observed interpreter, macOS, hardware, and networking inventories.
|
| 1122 |
+
|
| 1123 |
+
These controls improve traceability; they do not constitute a claim of
|
| 1124 |
+
bitwise-identical execution across different machines or software releases.
|
| 1125 |
+
Operating instructions remain in the project README (`../README.md` in the original V2 documentation tree).
|
| 1126 |
+
|
| 1127 |
+
## 8. Evaluation Methodology
|
| 1128 |
+
|
| 1129 |
+
### 8.1 Fixed reference loss
|
| 1130 |
+
|
| 1131 |
+
The validation stream materializes sixteen batches per source, each containing
|
| 1132 |
+
two sequences of 2,048 targets. This yields:
|
| 1133 |
+
|
| 1134 |
+
| Quantity | Count |
|
| 1135 |
+
| --- | ---: |
|
| 1136 |
+
| Source components | 4 |
|
| 1137 |
+
| Batches per component | 16 |
|
| 1138 |
+
| Total batches | 64 |
|
| 1139 |
+
| Target positions per component | 65,536 |
|
| 1140 |
+
| Total target positions | 262,144 |
|
| 1141 |
+
|
| 1142 |
+
Per-source cross-entropies are combined using the training mixture's 55/25/10/10
|
| 1143 |
+
weights. Because the source sample sizes are equal but weights differ, this is
|
| 1144 |
+
not a simple equal average across all batches.
|
| 1145 |
+
|
| 1146 |
+
~~~text
|
| 1147 |
+
L_reference = 0.55 * L_web + 0.25 * L_dclm
|
| 1148 |
+
+ 0.10 * L_wiki + 0.10 * L_cosmopedia
|
| 1149 |
+
|
| 1150 |
+
reference_perplexity = exp(L_reference)
|
| 1151 |
+
~~~
|
| 1152 |
+
|
| 1153 |
+
Validation runs every 25M consumed tokens, approximately every 235 updates at
|
| 1154 |
+
the current batch geometry. The reference fingerprint remains unchanged across
|
| 1155 |
+
the documented continuation:
|
| 1156 |
+
|
| 1157 |
+
~~~text
|
| 1158 |
+
99e7d4417061db5a70138701694ad5577d0f9ff0d0fc729ddc6beff06b3a7081
|
| 1159 |
+
~~~
|
| 1160 |
+
|
| 1161 |
+
These fixed batches support longitudinal comparisons within this model's run.
|
| 1162 |
+
They are small relative to the corpus and do not quantify uncertainty across
|
| 1163 |
+
all possible held-out documents.
|
| 1164 |
+
|
| 1165 |
+
### 8.2 Generation probes
|
| 1166 |
+
|
| 1167 |
+
Five fixed raw-text prefixes are sampled every 50M tokens:
|
| 1168 |
+
|
| 1169 |
+
| Probe | Full prefix |
|
| 1170 |
+
| --- | --- |
|
| 1171 |
+
| Narrative continuation | The library was closed for repairs, so Maya decided to |
|
| 1172 |
+
| Basic explanation | Plants need sunlight because |
|
| 1173 |
+
| Learning advice | A useful way to remember a new word is to |
|
| 1174 |
+
| Contextual continuation | The train arrived late because of heavy snow. When the passengers stepped outside, |
|
| 1175 |
+
| Basic explanation | Clean drinking water is important because |
|
| 1176 |
+
|
| 1177 |
+
The recorded comparison path uses greedy decoding, temperature 0, at most 64
|
| 1178 |
+
new tokens, and the model's own frozen tokenizer. It uses cached autoregressive
|
| 1179 |
+
generation and stops at document end. It does not apply a repetition penalty
|
| 1180 |
+
or top-k sampling.
|
| 1181 |
+
|
| 1182 |
+
These settings deliberately make comparisons stable. Greedy failure cases are
|
| 1183 |
+
not the only possible outputs, but changing temperature does not by itself
|
| 1184 |
+
establish that a factual or contextual weakness is solved. Probes are qualitative
|
| 1185 |
+
development diagnostics with no reported automatic capability score.
|
| 1186 |
+
|
| 1187 |
+
### 8.3 Independent evaluation still to perform
|
| 1188 |
+
|
| 1189 |
+
Before any final capability claim, freeze candidate weights and publish the
|
| 1190 |
+
evaluation settings, prompts or task versions, decoding parameters, and scoring
|
| 1191 |
+
rules. The intended evaluation record should separate held-out language modeling,
|
| 1192 |
+
factual recall, use of supplied context, narrative coherence, and repetition.
|
| 1193 |
+
|
| 1194 |
+
No downstream benchmark score, human-review pass rate, or untouched final-split
|
| 1195 |
+
result has been established in this report. Future comparisons must use documented
|
| 1196 |
+
protocols and identify possible training-data overlap.
|
| 1197 |
+
|
| 1198 |
+
## 9. Interim Results
|
| 1199 |
+
|
| 1200 |
+
### 9.1 Reference-loss milestones
|
| 1201 |
+
|
| 1202 |
+
| Step | Consumed training tokens | Reference loss | Perplexity | Context |
|
| 1203 |
+
| ---: | ---: | ---: | ---: | --- |
|
| 1204 |
+
| 235 | 25,026,560 | 5.7345 | 309.37 | Early training |
|
| 1205 |
+
| 4,696 | 500,105,216 | 3.3536 | 28.61 | Budget-extension boundary |
|
| 1206 |
+
| 5,165 | 550,051,840 | 3.4327 | 30.96 | Near the end of rewarm |
|
| 1207 |
+
| 7,982 | 850,051,072 | 3.3160 | 27.55 | Continued pretraining |
|
| 1208 |
+
| 9,156 | 975,077,376 | 3.2832 | 26.66 | Continued pretraining |
|
| 1209 |
+
| **9,391** | **1,000,103,936** | **3.2812** | **26.61** | **Reporting cutoff** |
|
| 1210 |
+
|
| 1211 |
+
All logged evaluations through the cutoff are retained in the
|
| 1212 |
+
validation CSV (`tables/validation_through_0009391.csv` in the original V2 documentation tree), including repeated
|
| 1213 |
+
observations if present. The table above selects milestones, not every event.
|
| 1214 |
+
Loss and perplexity retain their logged rounding.
|
| 1215 |
+
|
| 1216 |
+
Loss increased during rewarm and subsequently fell below the earlier boundary's
|
| 1217 |
+
value. This is a temporal association with the schedule change, not a controlled
|
| 1218 |
+
causal result. More consumed data and more optimizer updates also changed.
|
| 1219 |
+
|
| 1220 |
+
### 9.2 Per-source reference loss
|
| 1221 |
+
|
| 1222 |
+
| Source | Step 4,696 | Step 9,391 |
|
| 1223 |
+
| --- | ---: | ---: |
|
| 1224 |
+
| Web | 3.4531 | 3.3884 |
|
| 1225 |
+
| DCLM | 3.6497 | 3.5756 |
|
| 1226 |
+
| Wiki | 2.8654 | 2.7904 |
|
| 1227 |
+
| Cosmopedia | 2.5543 | 2.4468 |
|
| 1228 |
+
|
| 1229 |
+
All four fixed source references improved between these boundaries. Differences
|
| 1230 |
+
between sources reflect different reference distributions as well as learned
|
| 1231 |
+
prediction; a lower source loss is not a ranking of factual competence.
|
| 1232 |
+
|
| 1233 |
+
### 9.3 Throughput
|
| 1234 |
+
|
| 1235 |
+
As one identifiable production observation, step 9,280 logged **12,889 tokens/s**
|
| 1236 |
+
for its reporting interval and **13,570 run tokens/s**. These are aggregate
|
| 1237 |
+
cluster training-position rates, not inference generation speed and not a
|
| 1238 |
+
fourfold sum of independently reported rank rates.
|
| 1239 |
+
|
| 1240 |
+
The run counter describes that worker invocation's timed training loop, not all
|
| 1241 |
+
project wall time. Startup, interrupted sessions, and external preparation must
|
| 1242 |
+
be accounted for separately before reporting total training duration or cost.
|
| 1243 |
+
A final throughput summary, distribution of step times, peak-memory audit, and
|
| 1244 |
+
energy measurement remain pending. No model FLOP utilization is claimed.
|
| 1245 |
+
|
| 1246 |
+
### 9.4 Qualitative limitations observed so far
|
| 1247 |
+
|
| 1248 |
+
The logged prefixes elicit grammatical fragments but also repetitive clauses,
|
| 1249 |
+
topic drift, and factual errors. At step 5,165, for example, the word-learning
|
| 1250 |
+
prefix began with useful advice about using a word in a sentence and then
|
| 1251 |
+
repeated that idea. The plant and water explanations were not dependable.
|
| 1252 |
+
|
| 1253 |
+
Improving reference loss is therefore evidence of better prediction on those
|
| 1254 |
+
reference batches, not proof of reliable open-ended generation. A final report
|
| 1255 |
+
should retain complete successes and failures rather than presenting only
|
| 1256 |
+
favorable excerpts. The full probe prefixes and generation settings above make
|
| 1257 |
+
that review reproducible.
|
| 1258 |
+
|
| 1259 |
+
## 10. Post-Training and Release Status
|
| 1260 |
+
|
| 1261 |
+
| Item | Status at this report boundary |
|
| 1262 |
+
| --- | --- |
|
| 1263 |
+
| Tokenizer fitting and development audit | Completed |
|
| 1264 |
+
| From-scratch pretraining | In progress |
|
| 1265 |
+
| 15B-token endpoint | Planned, not reached |
|
| 1266 |
+
| Final pretrained checkpoint selection | Pending |
|
| 1267 |
+
| Instruction fine-tuning for these weights | Not reported |
|
| 1268 |
+
| Preference optimization / reinforcement learning | Not reported |
|
| 1269 |
+
| Independent downstream evaluation | Pending |
|
| 1270 |
+
| Export parity and fresh-download validation of final weights | Pending |
|
| 1271 |
+
| Public final-weight release | Pending |
|
| 1272 |
+
|
| 1273 |
+
The prepared [OpenSML repository](https://huggingface.co/wzebrowski/OpenSML) is
|
| 1274 |
+
private at this revision. Its model card uses Apache-2.0 metadata for the planned
|
| 1275 |
+
release. That does not relicense upstream datasets or remove obligations on
|
| 1276 |
+
third-party code and content.
|
| 1277 |
+
|
| 1278 |
+
A final export should include weights, matching tokenizer and configuration,
|
| 1279 |
+
inference instructions, provenance, evaluation settings, and a reproducible
|
| 1280 |
+
loading/generation check. Compatibility with an inference library should be
|
| 1281 |
+
verified rather than inferred from the model's general Transformer architecture.
|
| 1282 |
+
|
| 1283 |
+
No existing fine-tuned checkpoint from an earlier model is presented as a
|
| 1284 |
+
post-trained version of OpenSML-152M.
|
| 1285 |
+
|
| 1286 |
+
## 11. Limitations and Intended Use
|
| 1287 |
+
|
| 1288 |
+
- **Incomplete training:** the reported snapshot covers approximately 1B tokens, not the full 15B target.
|
| 1289 |
+
- **Generation reliability:** repetitive and incorrect text remains an observed failure mode.
|
| 1290 |
+
- **Development reuse:** reference batches and fixed prompts have been inspected repeatedly.
|
| 1291 |
+
- **Data coverage:** educational prose does not guarantee balanced coverage of every domain or language.
|
| 1292 |
+
- **Deduplication limits:** a bounded exact-hash window does not remove all duplicates, paraphrases, or benchmark overlap.
|
| 1293 |
+
- **Sequence boundaries:** packing allows attention across document boundaries without an attention reset.
|
| 1294 |
+
- **Source order:** live streaming does not perform the seeded document shuffle used for tokenizer fitting.
|
| 1295 |
+
- **Schedule confounding:** the recorded early decay and rewarm prevent describing this as a single unchanged training schedule.
|
| 1296 |
+
- **Uncontrolled design choices:** architecture, tokenizer, and data choices have not been individually validated by matched ablations.
|
| 1297 |
+
- **Infrastructure dependence:** wired routing, tunnels, and project-specific collective safeguards add operational complexity.
|
| 1298 |
+
- **Unmeasured efficiency:** no end-to-end energy result, MFU measurement, or final total training cost is reported.
|
| 1299 |
+
|
| 1300 |
+
Current intended use is research into small-model training and text completion.
|
| 1301 |
+
This base model should not be treated as a reliable assistant or a source of
|
| 1302 |
+
high-stakes factual advice.
|
| 1303 |
+
|
| 1304 |
+
## 12. Evidence and Completion Checklist
|
| 1305 |
+
|
| 1306 |
+
### 12.1 Local evidence map
|
| 1307 |
+
|
| 1308 |
+
| Claim group | Primary records |
|
| 1309 |
+
| --- | --- |
|
| 1310 |
+
| Architecture and parameter construction | Model implementation (`../sml_v2/model.py` in the original V2 documentation tree) |
|
| 1311 |
+
| Optimizer and precision | Precision implementation (`../sml_v2/precision.py` in the original V2 documentation tree) |
|
| 1312 |
+
| Source weights, fields, revisions | Corpus configuration (`../configs/corpus.json` in the original V2 documentation tree) |
|
| 1313 |
+
| Filtering, identity, split rules | Corpus implementation (`../sml_v2/corpus.py` in the original V2 documentation tree) |
|
| 1314 |
+
| Stream cursors and packing | Streaming implementation (`../sml_v2/stream.py` in the original V2 documentation tree) |
|
| 1315 |
+
| Tokenizer construction and audits | Manifest (`../tokenizer/bytebpe32k_v1/manifest.json` in the original V2 documentation tree), audit (`../tokenizer/bytebpe32k_v1/report.json` in the original V2 documentation tree) |
|
| 1316 |
+
| Live continuation settings | Recorded job recipe (`../runs/full_15b_v1/jobs/20260918_085811_b4e5c849/input/recipe.json` in the original V2 documentation tree) |
|
| 1317 |
+
| Distributed updates and evaluation | Trainer (`../sml_v2/pretrain.py` in the original V2 documentation tree), launcher (`../sml_v2/launch.py` in the original V2 documentation tree) |
|
| 1318 |
+
| Reported validation observations | CSV (`tables/validation_through_0009391.csv` in the original V2 documentation tree), provenance (`tables/validation_through_0009391.json` in the original V2 documentation tree) |
|
| 1319 |
+
| Implementation ancestry | Code provenance (`../provenance.json` in the original V2 documentation tree) |
|
| 1320 |
+
|
| 1321 |
+
The evidence table references the local project layout. A future published report
|
| 1322 |
+
must package durable copies or revision-pinned links; local run directories alone
|
| 1323 |
+
are not a public reproduction artifact.
|
| 1324 |
+
|
| 1325 |
+
The companion evidence exporter (`../scripts/export_report_evidence.py` in the original V2 documentation tree) reads
|
| 1326 |
+
logs without loading a model, contacting workers, or changing training. It
|
| 1327 |
+
records source-log hashes, line numbers, and the exported table's hash. Active
|
| 1328 |
+
logs grow, so their hashes identify the snapshot read rather than an immutable
|
| 1329 |
+
future file.
|
| 1330 |
+
|
| 1331 |
+
### 12.2 Reporting approach and attribution
|
| 1332 |
+
|
| 1333 |
+
The organization was informed by the transparent reporting approach in
|
| 1334 |
+
[PetitGPT's technical report](https://github.com/yangqi0/petitgpt/blob/53a5bb33052fa8092987eacc1047e040a7c5ce30/docs/petitgpt-v1/TECHNICAL_REPORT.md).
|
| 1335 |
+
The prose, model configuration, implementation description, and measurements
|
| 1336 |
+
here describe this project. PetitGPT's results are not imported as our results
|
| 1337 |
+
or used as matched baselines.
|
| 1338 |
+
|
| 1339 |
+
The system builds on established Transformer methods, MLX, Hugging Face tooling,
|
| 1340 |
+
and the cited data sources. Component-specific attribution and inherited
|
| 1341 |
+
implementation history should remain attached to the released code.
|
| 1342 |
+
|
| 1343 |
+
### 12.3 Items required for a completed report
|
| 1344 |
+
|
| 1345 |
+
- [ ] Freeze the final training history, schedule, source consumption, and selected checkpoint.
|
| 1346 |
+
- [ ] Publish the complete loss curve with restart and schedule boundaries identified.
|
| 1347 |
+
- [ ] Summarize sustained throughput, memory, elapsed time, and measurement scope.
|
| 1348 |
+
- [ ] Evaluate the reserved final split without using it for checkpoint selection.
|
| 1349 |
+
- [ ] Run independently specified capability and generation evaluations.
|
| 1350 |
+
- [ ] Publish complete qualitative examples with prompt and decoding settings.
|
| 1351 |
+
- [ ] Document any post-training experiments separately from base-model results.
|
| 1352 |
+
- [ ] Verify exported weights, tokenizer, loading, and generation from a fresh download.
|
| 1353 |
+
- [ ] Package durable evidence and review dataset/code attribution before release.
|
| 1354 |
+
|
| 1355 |
+
Until those items are completed, this document is a detailed methods and interim
|
| 1356 |
+
results report, not a final model-quality claim.
|