Text Generation
MLX
Safetensors
English
small-language-model
from-scratch
conversational
apple-silicon
research
Instructions to use OpenSML/Solstice-1 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use OpenSML/Solstice-1 with MLX:
# Make sure mlx-lm is installed # pip install --upgrade mlx-lm # Generate text with mlx-lm from mlx_lm import load, generate model, tokenizer = load("OpenSML/Solstice-1") prompt = "Write a story about Einstein" messages = [{"role": "user", "content": prompt}] prompt = tokenizer.apply_chat_template( messages, add_generation_prompt=True ) text = generate(model, tokenizer, prompt=prompt, verbose=True) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- MLX LM
How to use OpenSML/Solstice-1 with MLX LM:
Generate or start a chat session
# Install MLX LM uv tool install mlx-lm # Interactive chat REPL mlx_lm.chat --model "OpenSML/Solstice-1"
Run an OpenAI-compatible server
# Install MLX LM uv tool install mlx-lm # Start the server mlx_lm.server --model "OpenSML/Solstice-1" # Calling the OpenAI-compatible server with curl curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "OpenSML/Solstice-1", "messages": [ {"role": "user", "content": "Hello"} ] }' - Atomic Chat
Expand model card with sourced comparisons and training figures
Browse filesCompare 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 +3 -0
- FILE_MANIFEST.json +36 -4
- README.md +136 -68
- SHA256SUMS +10 -2
- docs/EVALUATION.md +32 -12
- docs/figures/benchmark-comparison.png +3 -0
- docs/figures/benchmark-comparison.svg +2844 -0
- docs/figures/chat-diagnostics.png +3 -0
- docs/figures/chat-diagnostics.svg +2034 -0
- docs/figures/ifeval-comparison.png +3 -0
- docs/figures/ifeval-comparison.svg +2211 -0
- results/baselines/published_models.json +61 -0
- scripts/plot_results.py +108 -0
.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":
|
| 26 |
-
"sha256": "
|
| 27 |
},
|
| 28 |
"REPOSITORIES.json": {
|
| 29 |
"bytes": 716,
|
|
@@ -130,8 +130,8 @@
|
|
| 130 |
"sha256": "e0b0c730321360c40f20e53a22890c52cd5294bad2a5777a0a891096557a2f0a"
|
| 131 |
},
|
| 132 |
"docs/EVALUATION.md": {
|
| 133 |
-
"bytes":
|
| 134 |
-
"sha256": "
|
| 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 |
-
**
|
| 30 |
|
| 31 |
-
|
| 32 |
|
| 33 |
-
[
|
| 34 |
|
| 35 |
-
Solstice-1
|
| 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 |
-
|
|
| 44 |
-
|
|
| 45 |
-
|
|
| 46 |
-
|
|
| 47 |
-
|
|
| 48 |
-
|
|
| 49 |
-
| Pretraining
|
| 50 |
-
|
|
| 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 |
-
|
| 56 |
|
| 57 |
-
|
| 58 |
|
| 59 |
-
|
| 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 |
-
|
| 71 |
|
| 72 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
|
| 74 |
-
|
| 75 |
|
| 76 |
-
|
| 77 |
|
| 78 |
-
|
|
|
|
|
|
|
| 79 |
| --- | --- | --- | --- |
|
| 80 |
-
|
|
| 81 |
-
|
|
| 82 |
-
|
|
| 83 |
-
|
|
|
|
|
| 84 |
|
| 85 |
-
|
| 86 |
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 93 |
|
| 94 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 95 |
|
| 96 |
-
|
| 97 |
|
| 98 |
-
|
| 99 |
|
| 100 |
-
|
| 101 |
|
| 102 |
-
|
| 103 |
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 111 |
```
|
| 112 |
|
| 113 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 114 |
|
| 115 |
-
|
| 116 |
|
| 117 |
-
|
| 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 |
-
|
| 125 |
|
| 126 |
-
The weights
|
| 127 |
|
| 128 |
-
|
|
|
|
| 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 |
+

|
| 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 |
+

|
| 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 |
+

|
| 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 |
+

|
| 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 |
+

|
| 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 |
-
|
| 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 |
-
|
| 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 |
|
| 8 |
-
| --- | --- | --- | --- |
|
| 9 |
-
| ARC Easy |
|
| 10 |
-
| ARC
|
| 11 |
-
|
|
| 12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
| 19 |
-
| --- | --- | --- |
|
| 20 |
-
| Strict prompts | 17.93% |
|
| 21 |
-
| Strict instructions | 30.10% |
|
| 22 |
-
| Loose prompts | 19.22% |
|
| 23 |
-
| Loose instructions | 32.49% |
|
|
|
|
| 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 |
+

|
| 40 |
+
|
| 41 |
+

|
| 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 |
+

|
| 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
|
docs/figures/benchmark-comparison.svg
ADDED
|
|
docs/figures/chat-diagnostics.png
ADDED
|
Git LFS Details
|
docs/figures/chat-diagnostics.svg
ADDED
|
|
docs/figures/ifeval-comparison.png
ADDED
|
Git LFS Details
|
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()
|