wzebrowski commited on
Commit
301555a
·
verified ·
1 Parent(s): 127ad90

Add current V2 technical report and historical training record

Browse files
Files changed (1) hide show
  1. 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
+ ![OpenSML pretraining validation loss: full Phase A and Phase B history with a late-training zoom](https://huggingface.co/wzebrowski/OpenSML-150M/resolve/main/pretraining-overview.svg)
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
+ ![OpenSML Phase B validation loss on the expanded held-out set, with the selected checkpoint marked](https://huggingface.co/wzebrowski/OpenSML-150M/resolve/main/pretraining-phase-b.svg)
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
+ ![OpenSML original-set validation loss for web, DCLM, Wikipedia, and Cosmopedia across both pretraining phases](https://huggingface.co/wzebrowski/OpenSML-150M/resolve/main/pretraining-sources.svg)
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.