wzebrowski commited on
Commit
04436f5
·
verified ·
1 Parent(s): b75157e

Expand model card with sourced comparisons and training figures

Browse files

Compare published OpenSML-150M and SmolLM2 results, include IFEval, simplify metric tables, and add training details, recorded examples and reproducible figures. Model weights and inference runtime are unchanged.

.gitattributes CHANGED
@@ -35,3 +35,6 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
  docs/figures/cooldown-detail.png filter=lfs diff=lfs merge=lfs -text
37
  docs/figures/pretraining-overview.png filter=lfs diff=lfs merge=lfs -text
 
 
 
 
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
  docs/figures/cooldown-detail.png filter=lfs diff=lfs merge=lfs -text
37
  docs/figures/pretraining-overview.png filter=lfs diff=lfs merge=lfs -text
38
+ docs/figures/benchmark-comparison.png filter=lfs diff=lfs merge=lfs -text
39
+ docs/figures/chat-diagnostics.png filter=lfs diff=lfs merge=lfs -text
40
+ docs/figures/ifeval-comparison.png filter=lfs diff=lfs merge=lfs -text
FILE_MANIFEST.json CHANGED
@@ -22,8 +22,8 @@
22
  "sha256": "0e6865f1a81cfd69ca48e6987658854ce0c0d23e91d72ae545393cd5fa032375"
23
  },
24
  "README.md": {
25
- "bytes": 7699,
26
- "sha256": "900df54a78e604f4245328633b77eb3cb606e8c213dc1ca71b41549905ced58e"
27
  },
28
  "REPOSITORIES.json": {
29
  "bytes": 716,
@@ -130,8 +130,8 @@
130
  "sha256": "e0b0c730321360c40f20e53a22890c52cd5294bad2a5777a0a891096557a2f0a"
131
  },
132
  "docs/EVALUATION.md": {
133
- "bytes": 6613,
134
- "sha256": "5522817f8d698f05b43adfc1c5227bab4e917492c898fa4b792d521d42a512d8"
135
  },
136
  "docs/EXAMPLES.md": {
137
  "bytes": 1117,
@@ -141,6 +141,22 @@
141
  "bytes": 13515,
142
  "sha256": "f98d45b39b9595510fa80d495a3758b211d8c770adc739d381763d3cfb2a2a0b"
143
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
  "docs/figures/cooldown-detail.png": {
145
  "bytes": 185666,
146
  "sha256": "0fa840653d1a5305297ef6f51ba08dc70a4bbfaf8029c411627e39dfc3cdc153"
@@ -149,6 +165,14 @@
149
  "bytes": 174630,
150
  "sha256": "1071d21211f7d32d9f9f5874e62f46a2a17306f88f0f355b24aee5b4af4c4e0f"
151
  },
 
 
 
 
 
 
 
 
152
  "docs/figures/pretraining-overview.png": {
153
  "bytes": 157953,
154
  "sha256": "c46bba5d4fae1c55701def21829de08fd3756dc9659fee2a54a79f42eb1afcb0"
@@ -369,6 +393,10 @@
369
  "bytes": 4788,
370
  "sha256": "2b59f728ebc9bef6deaf378e6908f7b55723b368f60da83f9af5b2b1731d0346"
371
  },
 
 
 
 
372
  "results/package_inference_verification.json": {
373
  "bytes": 26015,
374
  "sha256": "fed55313b61008e8f379a7b4bc49535cc501a31a942c7560687de4a4bd1cd47f"
@@ -481,6 +509,10 @@
481
  "bytes": 1823,
482
  "sha256": "cac0e352b21365bfb4fef9f5c265aa36426552bb47851be5fdb5ff585648f69a"
483
  },
 
 
 
 
484
  "scripts/plot_training.py": {
485
  "bytes": 2877,
486
  "sha256": "c47f496b10f813dcb61697a0d49ed14043137ee1e2a96911a68fccb31fa9df26"
 
22
  "sha256": "0e6865f1a81cfd69ca48e6987658854ce0c0d23e91d72ae545393cd5fa032375"
23
  },
24
  "README.md": {
25
+ "bytes": 13155,
26
+ "sha256": "894e1200eb78c3afd6617410b209bfd389f77c45301c3b6cfb3faf8b9fd380cb"
27
  },
28
  "REPOSITORIES.json": {
29
  "bytes": 716,
 
130
  "sha256": "e0b0c730321360c40f20e53a22890c52cd5294bad2a5777a0a891096557a2f0a"
131
  },
132
  "docs/EVALUATION.md": {
133
+ "bytes": 8582,
134
+ "sha256": "79c7190a634b9008502242133bf76e246ab69700814049b5ac39f49ad51c57c3"
135
  },
136
  "docs/EXAMPLES.md": {
137
  "bytes": 1117,
 
141
  "bytes": 13515,
142
  "sha256": "f98d45b39b9595510fa80d495a3758b211d8c770adc739d381763d3cfb2a2a0b"
143
  },
144
+ "docs/figures/benchmark-comparison.png": {
145
+ "bytes": 125053,
146
+ "sha256": "37438bfe291e2cc5b7513ec912cab9eaf7ce3d6352543f8e63d44da3a4f7d5b3"
147
+ },
148
+ "docs/figures/benchmark-comparison.svg": {
149
+ "bytes": 89737,
150
+ "sha256": "64297355167c23c84cc4227bf54eb6be8d66c5837d45e201ed9304594df36d85"
151
+ },
152
+ "docs/figures/chat-diagnostics.png": {
153
+ "bytes": 108673,
154
+ "sha256": "08388301b65a94ce3bd166de02dd6aa887515f9ed617a8972359b742334cb422"
155
+ },
156
+ "docs/figures/chat-diagnostics.svg": {
157
+ "bytes": 64470,
158
+ "sha256": "b70ae8d8b730c7f178a41ae9d781d2f7f8fbedf3640f9d4991a77c6c89e39725"
159
+ },
160
  "docs/figures/cooldown-detail.png": {
161
  "bytes": 185666,
162
  "sha256": "0fa840653d1a5305297ef6f51ba08dc70a4bbfaf8029c411627e39dfc3cdc153"
 
165
  "bytes": 174630,
166
  "sha256": "1071d21211f7d32d9f9f5874e62f46a2a17306f88f0f355b24aee5b4af4c4e0f"
167
  },
168
+ "docs/figures/ifeval-comparison.png": {
169
+ "bytes": 108050,
170
+ "sha256": "c5a39cdcbc0b8b2a48dd7e8136c61132b4340e0145fde1cdf1e73a498785e207"
171
+ },
172
+ "docs/figures/ifeval-comparison.svg": {
173
+ "bytes": 69743,
174
+ "sha256": "9416ed14acd5d52ea3931100e5c2330c6e1c7c7f19724602c389fc71c79a56d8"
175
+ },
176
  "docs/figures/pretraining-overview.png": {
177
  "bytes": 157953,
178
  "sha256": "c46bba5d4fae1c55701def21829de08fd3756dc9659fee2a54a79f42eb1afcb0"
 
393
  "bytes": 4788,
394
  "sha256": "2b59f728ebc9bef6deaf378e6908f7b55723b368f60da83f9af5b2b1731d0346"
395
  },
396
+ "results/baselines/published_models.json": {
397
+ "bytes": 2471,
398
+ "sha256": "2cafe36ca3f2fe3dd00cf9aa63314eac64a73de2c58e2de92cdeee47306bd8ae"
399
+ },
400
  "results/package_inference_verification.json": {
401
  "bytes": 26015,
402
  "sha256": "fed55313b61008e8f379a7b4bc49535cc501a31a942c7560687de4a4bd1cd47f"
 
509
  "bytes": 1823,
510
  "sha256": "cac0e352b21365bfb4fef9f5c265aa36426552bb47851be5fdb5ff585648f69a"
511
  },
512
+ "scripts/plot_results.py": {
513
+ "bytes": 6190,
514
+ "sha256": "d7d137a4ff838c2bd9d1cdd7f8428a9a78101ab97868ebbaab42eb4a561ae648"
515
+ },
516
  "scripts/plot_training.py": {
517
  "bytes": 2877,
518
  "sha256": "c47f496b10f813dcb61697a0d49ed14043137ee1e2a96911a68fccb31fa9df26"
README.md CHANGED
@@ -26,103 +26,171 @@ datasets:
26
 
27
  # Solstice-1
28
 
29
- **An OpenSML 175M-parameter English chat research model trained from scratch on Apple Silicon.**
30
 
31
- Author: William Zebrowski · License: Apache-2.0 · Status: research preview
32
 
33
- [Model weights](https://huggingface.co/OpenSML/Solstice-1) · [GitHub source](https://github.com/williamzebrowskI/Solstice-1) · [Run guide](RUN_GUIDE.md) · [Technical report](docs/TECHNICAL_REPORT.md) · [Evaluation](docs/EVALUATION.md) · [Training data](docs/DATA.md) · [Results](results/public/summary.json)
34
 
35
- Solstice-1 starts a model family under OpenSML. This first release is a 175M chat model with a 2,048-token context. Its selected weights come from **42.001B pretraining tokens and three adapter fine-tuning stages**. The package provides merged FP32 weights, the original tokenizer, a native MLX runner, training-source snapshots, and recorded evaluation evidence.
36
-
37
- The model is intended for research into small English language models, short conversations, reading supplied text, and instruction following. It can produce incorrect answers, repeat itself, decline answerable questions, and invent information that was not provided. The measurements below do not establish dependable factual or production behavior.
38
 
39
  ## Model specification
40
 
41
  | Setting | Value |
42
  | --- | --- |
43
- | Public size designation | 175M |
44
- | Exact parameter count | 174,202,432 |
45
- | Transformer | 44 layers; width 576; SwiGLU intermediate width 1,536 |
46
- | Attention | 9 query heads / 3 KV heads; head dimension 64 |
47
- | Components | RoPE 10,000; RMSNorm; Q/K normalization; tied embeddings |
48
- | Vocabulary / shared context | 32,000 byte-level BPE tokens / 2,048 tokens |
49
- | Pretraining exposure | 42,001,367,040 processed token positions |
50
- | Released weights | Unquantized merged FP32 safetensors |
51
- | Supported inference | Supplied native MLX runner on Apple Silicon |
52
-
53
- This is a different architecture and lineage from OpenSML-150M and OpenSML-JSONLite-175M. Those releases are comparison references, not weight ancestors. The frozen tokenizer is reused from the earlier OpenSML project.
54
 
55
- ## Run locally
56
 
57
- Download the entire model repository, including its tokenizer and native source. While the repository is private, run `hf auth login` after installing `huggingface_hub`, using an account with access to OpenSML/Solstice-1:
58
 
59
- ```bash
60
- python3.11 -m venv .venv
61
- source .venv/bin/activate
62
- python -m pip install huggingface_hub
63
- hf download OpenSML/Solstice-1 --local-dir Solstice-1
64
- cd Solstice-1
65
- python -m pip install -r requirements.txt
66
- python inference.py --prompt "What is the main function of the heart?" --max-new-tokens 96
67
- python inference.py --interactive
68
- ```
69
 
70
- The runner uses the model's native structural-token chat format. It checks the weight hash and tokenizer before loading, defaults to greedy FP32 inference, and rejects context overflow without truncation. `/reset` clears an interactive conversation; `/quit` exits. See [recorded package verification](PACKAGING_VERIFICATION.json) for the environment and checks actually completed.
71
 
72
- **Use the supplied runner.** This package does not provide a verified Transformers AutoModel, MLX-LM auto-loader, GGUF, or CUDA implementation. The context limit includes previous turns, role delimiters, the current prompt, and the requested output budget.
 
 
 
 
 
 
 
 
 
 
73
 
74
- ## Measured results
75
 
76
- Full-split, zero-shot likelihood evaluations use native MLX FP32 scoring:
77
 
78
- | Benchmark | Examples | Accuracy | Normalized accuracy |
 
 
79
  | --- | --- | --- | --- |
80
- | ARC Easy | 2376 | 62.58% | 62.33% |
81
- | ARC Challenge | 1172 | 29.35% | 30.89% |
82
- | PIQA | 1838 | 66.49% | 66.21% |
83
- | HellaSwag | 10042 | 32.85% | 39.40% |
 
84
 
85
- `acc_norm` divides each candidate's summed log-likelihood by its Unicode-character count. It is distinct from raw accuracy. The evaluator follows pinned task conventions but is not an installed lm-evaluation-harness run.
86
 
87
- | IFEval metric | Score | Passes / checks |
88
- | --- | --- | --- |
89
- | Strict prompts | 17.93% | 97/541 |
90
- | Strict instructions | 30.10% | 251/834 |
91
- | Loose prompts | 19.22% | 104/541 |
92
- | Loose instructions | 32.49% | 271/834 |
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
 
94
- IFEval uses all 541 prompts / 834 instructions, greedy native-chat generation, no system message or repetition penalty, and a 1,024-token output cap. **130/541 responses reach that cap.** All responses are scored as produced. These numbers do not measure general factual accuracy.
 
 
 
 
 
 
95
 
96
- On a separate 192-response authored chat check, 107/180 automatically checked answers match the accepted answers; 191/192 responses stop naturally, and three have repetition flags. Automatic answer matching is conservative, and repetition detection is heuristic. These checks are not a broad human preference study.
97
 
98
- ![Recorded pretraining history](docs/figures/pretraining-overview.png)
99
 
100
- See the [evaluation report](docs/EVALUATION.md) for baseline comparisons, dataset pins, protocol differences, and private-test scope.
101
 
102
- ## Training lineage
103
 
104
- ```text
105
- Fresh Deep44 initialization → streamed prose pretraining
106
- → add Python/SQL at 36.801B → 40.001B → 2.000B-token cooldown
107
- → 42.001B pretrained base
108
- → adapter SFT 1, selected update 2000
109
- → adapter SFT 2, selected update 256
110
- → adapter SFT 3, selected update 128 → Solstice-1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  ```
112
 
113
- Only updates through 128 of the final 256-update experiment are inherited. Earlier experimental branches and checkpoint 167 are not additional stages in this lineage. [Checkpoint lineage and hashes](provenance/LINEAGE.json) · [Selected data exposure](provenance/SELECTED_PREFIX.json).
 
 
 
 
 
 
 
 
 
 
 
114
 
115
- ## Known limitations
116
 
117
- - The model sometimes gives fluent but incorrect factual explanations.
118
- - On the new authored evaluation, 111/200 answerable extraction questions triggered unnecessary-abstention signals. On a separate set with different wording, it failed all 15 missing-information cases. These are distinct tests, not contradictory measures of the same inputs.
119
- - Instruction following remains incomplete; only 97/541 IFEval prompts satisfy every strict requirement.
120
- - Repetition and token-limit stops remain possible, especially on longer requested outputs.
121
- - JSON extraction, tool use, robust coding, long documents, multilingual use, safety behavior, and prompt-injection resistance are not validated release capabilities.
122
- - Public and historical benchmarks informed earlier experiments. The newly reserved 1,000-case panel was evaluated after this finalist was selected, but shares authored task families with training. No comprehensive semantic contamination audit or independent human evaluation is claimed.
123
 
124
- ## Repository contents and licensing
125
 
126
- The weights and author-controlled code are released under [Apache-2.0](https://huggingface.co/OpenSML/Solstice-1/blob/main/LICENSE). Upstream datasets and third-party code retain their own terms; the model license does not relicense those materials. [Source notice](SOURCE_NOTICE.md) · [Third-party notices](THIRD_PARTY_NOTICES.md).
127
 
128
- Technical details, data provenance, exact selected training prefixes, source snapshots, and reproduction prerequisites are included. Full raw corpora, optimizer binaries, and all ancestor weights are not distributed. The historical training archive is not a verified one-command retraining package. [Training and reproducibility](TRAINING_AND_REPRODUCIBILITY.md).
 
26
 
27
  # Solstice-1
28
 
29
+ **A 175M-parameter English chat model, trained from scratch on five Macs.**
30
 
31
+ William Zebrowski · OpenSML · Apache-2.0 · Research preview
32
 
33
+ [Weights](https://huggingface.co/OpenSML/Solstice-1) · [Source](https://github.com/williamzebrowskI/Solstice-1) · [Run guide](RUN_GUIDE.md) · [Technical report](docs/TECHNICAL_REPORT.md) · [Evaluation](docs/EVALUATION.md) · [Data](docs/DATA.md)
34
 
35
+ Solstice-1 is the first model in the Solstice family. It combines **42.001B pretraining tokens** with three stages of adapter fine-tuning for short conversations, reading comprehension and instruction following. The release includes merged FP32 weights, the original tokenizer, an MLX runner, training records and benchmark outputs.
 
 
36
 
37
  ## Model specification
38
 
39
  | Setting | Value |
40
  | --- | --- |
41
+ | Parameters | 175M rounded; 174,202,432 exact |
42
+ | Transformer | 44 layers; hidden width 576; SwiGLU width 1,536 |
43
+ | Attention | 9 query heads, 3 KV heads; head dimension 64 |
44
+ | Components | RoPE (base 10,000), RMSNorm, Q/K normalization, tied embeddings |
45
+ | Tokenizer | 32,000-token byte-level BPE, reused from OpenSML |
46
+ | Context | 2,048 tokens, including conversation history and generated output |
47
+ | Pretraining | 42,001,367,040 processed token positions |
48
+ | Release | Merged FP32 safetensors; native MLX on Apple Silicon |
 
 
 
49
 
50
+ Solstice-1 has a separate weight lineage from OpenSML-150M and OpenSML-JSONLite-175M. Reusing the tokenizer does not make those models its weight ancestors.
51
 
52
+ ## Measured results
53
 
54
+ ### Knowledge and commonsense
 
 
 
 
 
 
 
 
 
55
 
56
+ Zero-shot likelihood scoring on the complete ARC Easy, ARC Challenge, PIQA and HellaSwag evaluation splits. Accuracy ranks the total answer log-likelihood; `acc_norm` ranks it after dividing by answer length in characters. Higher is better.
57
 
58
+ | Benchmark | Metric | Solstice-1 | OpenSML-150M | SmolLM2-135M Instruct |
59
+ | --- | --- | --- | --- | --- |
60
+ | ARC Easy | Accuracy | 62.58% | 56.65% | — |
61
+ | ARC Easy | acc_norm | 62.33% | 55.43% | — |
62
+ | ARC Challenge | Accuracy | 29.35% | 26.02% | — |
63
+ | ARC Challenge | acc_norm | 30.89% | 29.52% | — |
64
+ | PIQA | Accuracy | 66.49% | 64.53% | — |
65
+ | PIQA | acc_norm | 66.21% | 64.09% | 66.3% |
66
+ | HellaSwag | Accuracy | 32.85% | 30.55% | — |
67
+ | HellaSwag | acc_norm | 39.40% | 33.94% | 40.9% |
68
+ | ARC (publisher average) | acc_norm | — | — | 37.3% |
69
 
70
+ ![Normalized benchmark accuracy for Solstice-1 and published small-model references](docs/figures/benchmark-comparison.png)
71
 
72
+ ### Instruction following
73
 
74
+ IFEval checks whether generated responses follow explicit instructions. It measures accuracy, with separate strict and loose scoring at the prompt and instruction levels. **It has no `acc_norm` metric.**
75
+
76
+ | IFEval accuracy | Solstice-1 | OpenSML-150M | SmolLM2-135M Instruct |
77
  | --- | --- | --- | --- |
78
+ | Strict prompts | 17.93% | 15.16% | — |
79
+ | Strict instructions | 30.10% | 25.30% | — |
80
+ | Loose prompts | 19.22% | 15.71% | — |
81
+ | Loose instructions | 32.49% | 25.78% | — |
82
+ | Publisher prompt/instruction average | — | — | 29.9% |
83
 
84
+ ![IFEval accuracy compared with OpenSML-150M and the earlier checkpoint 167](docs/figures/ifeval-comparison.png)
85
 
86
+ Solstice uses greedy generation, no system message or repetition penalty, and a 1,024-token output cap. Of 541 prompts, 130 reach that cap; they remain in the scores. The 150M release used a 1,280-token cap and a different chat format.
87
+
88
+ Baseline scores come from the published [OpenSML-150M card](https://huggingface.co/OpenSML/OpenSML-150M) and [SmolLM2-135M-Instruct card](https://huggingface.co/HuggingFaceTB/SmolLM2-135M-Instruct), not fresh reruns. “—” means the required breakdown is not published in those cards. SmolLM2 reports ARC and IFEval as averages; no missing sub-scores are inferred.
89
+
90
+ Solstice uses native MLX FP32 scoring. SmolLM2 uses LightEval; its [evaluation code](https://github.com/huggingface/smollm/tree/438be18dae658a638f3a6976fdf5190bb6d68619/text/evaluation/smollm2) specifies character-normalized choice scores with a leading space excluded and instruct runs with a chat template. OpenSML-150M uses an older native pipeline. Prompt formatting, precision and generation budgets differ, so these are reference comparisons, not a controlled leaderboard. [Exact sources and metric definitions](results/baselines/published_models.json).
91
+
92
+ ### Conversation checks
93
+
94
+ A separate authored chat panel measures short-answer matching and response behavior. These automatic checks are narrower than human judgments of conversation quality.
95
+
96
+ | Measure | Solstice-1 |
97
+ | --- | ---: |
98
+ | Answer accuracy, objective cases | 59.44% |
99
+ | Natural stopping, all responses | 99.48% |
100
+ | Repetition flags, all responses | 1.56% |
101
+
102
+ ![Answer accuracy by chat category](docs/figures/chat-diagnostics.png)
103
+
104
+ The panel contains 180 checked answers and 12 open-ended responses. Repetition flags were reviewed: two were clear loops and one was a milder repeated idea. The full panel and scorer are included in [the saved results](results/public/chat/results.json).
105
+
106
+ On the separate reserved authored test, Solstice reaches **51.9%**, versus **20.0%** after SFT 1 and **25.9%** after SFT 2. On an older, reused panel, the corresponding scores are **53.84%, 52.13% and 54.55%**: the last stage does not improve every measure. The [evaluation report](docs/EVALUATION.md) explains selection, uncertainty and test exposure.
107
+
108
+ ## Pretraining
109
+
110
+ Pretraining starts from random weights. Five Apple Silicon workers use BF16 compute with FP32 master weights, gradients and optimizer state. The 2,048-token sequence length and accumulated batch produce **131,072 token positions per update**. AdamW uses betas (0.9, 0.95), weight decay 0.1 and gradient clipping at 1.
111
+
112
+ ### Data mixture
113
 
114
+ | Source | First 36.801B tokens | Remaining 5.200B tokens |
115
+ | --- | ---: | ---: |
116
+ | FineWeb-Edu | 70% | 56% |
117
+ | DCLM-Edu | 20% | 16% |
118
+ | English FineWiki | 10% | 8% |
119
+ | Python: public Stack-Edu text mirror | — | 15% |
120
+ | SQL: public Stack-Edu text mirror / configured continuation | — | 5% |
121
 
122
+ These are configured token shares, not measured unique-token counts. Data is streamed with bounded shuffling, quality filters, a recent-document deduplication window and fixed train/validation partitioning. The tokenizer stays frozen. Exact dataset revisions, filtering rules and upstream terms are in [Data provenance](docs/DATA.md).
123
 
124
+ ### Loss and learning rate
125
 
126
+ ![Recorded training loss, prose validation loss and learning rate](docs/figures/pretraining-overview.png)
127
 
128
+ The learning rate warms up to 3e-4, then changes through the recorded continuation schedules. At 40.001B tokens, a final 2B-token cooldown lowers it from 7.94e-5 to 1e-5. The selected base finishes at **42.001B tokens**, with prose validation loss **2.8356** on the training-time BF16 evaluation path.
129
 
130
+ ![Late pretraining and the final cooldown](docs/figures/cooldown-detail.png)
131
+
132
+ The shaded region is the cooldown; the dashed line marks the addition of Python and SQL. Training loss uses the changing mixture, while prose validation uses a fixed holdout. Their levels should not be treated as the same measurement. [Curve data](results/pretraining_validation.csv) · [Schedule details](docs/TECHNICAL_REPORT.md#5-distributed-optimization-and-schedules)
133
+
134
+ ## Fine-tuning
135
+
136
+ All three stages run on one Mac. They train rank-32 LoRA adapters on attention projections, plus the two chat-boundary token rows: **3.786M trainable parameters**. Each stage starts fresh optimizer moments and inherits the previous stage's adapters. The release merges these updates into the original FP32 base weights.
137
+
138
+ | Stage | Selected updates | Training data and objective |
139
+ | --- | ---: | --- |
140
+ | SFT 1 | 2,000 | Two passes over 48,000 conversations; assistant-only supervision with 20% prose-replay loss |
141
+ | SFT 2 | 256 | Editing, constraints, dialogue and grounding; conversational replay and a parent-distribution penalty |
142
+ | SFT 3 | 128 | Short reasoning, grounding, dialogue and abstention; replay and a lighter parent-distribution penalty |
143
+
144
+ Public SFT sources include Smol-SmolTalk, SmolTalk everyday conversations, SQuAD v2 and SciQ, alongside authored tasks. Whole conversations are retained; oversized examples and dedicated code, SQL, JSON and tool tasks are excluded from the selected text-chat recipe. The largest stage-1 conversation is 1,385 serialized tokens, within the 2,048-token context.
145
+
146
+ The final stage was planned for 256 updates; **only its first 128 are in this release**. It was selected using development checks before evaluation on the reserved test. This lineage uses supervised fine-tuning with replay and KL preservation, not DPO or reinforcement learning. Checkpoint 167 is a comparison model, not an ancestor. [Stage recipes, learning rates and selection](docs/TECHNICAL_REPORT.md#6-selected-fine-tuning-lineage) · [Exact lineage](provenance/LINEAGE.json)
147
+
148
+ ## Recorded examples
149
+
150
+ Greedy FP32 outputs reproduced in the release environment. The incorrect example is included to show the gap between fluent answers and factual reliability.
151
+
152
+ | Prompt | Model answer | Assessment |
153
+ | --- | --- | --- |
154
+ | What is the capital of Japan? Give a short answer. | Tokyo | Correct |
155
+ | Anika brought a teal notebook. Greta brought a black notebook. What color was Anika’s notebook? | teal | Correct; supplied-text question¹ |
156
+ | Which planet is closest to the Sun? Give a short answer. | venus | Incorrect; the answer is Mercury |
157
+
158
+ ¹ The full prompt also asks the model to use only the supplied information and give a short answer. Full prompts, a conversation-correction example and stop reasons are in [Recorded examples](docs/EXAMPLES.md).
159
+
160
+ ## Run locally
161
+
162
+ Use Python 3.11 on Apple Silicon. While the repository is private, sign in with `hf auth login` after installing `huggingface_hub`.
163
+
164
+ ```bash
165
+ python3.11 -m venv .venv
166
+ source .venv/bin/activate
167
+ python -m pip install huggingface_hub
168
+ hf download OpenSML/Solstice-1 --local-dir Solstice-1
169
+ cd Solstice-1
170
+ python -m pip install -r requirements.txt
171
+ python inference.py --prompt "What is the main function of the heart?" --max-new-tokens 96
172
+ python inference.py --interactive
173
  ```
174
 
175
+ The runner defaults to greedy FP32 generation and uses the native chat tokens. Interactive mode retains previous turns; `/reset` clears history and `/quit` exits. Inputs that exceed the shared context budget are rejected rather than silently truncated. [Sampling and conversation options](RUN_GUIDE.md).
176
+
177
+ The supplied runner is the supported inference path. Transformers AutoModel, MLX-LM auto-loading, GGUF and CUDA have not been validated for this package. A clean-environment check reproduced 27 saved responses exactly; this verifies the package, not general answer quality. [Verification record](PACKAGING_VERIFICATION.json).
178
+
179
+ ## Limitations
180
+
181
+ - **Factual errors:** plausible explanations and short answers can be wrong.
182
+ - **Instruction following:** strict IFEval prompt accuracy is 17.93%; many longer outputs reach the token cap.
183
+ - **Answerability:** the model can decline questions whose answers are provided, yet invent answers when information is missing. Results depend strongly on wording.
184
+ - **Repetition:** loops and repeated ideas remain possible, particularly in open-ended responses.
185
+ - **Scope:** reliable coding, SQL, JSON extraction, tool use, multilingual use and long conversations are not established capabilities.
186
+ - **Evaluation coverage:** public and historical tests informed earlier research. The reserved test shares authored task families with training. No comprehensive semantic contamination audit, independent human study or safety assessment is claimed.
187
 
188
+ Solstice-1 is a research release for short English text and chat. It is not a dependable source of facts or a validated system for consequential decisions.
189
 
190
+ ## Files, reproducibility and license
 
 
 
 
 
191
 
192
+ [Technical report](docs/TECHNICAL_REPORT.md) · [Data provenance](docs/DATA.md) · [Evaluation and failure analysis](docs/EVALUATION.md) · [Training archive](TRAINING_AND_REPRODUCIBILITY.md) · [Raw benchmark summary](results/public/summary.json)
193
 
194
+ The repository includes weights on Hugging Face, tokenizer files, inference code, sanitized training snapshots, frozen recipes, selected-checkpoint hashes, curves and saved evaluation outputs. Raw corpora, optimizer binaries and all ancestor weights are not bundled. The training archive documents the run; it is not a verified one-command retraining package.
195
 
196
+ Weights and author-controlled code use [Apache-2.0](https://huggingface.co/OpenSML/Solstice-1/blob/main/LICENSE). Upstream datasets and third-party code retain their own terms. [Source notice](SOURCE_NOTICE.md) · [Third-party notices](THIRD_PARTY_NOTICES.md) · [Citation](CITATION.cff)
SHA256SUMS CHANGED
@@ -3,7 +3,7 @@ f09ed498cc42b482dae88d9fb5026bf74e1d8b9187f9ea301aeda0db76d6c859 BACKUP_AND_CLE
3
  af646a190d135ec25a6ee2c76d1594c3f9ba8005cd3ca6df908606a15023273e CITATION.cff
4
  cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30 LICENSE
5
  0e6865f1a81cfd69ca48e6987658854ce0c0d23e91d72ae545393cd5fa032375 PACKAGING_VERIFICATION.json
6
- 900df54a78e604f4245328633b77eb3cb606e8c213dc1ca71b41549905ced58e README.md
7
  152a87d0098752350d54fdd3cde3861a77eb497c53dc973ee1a8370d12a13ff6 REPOSITORIES.json
8
  fd05e1595bcdc52942e9425b6efb2c7e89553e6b0ad7d5f93d9075969cd75dba RUN_GUIDE.md
9
  87fa33719fe1182d467a05ab417be2a362f50eea59f0ac6496d40e677544e27c SOURCE_NOTICE.md
@@ -30,11 +30,17 @@ fb204be1d9e72eb1cae140bfdb03dbcadc1843c47b1894a731396ceeedb9a22f configs/sft1/p
30
  51d66108416988bad1015d7b52cf63db0571f87f202b2b18c7e98e67a29ec62b configs/sft2/plan.json
31
  ae708eca3c09d5a27eab3fddbe4106d0658787beebc9393de57f75234480a284 configs/sft3/plan.json
32
  e0b0c730321360c40f20e53a22890c52cd5294bad2a5777a0a891096557a2f0a docs/DATA.md
33
- 5522817f8d698f05b43adfc1c5227bab4e917492c898fa4b792d521d42a512d8 docs/EVALUATION.md
34
  7a818c365f1c047b349479829396ba5cd841ca8d2f04fa14fc1489083a1fd4b3 docs/EXAMPLES.md
35
  f98d45b39b9595510fa80d495a3758b211d8c770adc739d381763d3cfb2a2a0b docs/TECHNICAL_REPORT.md
 
 
 
 
36
  0fa840653d1a5305297ef6f51ba08dc70a4bbfaf8029c411627e39dfc3cdc153 docs/figures/cooldown-detail.png
37
  1071d21211f7d32d9f9f5874e62f46a2a17306f88f0f355b24aee5b4af4c4e0f docs/figures/cooldown-detail.svg
 
 
38
  c46bba5d4fae1c55701def21829de08fd3756dc9659fee2a54a79f42eb1afcb0 docs/figures/pretraining-overview.png
39
  862a5400ecde1ececb915441766f378849c65024288522c84a4883d0c4b31a4e docs/figures/pretraining-overview.svg
40
  9e15b1b93bbc1160f3988a7956eee88b2467e5d826f097df35401562c116b90d evaluation/README.md
@@ -90,6 +96,7 @@ f76237736d1aab8f04517ad9e3336925ca9773399a9ad888f07c15d3ceaa4f87 results/baseli
90
  187b395945254a4d9359694d5f9ead19a8b95caffcb42477cb9a349cf6ad625e results/baselines/167/ifeval/results.json
91
  a5d49e3dc60a6c4dda4799090881cc2aab033b922ac0b5dafd52c0c6c7e2e6d8 results/baselines/attempt5.json
92
  2b59f728ebc9bef6deaf378e6908f7b55723b368f60da83f9af5b2b1731d0346 results/baselines/parent2000.json
 
93
  fed55313b61008e8f379a7b4bc49535cc501a31a942c7560687de4a4bd1cd47f results/package_inference_verification.json
94
  ba2cfb7c8b446dede8e7f33bb78885855e74bd75f861b0c201d6e01e88bc987f results/pretraining_steps.csv
95
  c4e3210780814051e3ad1bd99a9c143b9c5dbe910224239a134fddc546e9c9a8 results/pretraining_validation.csv
@@ -118,6 +125,7 @@ da83222ee38d33eea6c7062c28fd310e61da89a9a0315dc62559c4a9181759d9 results/search
118
  a478bc790345129fa960060490d4c2148351ccfc17ac433ec06364969787a8fe results/selection/design.json
119
  0567b916bdf27de7f6eafe8c61da7fb3686a69e08361ac6cb5645ac567cf8f69 results/selection/selection_frozen.json
120
  cac0e352b21365bfb4fef9f5c265aa36426552bb47851be5fdb5ff585648f69a scripts/materialize_training_snapshot.py
 
121
  c47f496b10f813dcb61697a0d49ed14043137ee1e2a96911a68fccb31fa9df26 scripts/plot_training.py
122
  002b4e552d3d625f96d77d90a0e3195e53e5c4358f64fe3a042792d08b232cd3 scripts/verify_inference.py
123
  ea7d6388ad1f17fcf244119b2bf15018d981c4e2c127bedf2af73dc74eaa0528 scripts/verify_package.py
 
3
  af646a190d135ec25a6ee2c76d1594c3f9ba8005cd3ca6df908606a15023273e CITATION.cff
4
  cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30 LICENSE
5
  0e6865f1a81cfd69ca48e6987658854ce0c0d23e91d72ae545393cd5fa032375 PACKAGING_VERIFICATION.json
6
+ 894e1200eb78c3afd6617410b209bfd389f77c45301c3b6cfb3faf8b9fd380cb README.md
7
  152a87d0098752350d54fdd3cde3861a77eb497c53dc973ee1a8370d12a13ff6 REPOSITORIES.json
8
  fd05e1595bcdc52942e9425b6efb2c7e89553e6b0ad7d5f93d9075969cd75dba RUN_GUIDE.md
9
  87fa33719fe1182d467a05ab417be2a362f50eea59f0ac6496d40e677544e27c SOURCE_NOTICE.md
 
30
  51d66108416988bad1015d7b52cf63db0571f87f202b2b18c7e98e67a29ec62b configs/sft2/plan.json
31
  ae708eca3c09d5a27eab3fddbe4106d0658787beebc9393de57f75234480a284 configs/sft3/plan.json
32
  e0b0c730321360c40f20e53a22890c52cd5294bad2a5777a0a891096557a2f0a docs/DATA.md
33
+ 79c7190a634b9008502242133bf76e246ab69700814049b5ac39f49ad51c57c3 docs/EVALUATION.md
34
  7a818c365f1c047b349479829396ba5cd841ca8d2f04fa14fc1489083a1fd4b3 docs/EXAMPLES.md
35
  f98d45b39b9595510fa80d495a3758b211d8c770adc739d381763d3cfb2a2a0b docs/TECHNICAL_REPORT.md
36
+ 37438bfe291e2cc5b7513ec912cab9eaf7ce3d6352543f8e63d44da3a4f7d5b3 docs/figures/benchmark-comparison.png
37
+ 64297355167c23c84cc4227bf54eb6be8d66c5837d45e201ed9304594df36d85 docs/figures/benchmark-comparison.svg
38
+ 08388301b65a94ce3bd166de02dd6aa887515f9ed617a8972359b742334cb422 docs/figures/chat-diagnostics.png
39
+ b70ae8d8b730c7f178a41ae9d781d2f7f8fbedf3640f9d4991a77c6c89e39725 docs/figures/chat-diagnostics.svg
40
  0fa840653d1a5305297ef6f51ba08dc70a4bbfaf8029c411627e39dfc3cdc153 docs/figures/cooldown-detail.png
41
  1071d21211f7d32d9f9f5874e62f46a2a17306f88f0f355b24aee5b4af4c4e0f docs/figures/cooldown-detail.svg
42
+ c5a39cdcbc0b8b2a48dd7e8136c61132b4340e0145fde1cdf1e73a498785e207 docs/figures/ifeval-comparison.png
43
+ 9416ed14acd5d52ea3931100e5c2330c6e1c7c7f19724602c389fc71c79a56d8 docs/figures/ifeval-comparison.svg
44
  c46bba5d4fae1c55701def21829de08fd3756dc9659fee2a54a79f42eb1afcb0 docs/figures/pretraining-overview.png
45
  862a5400ecde1ececb915441766f378849c65024288522c84a4883d0c4b31a4e docs/figures/pretraining-overview.svg
46
  9e15b1b93bbc1160f3988a7956eee88b2467e5d826f097df35401562c116b90d evaluation/README.md
 
96
  187b395945254a4d9359694d5f9ead19a8b95caffcb42477cb9a349cf6ad625e results/baselines/167/ifeval/results.json
97
  a5d49e3dc60a6c4dda4799090881cc2aab033b922ac0b5dafd52c0c6c7e2e6d8 results/baselines/attempt5.json
98
  2b59f728ebc9bef6deaf378e6908f7b55723b368f60da83f9af5b2b1731d0346 results/baselines/parent2000.json
99
+ 2cafe36ca3f2fe3dd00cf9aa63314eac64a73de2c58e2de92cdeee47306bd8ae results/baselines/published_models.json
100
  fed55313b61008e8f379a7b4bc49535cc501a31a942c7560687de4a4bd1cd47f results/package_inference_verification.json
101
  ba2cfb7c8b446dede8e7f33bb78885855e74bd75f861b0c201d6e01e88bc987f results/pretraining_steps.csv
102
  c4e3210780814051e3ad1bd99a9c143b9c5dbe910224239a134fddc546e9c9a8 results/pretraining_validation.csv
 
125
  a478bc790345129fa960060490d4c2148351ccfc17ac433ec06364969787a8fe results/selection/design.json
126
  0567b916bdf27de7f6eafe8c61da7fb3686a69e08361ac6cb5645ac567cf8f69 results/selection/selection_frozen.json
127
  cac0e352b21365bfb4fef9f5c265aa36426552bb47851be5fdb5ff585648f69a scripts/materialize_training_snapshot.py
128
+ d7d137a4ff838c2bd9d1cdd7f8428a9a78101ab97868ebbaab42eb4a561ae648 scripts/plot_results.py
129
  c47f496b10f813dcb61697a0d49ed14043137ee1e2a96911a68fccb31fa9df26 scripts/plot_training.py
130
  002b4e552d3d625f96d77d90a0e3195e53e5c4358f64fe3a042792d08b232cd3 scripts/verify_inference.py
131
  ea7d6388ad1f17fcf244119b2bf15018d981c4e2c127bedf2af73dc74eaa0528 scripts/verify_package.py
docs/EVALUATION.md CHANGED
@@ -4,26 +4,44 @@ All results identify the same release weight hash, `7b2d8777040f05d8e0849acac4e4
4
 
5
  ## Likelihood scoring
6
 
7
- | Benchmark | Examples | Accuracy | Normalized accuracy |
8
- | --- | --- | --- | --- |
9
- | ARC Easy | 2376 | 62.58% | 62.33% |
10
- | ARC Challenge | 1172 | 29.35% | 30.89% |
11
- | PIQA | 1838 | 66.49% | 66.21% |
12
- | HellaSwag | 10042 | 32.85% | 39.40% |
 
 
 
 
 
13
 
14
  Native MLX evaluates complete ARC Easy/Challenge test splits, PIQA validation and HellaSwag validation. It uses zero-shot raw completion prompts, no chat template or inserted BOS/EOS, FP32 weights, vanilla attention, batch size four and chunked scoring. Raw accuracy ranks summed continuation log-likelihood; normalized accuracy divides by choice Unicode-character count. No generated explanation or LLM judge determines the answer. No choices were context-truncated. Dataset revisions and scorer settings are preserved in [the result record](../results/public/choices/results.json).
15
 
16
  ## Instruction following
17
 
18
- | IFEval metric | Score | Passes / checks |
19
- | --- | --- | --- |
20
- | Strict prompts | 17.93% | 97/541 |
21
- | Strict instructions | 30.10% | 251/834 |
22
- | Loose prompts | 19.22% | 104/541 |
23
- | Loose instructions | 32.49% | 271/834 |
 
24
 
25
  Google IFEval is pinned to dataset revision `966cd89545d6b6acfd7638bc708b98261ca58e84` and google-research commit `83f1e7b59e762648c953de751d31f75720683622`. All 541 prompts and 834 instructions use the recorded strict/loose programmatic verifiers. Generation is greedy, native-chat formatted, FP32, without a system message or repetition penalty. Output cap: 1,024 tokens. Token-cap hits: **130/541**; context-cap hits: **0**. All generated responses are scored, including cap hits. The official dataset's split is named `train`; it is used as evaluation input here, not SFT training material.
26
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  ## Historical comparison
28
 
29
  | Metric | Published 150M | 167 | Parent 2000 | Prior attempt 5 | Solstice-1 |
@@ -62,6 +80,8 @@ The new panel flags unnecessary abstention on 111/200 answerable extraction case
62
 
63
  Manual inspection of the three chat repetition flags found two clear loops and one milder repeated sentence/idea. Keep the original three-flag result for consistent comparisons; it does not mean all three are equally severe. All 180 objective chat responses stop naturally; the qualitative cases account for the single token-cap hit and the repetition flags.
64
 
 
 
65
  ## Selection and test exposure
66
 
67
  The final five-trial search selected one checkpoint using the 300-case new development panel plus historical development, stopping, repetition and prose-retention guards. Finalist identity was frozen before the new 1,000-case test. Small tolerated regressions were part of the declared guards; passing them does not mean every metric improved. The complete comparison and selection record includes the thresholds and reasons.
 
4
 
5
  ## Likelihood scoring
6
 
7
+ | Benchmark | Metric | Solstice-1 | OpenSML-150M | SmolLM2-135M Instruct |
8
+ | --- | --- | --- | --- | --- |
9
+ | ARC Easy | Accuracy | 62.58% | 56.65% | — |
10
+ | ARC Easy | acc_norm | 62.33% | 55.43% | — |
11
+ | ARC Challenge | Accuracy | 29.35% | 26.02% | — |
12
+ | ARC Challenge | acc_norm | 30.89% | 29.52% | — |
13
+ | PIQA | Accuracy | 66.49% | 64.53% | — |
14
+ | PIQA | acc_norm | 66.21% | 64.09% | 66.3% |
15
+ | HellaSwag | Accuracy | 32.85% | 30.55% | — |
16
+ | HellaSwag | acc_norm | 39.40% | 33.94% | 40.9% |
17
+ | ARC (publisher average) | acc_norm | — | — | 37.3% |
18
 
19
  Native MLX evaluates complete ARC Easy/Challenge test splits, PIQA validation and HellaSwag validation. It uses zero-shot raw completion prompts, no chat template or inserted BOS/EOS, FP32 weights, vanilla attention, batch size four and chunked scoring. Raw accuracy ranks summed continuation log-likelihood; normalized accuracy divides by choice Unicode-character count. No generated explanation or LLM judge determines the answer. No choices were context-truncated. Dataset revisions and scorer settings are preserved in [the result record](../results/public/choices/results.json).
20
 
21
  ## Instruction following
22
 
23
+ | IFEval accuracy | Solstice-1 | OpenSML-150M | SmolLM2-135M Instruct |
24
+ | --- | --- | --- | --- |
25
+ | Strict prompts | 17.93% | 15.16% | — |
26
+ | Strict instructions | 30.10% | 25.30% | — |
27
+ | Loose prompts | 19.22% | 15.71% | — |
28
+ | Loose instructions | 32.49% | 25.78% | — |
29
+ | Publisher prompt/instruction average | — | — | 29.9% |
30
 
31
  Google IFEval is pinned to dataset revision `966cd89545d6b6acfd7638bc708b98261ca58e84` and google-research commit `83f1e7b59e762648c953de751d31f75720683622`. All 541 prompts and 834 instructions use the recorded strict/loose programmatic verifiers. Generation is greedy, native-chat formatted, FP32, without a system message or repetition penalty. Output cap: 1,024 tokens. Token-cap hits: **130/541**; context-cap hits: **0**. All generated responses are scored, including cap hits. The official dataset's split is named `train`; it is used as evaluation input here, not SFT training material.
32
 
33
+ ## Published small-model references
34
+
35
+ Baseline scores come from the published [OpenSML-150M card](https://huggingface.co/OpenSML/OpenSML-150M) and [SmolLM2-135M-Instruct card](https://huggingface.co/HuggingFaceTB/SmolLM2-135M-Instruct), not fresh reruns. “—” means the required breakdown is not published in those cards. SmolLM2 reports ARC and IFEval as averages; no missing sub-scores are inferred.
36
+
37
+ Solstice uses native MLX FP32 scoring. SmolLM2 uses LightEval; its [evaluation code](https://github.com/huggingface/smollm/tree/438be18dae658a638f3a6976fdf5190bb6d68619/text/evaluation/smollm2) specifies character-normalized choice scores with a leading space excluded and instruct runs with a chat template. OpenSML-150M uses an older native pipeline. Prompt formatting, precision and generation budgets differ, so these are reference comparisons, not a controlled leaderboard. [Exact sources and metric definitions](../results/baselines/published_models.json).
38
+
39
+ ![Published normalized-accuracy comparison](figures/benchmark-comparison.png)
40
+
41
+ ![IFEval comparison](figures/ifeval-comparison.png)
42
+
43
+ Figure data is read directly from the saved JSON records by [plot_results.py](../scripts/plot_results.py). Run that script with matplotlib 3.10.8 to regenerate PNG and SVG figures. The SmolLM2 card does not identify how strict versus loose IFEval metrics contribute to its published average, so that average is not assigned to any one of Solstice's four IFEval metrics.
44
+
45
  ## Historical comparison
46
 
47
  | Metric | Published 150M | 167 | Parent 2000 | Prior attempt 5 | Solstice-1 |
 
80
 
81
  Manual inspection of the three chat repetition flags found two clear loops and one milder repeated sentence/idea. Keep the original three-flag result for consistent comparisons; it does not mean all three are equally severe. All 180 objective chat responses stop naturally; the qualitative cases account for the single token-cap hit and the repetition flags.
82
 
83
+ ![Chat category diagnostics](figures/chat-diagnostics.png)
84
+
85
  ## Selection and test exposure
86
 
87
  The final five-trial search selected one checkpoint using the 300-case new development panel plus historical development, stopping, repetition and prose-retention guards. Finalist identity was frozen before the new 1,000-case test. Small tolerated regressions were part of the declared guards; passing them does not mean every metric improved. The complete comparison and selection record includes the thresholds and reasons.
docs/figures/benchmark-comparison.png ADDED

Git LFS Details

  • SHA256: 37438bfe291e2cc5b7513ec912cab9eaf7ce3d6352543f8e63d44da3a4f7d5b3
  • Pointer size: 131 Bytes
  • Size of remote file: 125 kB
docs/figures/benchmark-comparison.svg ADDED
docs/figures/chat-diagnostics.png ADDED

Git LFS Details

  • SHA256: 08388301b65a94ce3bd166de02dd6aa887515f9ed617a8972359b742334cb422
  • Pointer size: 131 Bytes
  • Size of remote file: 109 kB
docs/figures/chat-diagnostics.svg ADDED
docs/figures/ifeval-comparison.png ADDED

Git LFS Details

  • SHA256: c5a39cdcbc0b8b2a48dd7e8136c61132b4340e0145fde1cdf1e73a498785e207
  • Pointer size: 131 Bytes
  • Size of remote file: 108 kB
docs/figures/ifeval-comparison.svg ADDED
results/baselines/published_models.json ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checked_on": "2026-11-09",
3
+ "scope": "Published reference values, not matched fresh runs; percentages rounded as in source cards. Absent metrics remain absent.",
4
+ "models": {
5
+ "OpenSML/OpenSML-150M": {
6
+ "revision": "7708682482f8c877c0793aed1af1064bf56db9ed",
7
+ "model_card": "https://huggingface.co/OpenSML/OpenSML-150M/blob/7708682482f8c877c0793aed1af1064bf56db9ed/README.md",
8
+ "readme_sha256": "7edb9a16eaf1ef9232bf5eb3b82dd6a6e5df36fe63108d1525bce00777025bdc",
9
+ "choices": {
10
+ "arc_easy": {
11
+ "acc": 0.5665,
12
+ "acc_norm": 0.5543
13
+ },
14
+ "arc_challenge": {
15
+ "acc": 0.2602,
16
+ "acc_norm": 0.2952
17
+ },
18
+ "piqa": {
19
+ "acc": 0.6453,
20
+ "acc_norm": 0.6409
21
+ },
22
+ "hellaswag": {
23
+ "acc": 0.3055,
24
+ "acc_norm": 0.3394
25
+ }
26
+ },
27
+ "ifeval": {
28
+ "strict": {
29
+ "prompt_accuracy": 0.1516,
30
+ "instruction_accuracy": 0.253
31
+ },
32
+ "loose": {
33
+ "prompt_accuracy": 0.1571,
34
+ "instruction_accuracy": 0.2578
35
+ }
36
+ }
37
+ },
38
+ "HuggingFaceTB/SmolLM2-135M-Instruct": {
39
+ "revision": "12fd25f77366fa6b3b4b768ec3050bf629380bac",
40
+ "model_card": "https://huggingface.co/HuggingFaceTB/SmolLM2-135M-Instruct/blob/12fd25f77366fa6b3b4b768ec3050bf629380bac/README.md",
41
+ "readme_sha256": "4f97533ad95b1b2fea15fbc075c01b94578ebdd7c8138888fa43fa3abd530dc4",
42
+ "choices": {
43
+ "piqa": {
44
+ "acc_norm": 0.663
45
+ },
46
+ "hellaswag": {
47
+ "acc_norm": 0.409
48
+ }
49
+ },
50
+ "arc_publisher_average": 0.373,
51
+ "ifeval_publisher_average": 0.299,
52
+ "missing": "Raw accuracy, separate ARC Easy/Challenge scores and separate strict/loose IFEval scores are not reported in the cited model card.",
53
+ "ifeval_aggregation": "Publisher label: Average prompt/inst. No strict/loose weighting inferred.",
54
+ "evaluation_code_revision": "438be18dae658a638f3a6976fdf5190bb6d68619",
55
+ "evaluation_code": "https://github.com/huggingface/smollm/tree/438be18dae658a638f3a6976fdf5190bb6d68619/text/evaluation/smollm2",
56
+ "lighteval_revision": "ea46419a93fb390e8f694f7c6c64c1e684487c9d",
57
+ "choice_metric": "loglikelihood_acc_norm_nospace: divide by Unicode-character count excluding an initial space",
58
+ "protocol": "Published zero-shot LightEval; linked instruct recipe uses a chat template. Not rerun for this release."
59
+ }
60
+ }
61
+ }
scripts/plot_results.py ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Render the model-card figures from saved scores; matplotlib 3.10.8."""
3
+ import json
4
+ from pathlib import Path
5
+
6
+ import matplotlib
7
+ matplotlib.use('Agg')
8
+ import matplotlib.pyplot as plt
9
+ from matplotlib.ticker import PercentFormatter
10
+ import numpy as np
11
+
12
+ ROOT = Path(__file__).resolve().parents[1]
13
+ OUT = ROOT / 'docs/figures'
14
+ COLORS = {'Solstice-1': '#176b65', 'OpenSML-150M': '#67768a',
15
+ 'SmolLM2-135M Instruct': '#c58a37', 'Checkpoint 167': '#9476a7'}
16
+
17
+
18
+ def read(path):
19
+ return json.loads((ROOT / path).read_text())
20
+
21
+
22
+ def save(fig, name):
23
+ OUT.mkdir(parents=True, exist_ok=True)
24
+ for ext in ('png', 'svg'):
25
+ fig.savefig(OUT / f'{name}.{ext}', dpi=180, facecolor='white')
26
+ plt.close(fig)
27
+
28
+
29
+ def main():
30
+ plt.rcParams.update({'font.family': 'DejaVu Sans', 'font.size': 11,
31
+ 'axes.spines.top': False, 'axes.spines.right': False,
32
+ 'axes.spines.left': False, 'axes.titleweight': 'bold'})
33
+ choice = read('results/public/choices/results.json')['results']
34
+ public = read('results/baselines/published_models.json')['models']
35
+ old = public['OpenSML/OpenSML-150M']
36
+ smol = public['HuggingFaceTB/SmolLM2-135M-Instruct']
37
+ fig, axes = plt.subplots(2, 2, figsize=(11.5, 7.6))
38
+ fig.subplots_adjust(left=.2, right=.97, top=.84, bottom=.16, wspace=.85, hspace=.55)
39
+ fig.suptitle('Solstice-1 | Knowledge and commonsense', x=.08, ha='left', y=.97,
40
+ fontsize=19, fontweight='bold')
41
+ fig.text(.08, .91, 'Zero-shot normalized accuracy · higher is better', fontsize=12)
42
+ for ax, (key, label) in zip(axes.flat, [('arc_easy', 'ARC Easy'),
43
+ ('arc_challenge', 'ARC Challenge'), ('piqa', 'PIQA'), ('hellaswag', 'HellaSwag')]):
44
+ names = ['Solstice-1', 'OpenSML-150M']
45
+ values = [choice[key]['acc_norm'], old['choices'][key]['acc_norm']]
46
+ if key in smol['choices']:
47
+ names.append('SmolLM2-135M Instruct')
48
+ values.append(smol['choices'][key]['acc_norm'])
49
+ ax.barh(range(len(names)), values, height=.55, color=[COLORS[n] for n in names])
50
+ ax.set_yticks(range(len(names)), [n.replace(' Instruct', '\nInstruct') for n in names], fontsize=9)
51
+ ax.invert_yaxis(); ax.set_xlim(0, .8); ax.set_xticks([0, .2, .4, .6, .8])
52
+ ax.xaxis.set_major_formatter(PercentFormatter(1, decimals=0))
53
+ ax.set_title(label, loc='left', pad=10); ax.grid(axis='x', alpha=.15); ax.set_axisbelow(True)
54
+ ax.tick_params(axis='y', length=0)
55
+ for y, value in enumerate(values):
56
+ ax.text(value+.015, y, f'{value:.2%}' if names[y] != 'SmolLM2-135M Instruct' else f'{value:.1%}',
57
+ va='center', fontsize=10)
58
+ fig.text(.08, .06, 'Baseline values are publisher reports; evaluators and prompts differ.\n'
59
+ 'SmolLM2 publishes ARC only as an average (37.3%); its separate ARC scores are not inferred.',
60
+ fontsize=10, color='#4b5563')
61
+ save(fig, 'benchmark-comparison')
62
+
63
+ own = read('results/public/ifeval/results.json')['metrics']
64
+ prior = read('results/baselines/167/ifeval/results.json')['metrics']
65
+ keys = [('strict', 'prompt'), ('strict', 'instruction'), ('loose', 'prompt'), ('loose', 'instruction')]
66
+ fig, ax = plt.subplots(figsize=(11.5, 5.9))
67
+ fig.subplots_adjust(left=.08, right=.98, top=.8, bottom=.24)
68
+ fig.suptitle('Solstice-1 | Instruction following', x=.08, ha='left', y=.97,
69
+ fontsize=19, fontweight='bold')
70
+ fig.text(.08, .9, 'IFEval accuracy · higher is better', fontsize=12)
71
+ x = np.arange(4)
72
+ for i, (name, data) in enumerate([('OpenSML-150M', old['ifeval']),
73
+ ('Checkpoint 167', prior), ('Solstice-1', own)]):
74
+ values = [data[k][u+'_accuracy'] for k, u in keys]
75
+ bars = ax.bar(x+(i-1)*.25, values, width=.22, label=name, color=COLORS[name])
76
+ ax.bar_label(bars, labels=[f'{v:.2%}' for v in values], padding=4, fontsize=9)
77
+ ax.set_xticks(x, ['Strict\nprompts', 'Strict\ninstructions', 'Loose\nprompts', 'Loose\ninstructions'])
78
+ ax.set_ylim(0, .4); ax.set_yticks([0, .1, .2, .3, .4]); ax.yaxis.set_major_formatter(PercentFormatter(1, decimals=0))
79
+ ax.grid(axis='y', alpha=.15); ax.set_axisbelow(True)
80
+ ax.legend(loc='upper left', bbox_to_anchor=(0, -.18), ncols=3, frameon=False)
81
+ fig.text(.08, .035, '150M used different formatting and a longer output cap. SmolLM2 reports an aggregate (29.9%),\n'
82
+ 'so its strict/loose sub-scores are not plotted. No normalized-accuracy metric applies to IFEval.',
83
+ fontsize=10, color='#4b5563')
84
+ save(fig, 'ifeval-comparison')
85
+
86
+ chat = read('results/public/chat/results.json')
87
+ categories = [('reading', 'Reading supplied text'), ('conversation', 'Conversation context'),
88
+ ('knowledge', 'Factual knowledge'), ('instructions', 'Instructions'),
89
+ ('answerability', 'Answerability'), ('reasoning', 'Short reasoning')]
90
+ values = [chat['categories'][key]['answer_match']/chat['categories'][key]['count'] for key, _ in categories]
91
+ fig, ax = plt.subplots(figsize=(11.5, 5.8))
92
+ fig.subplots_adjust(left=.25, right=.96, top=.79, bottom=.2)
93
+ fig.suptitle('Solstice-1 | Short-chat diagnostics', x=.08, ha='left', y=.97,
94
+ fontsize=19, fontweight='bold')
95
+ fig.text(.08, .9, 'Conservative automatic answer matching · authored panel', fontsize=12)
96
+ ax.barh(range(6), values, color=COLORS['Solstice-1'], height=.6)
97
+ ax.set_yticks(range(6), [label for _, label in categories]); ax.invert_yaxis()
98
+ ax.set_xlim(0, 1); ax.xaxis.set_major_formatter(PercentFormatter(1, decimals=0))
99
+ ax.tick_params(axis='y', length=0); ax.grid(axis='x', alpha=.15); ax.set_axisbelow(True)
100
+ for y, value in enumerate(values): ax.text(value+.015, y, f'{value:.1%}', va='center')
101
+ fig.text(.08, .05, '30 checked responses per category. This is not a broad human assessment.\n'
102
+ 'Natural stopping is 99.48% across all 192 responses; stopping correctly does not imply a correct answer.',
103
+ fontsize=10, color='#4b5563')
104
+ save(fig, 'chat-diagnostics')
105
+
106
+
107
+ if __name__ == '__main__':
108
+ main()