dawidmajewski commited on
Commit
5e571cd
·
verified ·
1 Parent(s): 5b8f825

Release Pollock 1.0 (r002)

Browse files
CHANGELOG.md ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Changelog
2
+
3
+ Revision numbers identify published model states independently of release names.
4
+
5
+ ## r002 — Pollock 1.0
6
+
7
+ - Expanded the architecture from 12/12/768 to 12/14/896 while remaining below 128M total parameters.
8
+ - Reduced context from 2,048 to 1,024 tokens and increased the effective batch from 262,144 to 491,520 tokens.
9
+ - Changed the learning-rate range from 6e-4→6e-5 to 3e-4→3e-5 and warmup from 500 to 440 iterations.
10
+ - Trained with BF16 on 2× RTX 4090 instead of 1× RTX 5090.
11
+ - Introduced sampled training validation and a seven-task English zero-shot benchmark suite.
12
+
13
+ Full record: [`training-history/r002.md`](./training-history/r002.md)
14
+
15
+ ## r001 — experimental predecessor
16
+
17
+ - Initial experimental release with a 12/12/768 architecture, 2,048-token context, and 95.96M nanoGPT-reported parameters.
18
+ - Trained for four dataset passes and selected by deterministic full-validation reevaluation of retained checkpoints.
19
+ - No downstream benchmark suite was run.
20
+
21
+ Full record and generation samples: [`training-history/r001.md`](./training-history/r001.md)
README.md CHANGED
@@ -1,99 +1,107 @@
1
  ---
2
- language:
3
- - en
4
  library_name: transformers
5
  pipeline_tag: text-generation
6
  license: other
7
  license_name: mixed-upstream-dataset-terms
8
  license_link: https://huggingface.co/SlayerLab/pollock-mini-lm-125m/blob/main/LICENSE.md
9
- datasets:
10
- - SlayerLab/minimal-en-corpus-2.5b
11
- tags:
12
- - causal-lm
13
- - gpt2
14
- - nanogpt
15
- - bpe
16
- - educational
17
  model-index:
18
- - name: pollock-mini-lm
19
  results:
20
- - task:
21
- type: text-generation
22
- name: Text Generation
23
- dataset:
24
- type: SlayerLab/minimal-en-corpus-2.5b
25
- name: Minimal EN validation
26
- split: validation
27
- metrics:
28
- - type: loss
29
- value: 3.40875361
30
- - type: perplexity
31
- value: 30.227545
 
 
 
 
 
 
 
 
 
 
 
 
32
  ---
33
 
34
- # pollock-mini-lm
35
 
36
- ![Avatar pollock-mini-lm](./assets/pollock-mini-lm-avatar-320.png)
37
 
38
- > **Wersja eksperymentalna / Experimental release.** Model nie jest przeznaczony do zastosowań produkcyjnych ani wysokiego ryzyka. / The model is not intended for production or high-risk use.
39
 
40
  ## Polski
41
 
42
  ### Opis
43
 
44
- `pollock-mini-lm` to niewielki, anglojęzyczny model przyczynowy stworzony jako czytelny eksperyment edukacyjny. Nazwa podkreśla miniaturowy charakter projektu. Implementacja bazuje na [nanoGPT](https://github.com/karpathy/nanoGPT), uproszczonym przepisaniu minGPT, oraz na własnym tokenizerze byte-level BPE.
45
 
46
- Nazwa modelu luźno nawiązuje do gestu malarskiego Jacksona Pollocka i idei kontrolowanego eksperymentu z przypadkiem. nanoGPT pełni tu rolę płótna, na którym różne dane, konfiguracje i decyzje treningowe tworzą odmienne wzorce zachowania modelu. Istotny jest nie tylko końcowy rezultat, ale również obserwacja procesu i wpływu poszczególnych składników eksperymentu.
47
-
48
- Prostota jest celowa: projekt ma pomagać osobom rozpoczynającym tworzenie modeli — włączając w to autora — zrozumieć, które decyzje dotyczące architektury, danych i treningu wpływają na wynik, a następnie przenieść te metody do własnych eksperymentów.
49
 
50
  ### Architektura i tokenizer
51
 
52
  | Właściwość | Wartość |
53
  |---|---:|
54
- | Typ | decoder-only Transformer, klasa GPT-2 small |
55
- | Parametry nanoGPT | 95 963 904 (około 96M) |
56
- | Warstwy / głowy / embedding | 12 / 12 / 768 |
57
- | Maksymalny kontekst | 2048 tokenów |
58
  | Słownik | 12 288 tokenów |
 
 
59
  | Tokenizer | byte-level BPE, pretokenizacja w stylu GPT-2 |
60
  | Tokeny specjalne | <code>&lt;&#124;endoftext&#124;&gt;</code>, <code>&lt;&#124;im_start&#124;&gt;</code>, <code>&lt;&#124;im_end&#124;&gt;</code> |
61
 
62
- ### Dane
63
-
64
- Model wytrenowano na [`SlayerLab/minimal-en-corpus-2.5b`](https://huggingface.co/datasets/SlayerLab/minimal-en-corpus-2.5b): mieszance 15 anglojęzycznych źródeł dobranej subiektywnie na zasadzie „common sense”, a nie poprzez naukową optymalizację proporcji.
65
-
66
- - około 2,5 mld tokenów oszacowanych przed finalną tokenizacją;
67
- - 2 703 768 815 tokenów BPE w zbiorze treningowym;
68
- - 5 267 742 tokeny BPE w zbiorze walidacyjnym;
69
- - deduplikacja dokładna i przybliżona, filtrowanie języka oraz decontaminacja benchmarków zostały wykonane na etapie przygotowania datasetu.
70
 
71
- Karta datasetu zawiera pełną listę źródeł i informacje o ich licencjach. Mieszanka nie nadaje dokumentom jednej wspólnej licencji.
72
 
73
- ### Trening
74
 
75
  | Parametr | Wartość |
76
  |---|---:|
77
- | Kroki optymalizatora | 41 257 |
78
- | Przetworzone tokeny | 10 815 275 008 (4 epoki) |
79
- | Effective batch | 262 144 tokeny |
80
- | Sekwencja / micro-batch / akumulacja | 2048 / 32 / 4 |
 
 
81
  | Optymalizator | fused AdamW, betas 0.9/0.95 |
82
- | Learning rate | 6e-4 → 6e-5, cosine decay |
83
- | Warmup / weight decay / grad clip | 500 / 0.1 / 1.0 |
84
  | Precyzja | BF16 |
85
- | Sprzęt | 1× NVIDIA GeForce RTX 5090 32 GB |
86
  | Framework | PyTorch 2.8.0+cu128, nanoGPT commit `3adf61e` |
87
 
88
  ### Ewaluacja
89
 
90
- Wydanie wykorzystuje końcowy checkpoint, który uzyskał najlepszy wynik spośród wszystkich zachowanych checkpointów w deterministycznej ewaluacji pełnego `val.bin`.
91
 
92
- | Zbiór | Tokeny ocenione | Loss | Perplexity |
93
- |---|---:|---:|---:|
94
- | Minimal EN validation | 5 267 456 | 3.40875361 | 30.227545 |
95
 
96
- Ewaluacja użyła 2572 kolejnych, niepokrywających się okien po 2048 tokenów w BF16. Nie przeprowadzono benchmarków downstream. Podczas treningu wykryto błąd historycznej logiki `best_val_loss`; dlatego wszystkie zachowane checkpointy porównano ponownie tą samą deterministyczną metodą, zamiast ufać nazwie `checkpoint_best_val.pt`.
 
 
 
 
 
 
 
 
 
 
97
 
98
  ### Użycie z Transformers
99
 
@@ -106,141 +114,102 @@ model = AutoModelForCausalLM.from_pretrained(model_id)
106
 
107
  inputs = tokenizer("Once upon a time", return_tensors="pt")
108
  output = model.generate(
109
- **inputs,
110
- max_new_tokens=100,
111
- do_sample=True,
112
- temperature=0.7,
113
- top_k=50,
114
  )
115
  print(tokenizer.decode(output[0], skip_special_tokens=True))
116
  ```
117
 
118
- Model korzysta ze standardowego `GPT2LMHeadModel` i nie wymaga `trust_remote_code`.
119
-
120
- ### Przykładowe generacje
121
-
122
- Poniższe próbki wygenerowano bez ręcznej selekcji wyników. Ustawienia: seed 1337 resetowany dla każdego promptu, temperature 0.7, top-k 50, maksymalnie 100 nowych tokenów. Prompt jest częścią pokazanego wyniku.
123
-
124
- #### Wiedza ogólna / General knowledge
125
-
126
- Prompt:
127
-
128
- ```text
129
- The capital of France is
130
- ```
131
-
132
- Wynik / Output:
133
-
134
- ```text
135
- The capital of France is a first of the most important element in the construction of the Socket.
136
-
137
- Most of the socket is not a type of sandstone but it is generally a rocket.
138
-
139
- As a result, there is also an exception of the rocket site. The socket is called a rocket.
140
-
141
- The rocket is the only rocket.
142
- The rocket is the highest rocket.
143
-
144
- The rocket is the highest rocket.
145
-
146
- The rocket
147
- ```
148
-
149
- #### Proste wyjaśnienie / Explanation
150
-
151
- Prompt:
152
-
153
- ```text
154
- Photosynthesis is the process by which
155
- ```
156
-
157
- Wynik / Output:
158
-
159
- ```text
160
- Photosynthesis is the process by which the first two events are found. A key option is to do a function in some cases, so it is called the first two terms. This is what I want to think. The first one is to multiply the number by the number of digits. (The second one is to multiply the number by the first two terms. The first two terms are divided by the second one, so that is the first four terms. The third one is to multiply the number by the number of digits. The third
161
- ```
162
-
163
- #### Narracja / Story
164
-
165
- Prompt:
166
-
167
- ```text
168
- In a distant future, humanity discovered
169
- ```
170
-
171
- Wynik / Output:
172
-
173
- ```text
174
- In a distant future, humanity discovered to change, as well as the "coneurship and a continuance of the body.
175
- This is not a matter of the general sense, but a lot of things we call us to the body. If we feel the body is the body’s internal structure, we’re going to change the way. The body is the body’s potential structure, meaning that it is used for a body to balance and develop a sensory to control each other.
176
- What is the
177
- ```
178
-
179
- #### Kod / Code
180
-
181
- Prompt:
182
-
183
- ```text
184
- def fibonacci(n):
185
- ```
186
-
187
- Wynik / Output:
188
-
189
- ```text
190
- def fibonacci(n):)) = (n - 1) + (n - 1) + ( n - 1) + ( n - 2) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n
191
- ```
192
 
193
  ### Ograniczenia i odpowiedzialne użycie
194
 
195
- - Jest to surowy model bazowy bez instruction tuningu, RLHF ani alignmentu. Nie jest asystentem konwersacyjnym.
196
- - Może halucynować, zaprzeczać samemu sobie oraz generować treści toksyczne, stronnicze, niebezpieczne lub przypominające dane treningowe.
197
- - Rozmiar około 96M ogranicza wiedzę, rozumowanie, spójność długiego tekstu i jakość kodu.
198
- - Dane głównie anglojęzyczne; działanie w innych językach nie było oceniane.
199
- - Nie należy używać modelu do porad medycznych, prawnych, finansowych, decyzji o ludziach ani innych zastosowań wysokiego ryzyka.
200
- - Użytkownik odpowiada za ocenę licencji i warunków źródeł danych dla swojego zastosowania.
201
 
202
  ## English
203
 
204
  ### Overview
205
 
206
- `pollock-mini-lm` is a small English causal language model built as a readable educational experiment. Its name emphasizes the project's miniature scope. The implementation is based on [nanoGPT](https://github.com/karpathy/nanoGPT), itself a simplified rewrite of minGPT, and uses a custom byte-level BPE tokenizer.
207
-
208
- The model's name loosely refers to Jackson Pollock's painterly gesture and to the idea of a controlled experiment with chance. nanoGPT serves as a canvas on which different data, configurations, and training decisions create distinct patterns of model behavior. What matters is not only the final result, but also observing the process and the influence of each component of the experiment.
209
 
210
- The simplicity is intentional. The project is meant to help newcomers — including the author understand how architecture, data, and training choices affect model quality and reuse the same methods in their own experiments.
211
 
212
  ### Architecture and tokenizer
213
 
214
- The model is a roughly 96M-parameter GPT-2-small-class decoder with 12 layers, 12 attention heads, a hidden size of 768, a 2048-token context, and a 12,288-token vocabulary. The special tokens are `<|endoftext|>`, `<|im_start|>`, and `<|im_end|>`.
 
 
 
 
 
 
 
 
 
 
 
 
215
 
216
  ### Data and training
217
 
218
- The model was trained for four epochs (10,815,275,008 tokens seen) on [`SlayerLab/minimal-en-corpus-2.5b`](https://huggingface.co/datasets/SlayerLab/minimal-en-corpus-2.5b). The 15-source mixture was chosen subjectively using a “common sense” heuristic rather than scientifically optimized proportions. It contains about 2.5B estimated pre-tokenization tokens and 2,703,768,815 final BPE training tokens.
219
 
220
- Training used one RTX 5090, BF16, fused AdamW, a 262,144-token effective batch, and cosine learning-rate decay from 6e-4 to 6e-5. See the Polish section above for the full configuration.
 
 
 
 
 
 
 
 
 
 
 
 
 
221
 
222
  ### Evaluation
223
 
224
- The release checkpoint was selected by deterministic evaluation of every retained checkpoint over 5,267,456 validation tokens. It achieved loss **3.40875361** and perplexity **30.227545**. No downstream benchmarks were run. A historical checkpoint-selection bug was discovered, so retained checkpoints were reevaluated instead of trusting the `checkpoint_best_val.pt` filename.
225
 
226
- ### Usage
227
 
228
- Use the standard `AutoTokenizer` and `AutoModelForCausalLM` example from the Polish section. No `trust_remote_code` flag is required.
 
 
 
 
 
 
 
 
229
 
230
- ### Example generations
 
 
231
 
232
- The four samples shown in the Polish section were generated without cherry-picking. The seed was reset to 1337 for each prompt; temperature was 0.7, top-k was 50, and generation was limited to 100 new tokens. The prompt is included in each displayed output.
233
 
234
  ### Limitations and responsible use
235
 
236
- This is an unaligned base model, not a conversational assistant. It can hallucinate, contradict itself, produce biased, toxic, unsafe, or training-like content, and perform poorly outside English. Its small size limits knowledge, reasoning, long-form coherence, and code quality. Do not use it for medical, legal, financial, high-impact, or production decisions. Users must assess upstream dataset terms for their intended use.
 
 
 
 
 
237
 
238
  ## Licencja / License
239
 
240
- Kod nanoGPT jest udostępniany na licencji MIT. Korpus treningowy stanowi agregat źródeł o różnych warunkach i nie nadaje dokumentom jednej wspólnej licencji. Z tego powodu model oznaczono na Hugging Face jako `license: other`, a zastosowanie wag powinno uwzględniać warunki właściwych źródeł opisanych w karcie datasetu. Szczegóły znajdują się w [`LICENSE.md`](./LICENSE.md).
241
 
242
- nanoGPT code is distributed under the MIT License. The training corpus aggregates sources governed by different terms and does not assign a single common license to its documents. The model is therefore marked as `license: other` on Hugging Face, and use of the weights should account for the applicable upstream terms documented in the dataset card. See [`LICENSE.md`](./LICENSE.md) for details.
243
 
244
  ## Pochodzenie / Attribution
245
 
246
- Model i dataset: Dawid Majewski / SlayerLab. Implementacja treningowa bazuje na [`karpathy/nanoGPT`](https://github.com/karpathy/nanoGPT).
 
1
  ---
2
+ language: [en]
 
3
  library_name: transformers
4
  pipeline_tag: text-generation
5
  license: other
6
  license_name: mixed-upstream-dataset-terms
7
  license_link: https://huggingface.co/SlayerLab/pollock-mini-lm-125m/blob/main/LICENSE.md
8
+ datasets: [SlayerLab/minimal-en-corpus-2.5b]
9
+ tags: [causal-lm, gpt2, nanogpt, bpe, educational, base-model]
 
 
 
 
 
 
10
  model-index:
11
+ - name: Pollock 1.0
12
  results:
13
+ - task: {type: text-generation, name: Language modeling}
14
+ dataset: {type: SlayerLab/minimal-en-corpus-2.5b, name: Minimal EN validation (sampled), split: validation}
15
+ metrics: [{type: loss, value: 2.577547, name: Final sampled validation loss}]
16
+ - task: {type: text-generation, name: Zero-shot evaluation}
17
+ dataset: {type: blimp, name: BLiMP, split: train}
18
+ metrics: [{type: acc, value: 0.7669701493}]
19
+ - task: {type: text-generation, name: Zero-shot evaluation}
20
+ dataset: {type: EleutherAI/lambada_openai, name: LAMBADA OpenAI, split: test}
21
+ metrics: [{type: acc, value: 0.2780904328}, {type: perplexity, value: 53.66752251}]
22
+ - task: {type: text-generation, name: Zero-shot evaluation}
23
+ dataset: {type: hellaswag, name: HellaSwag, split: validation}
24
+ metrics: [{type: acc_norm, value: 0.2987452699}]
25
+ - task: {type: text-generation, name: Zero-shot evaluation}
26
+ dataset: {type: piqa, name: PIQA, split: validation}
27
+ metrics: [{type: acc_norm, value: 0.6033732318}]
28
+ - task: {type: text-generation, name: Zero-shot evaluation}
29
+ dataset: {type: sciq, name: SciQ, split: test}
30
+ metrics: [{type: acc_norm, value: 0.658}]
31
+ - task: {type: text-generation, name: Zero-shot evaluation}
32
+ dataset: {type: allenai/ai2_arc, config: ARC-Easy, name: ARC-Easy, split: test}
33
+ metrics: [{type: acc_norm, value: 0.422979798}]
34
+ - task: {type: text-generation, name: Zero-shot evaluation}
35
+ dataset: {type: allenai/ai2_arc, config: ARC-Challenge, name: ARC-Challenge, split: test}
36
+ metrics: [{type: acc_norm, value: 0.2414675768}]
37
  ---
38
 
39
+ # Pollock 1.0 — r002
40
 
41
+ ![Pollock avatar](./assets/pollock-mini-lm-avatar-320.png)
42
 
43
+ > **Wydanie eksperymentalne / Experimental release.** Model nie jest przeznaczony do zastosowań produkcyjnych ani wysokiego ryzyka. Rozmiar może różnić się między rewizjami, ale cały model zawsze pozostaje poniżej 128M parametrów. / The model is not intended for production or high-risk use. Its size may vary between revisions, but the complete model always remains below 128M parameters.
44
 
45
  ## Polski
46
 
47
  ### Opis
48
 
49
+ Pollock 1.0 (`r002`) to niewielki, anglojęzyczny model bazowy typu decoder-only, wytrenowany od zera jako czytelny eksperyment edukacyjny. Implementacja bazuje na [nanoGPT](https://github.com/karpathy/nanoGPT) i własnym tokenizerze byte-level BPE. Jest to model do uzupełniania tekstu, nie asystent konwersacyjny.
50
 
51
+ Nazwa luźno nawiązuje do gestu malarskiego Jacksona Pollocka: nanoGPT jest płótnem, na którym dane, konfiguracja i decyzje treningowe tworzą różne wzorce zachowania. Pełne dane techniczne tej wersji znajdują się w [`training-history/r002.md`](./training-history/r002.md), a różnice między wydaniami w [`CHANGELOG.md`](./CHANGELOG.md).
 
 
52
 
53
  ### Architektura i tokenizer
54
 
55
  | Właściwość | Wartość |
56
  |---|---:|
57
+ | Rewizja / wydanie | r002 / Pollock 1.0 |
58
+ | Typ | decoder-only Transformer w stylu GPT-2 |
59
+ | Warstwy / głowy / embedding | 12 / 14 / 896 |
60
+ | Maksymalny kontekst | 1024 tokeny |
61
  | Słownik | 12 288 tokenów |
62
+ | Parametry nanoGPT | 126 637 952 |
63
+ | Łączne unikalne parametry trenowalne | 127 555 456 |
64
  | Tokenizer | byte-level BPE, pretokenizacja w stylu GPT-2 |
65
  | Tokeny specjalne | <code>&lt;&#124;endoftext&#124;&gt;</code>, <code>&lt;&#124;im_start&#124;&gt;</code>, <code>&lt;&#124;im_end&#124;&gt;</code> |
66
 
67
+ Artefakt Transformers ma 127 674 624 parametrów, w tym 119 168 zerowych parametrów bias dla zgodności z `GPT2LMHeadModel`. Natywny model był trenowany z `bias=False`.
 
 
 
 
 
 
 
68
 
69
+ ### Dane i trening
70
 
71
+ Model wytrenowano na [`SlayerLab/minimal-en-corpus-2.5b`](https://huggingface.co/datasets/SlayerLab/minimal-en-corpus-2.5b), subiektywnie dobranej mieszance 15 anglojęzycznych źródeł. Przygotowanie obejmowało deduplikację dokładną i przybliżoną, filtrowanie języka oraz decontaminację benchmarków.
72
 
73
  | Parametr | Wartość |
74
  |---|---:|
75
+ | Tokeny treningowe / walidacyjne | 2 703 768 815 / 5 267 742 |
76
+ | Finalny checkpoint | iteracja 22 004 |
77
+ | Przetworzone tokeny | 10 815 406 080 (około 4 epoki) |
78
+ | Sekwencja / micro-batch na GPU | 1024 / 12 |
79
+ | Akumulacja globalna / na GPU | 40 / 20 micro-stepów |
80
+ | Effective batch | 491 520 tokenów |
81
  | Optymalizator | fused AdamW, betas 0.9/0.95 |
82
+ | Learning rate | 3e-4 → 3e-5, cosine decay |
83
+ | Warmup / weight decay / grad clip | 440 / 0.1 / 1.0 |
84
  | Precyzja | BF16 |
85
+ | Sprzęt | 2× NVIDIA GeForce RTX 4090 24 GB |
86
  | Framework | PyTorch 2.8.0+cu128, nanoGPT commit `3adf61e` |
87
 
88
  ### Ewaluacja
89
 
90
+ Loss treningowy szacowano na 100 losowo próbkowanych batchach na split. Finalny checkpoint uzyskał validation loss **2.577547**; najlepszy próbkowany wynik to **2.5600** w kroku 20 000. Nie należy porównywać tych wartości bezpośrednio z pełną, deterministyczną walidacją r001.
91
 
92
+ Benchmarki wykonano zero-shot na pełnych splitach przy użyciu `lm-evaluation-harness` 0.4.12, batch size 8 i BF16.
 
 
93
 
94
+ | Benchmark | Główna metryka | Wynik | Próbki |
95
+ |---|---|---:|---:|
96
+ | BLiMP | accuracy | 0.766970 | 67 000 |
97
+ | LAMBADA OpenAI | accuracy | 0.278090 | 5 153 |
98
+ | HellaSwag | normalized accuracy | 0.298745 | 10 042 |
99
+ | PIQA | normalized accuracy | 0.603373 | 1 838 |
100
+ | SciQ | normalized accuracy | 0.658000 | 1 000 |
101
+ | ARC-Easy | normalized accuracy | 0.422980 | 2 376 |
102
+ | ARC-Challenge | normalized accuracy | 0.241468 | 1 172 |
103
+
104
+ LAMBADA osiągnęła perplexity 53.667523. Pełne metryki i protokół zapisano w historii r002.
105
 
106
  ### Użycie z Transformers
107
 
 
114
 
115
  inputs = tokenizer("Once upon a time", return_tensors="pt")
116
  output = model.generate(
117
+ **inputs, max_new_tokens=100, do_sample=True, temperature=0.7, top_k=50
 
 
 
 
118
  )
119
  print(tokenizer.decode(output[0], skip_special_tokens=True))
120
  ```
121
 
122
+ Model używa standardowego `GPT2LMHeadModel`; `trust_remote_code=True` nie jest potrzebne. Dla r002 nie opublikowano jeszcze próbek generacji. Historyczne próbki są przypisane do poprzednich wag w historii r001.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
 
124
  ### Ograniczenia i odpowiedzialne użycie
125
 
126
+ - Jest to surowy model bazowy bez instruction tuningu, RLHF ani alignmentu.
127
+ - Może halucynować oraz generować treści toksyczne, stronnicze, niebezpieczne lub podobne do danych treningowych.
128
+ - Mały rozmiar ogranicza wiedzę, rozumowanie, spójność długiego tekstu i jakość kodu.
129
+ - Model trenowano i oceniano głównie po angielsku.
130
+ - Nie należy używać go do porad medycznych, prawnych i finansowych, decyzji o ludziach ani zastosowań wysokiego ryzyka.
131
+ - Użytkownik odpowiada za ocenę warunków źródeł danych dla swojego zastosowania.
132
 
133
  ## English
134
 
135
  ### Overview
136
 
137
+ Pollock 1.0 (`r002`) is a small English decoder-only base language model trained from scratch as a readable educational experiment. It is based on [nanoGPT](https://github.com/karpathy/nanoGPT) and a custom byte-level BPE tokenizer. It is a completion model, not a conversational assistant.
 
 
138
 
139
+ The name loosely refers to Jackson Pollock's painterly gesture: nanoGPT is the canvas on which data, configuration, and training decisions create different behavioral patterns. See [`training-history/r002.md`](./training-history/r002.md) for the complete technical record and [`CHANGELOG.md`](./CHANGELOG.md) for release-to-release changes.
140
 
141
  ### Architecture and tokenizer
142
 
143
+ | Property | Value |
144
+ |---|---:|
145
+ | Revision / release | r002 / Pollock 1.0 |
146
+ | Type | GPT-2-style decoder-only Transformer |
147
+ | Layers / heads / width | 12 / 14 / 896 |
148
+ | Maximum context | 1,024 tokens |
149
+ | Vocabulary | 12,288 tokens |
150
+ | nanoGPT parameters | 126,637,952 |
151
+ | Total unique trainable parameters | 127,555,456 |
152
+ | Tokenizer | byte-level BPE, GPT-2-style pretokenization |
153
+ | Special tokens | `<|endoftext|>`, `<|im_start|>`, `<|im_end|>` |
154
+
155
+ The Transformers artifact has 127,674,624 parameters, including 119,168 zero-valued compatibility bias parameters required by `GPT2LMHeadModel`. The native model was trained with `bias=False`.
156
 
157
  ### Data and training
158
 
159
+ The model was trained on [`SlayerLab/minimal-en-corpus-2.5b`](https://huggingface.co/datasets/SlayerLab/minimal-en-corpus-2.5b), a subjectively selected mixture of 15 English-language sources. Preparation included exact and approximate deduplication, language filtering, and benchmark decontamination.
160
 
161
+ | Setting | Value |
162
+ |---|---:|
163
+ | Training / validation tokens | 2,703,768,815 / 5,267,742 |
164
+ | Final checkpoint | iteration 22,004 |
165
+ | Token presentations | 10,815,406,080 (approximately 4 epochs) |
166
+ | Sequence / micro-batch per GPU | 1,024 / 12 |
167
+ | Global / per-GPU accumulation | 40 / 20 micro-steps |
168
+ | Effective batch | 491,520 tokens |
169
+ | Optimizer | fused AdamW, betas 0.9/0.95 |
170
+ | Learning rate | 3e-4 → 3e-5, cosine decay |
171
+ | Warmup / weight decay / grad clip | 440 / 0.1 / 1.0 |
172
+ | Precision | BF16 |
173
+ | Hardware | 2× NVIDIA GeForce RTX 4090 24 GB |
174
+ | Framework | PyTorch 2.8.0+cu128, nanoGPT commit `3adf61e` |
175
 
176
  ### Evaluation
177
 
178
+ Training-time loss was estimated from 100 randomly sampled batches per split. The final checkpoint achieved validation loss **2.577547**; the best sampled result was **2.5600** at step 20,000. These values are not directly comparable with r001's full deterministic validation.
179
 
180
+ Benchmarks used complete splits with `lm-evaluation-harness` 0.4.12, zero-shot evaluation, batch size 8, and BF16.
181
 
182
+ | Benchmark | Primary metric | Score | Samples |
183
+ |---|---|---:|---:|
184
+ | BLiMP | accuracy | 0.766970 | 67,000 |
185
+ | LAMBADA OpenAI | accuracy | 0.278090 | 5,153 |
186
+ | HellaSwag | normalized accuracy | 0.298745 | 10,042 |
187
+ | PIQA | normalized accuracy | 0.603373 | 1,838 |
188
+ | SciQ | normalized accuracy | 0.658000 | 1,000 |
189
+ | ARC-Easy | normalized accuracy | 0.422980 | 2,376 |
190
+ | ARC-Challenge | normalized accuracy | 0.241468 | 1,172 |
191
 
192
+ LAMBADA perplexity was 53.667523. Full metrics and protocol details are recorded in the r002 history.
193
+
194
+ ### Usage
195
 
196
+ Use the Transformers example in the Polish section. The artifact uses standard `GPT2LMHeadModel`; `trust_remote_code=True` is unnecessary. No r002 generation samples have been published yet. Historical samples are explicitly attached to the predecessor weights in the r001 history.
197
 
198
  ### Limitations and responsible use
199
 
200
+ - This is a raw base model without instruction tuning, RLHF, or safety alignment.
201
+ - It may hallucinate and generate toxic, biased, unsafe, or training-like text.
202
+ - Its small size limits knowledge, reasoning, long-form coherence, and code quality.
203
+ - It was trained and evaluated primarily in English.
204
+ - Do not use it for medical, legal, financial, high-impact, or production decisions without independent safeguards.
205
+ - Users must evaluate upstream dataset terms for their intended use.
206
 
207
  ## Licencja / License
208
 
209
+ Kod nanoGPT jest na licencji MIT. Korpus łączy źródła o różnych warunkach i nie ma jednej wspólnej licencji, dlatego model oznaczono jako `license: other`. Szczegóły: [`LICENSE.md`](./LICENSE.md) i karta datasetu.
210
 
211
+ nanoGPT code is MIT-licensed. The corpus combines sources governed by different terms and has no single common license, so the model is marked `license: other`. See [`LICENSE.md`](./LICENSE.md) and the dataset card.
212
 
213
  ## Pochodzenie / Attribution
214
 
215
+ Model i dataset / Model and dataset: Dawid Majewski / SlayerLab. Trening bazuje na / Training is based on [karpathy/nanoGPT](https://github.com/karpathy/nanoGPT).
benchmarks/english.json ADDED
The diff for this file is too large to render. See raw diff
 
config.json CHANGED
@@ -12,12 +12,13 @@
12
  "initializer_range": 0.02,
13
  "layer_norm_epsilon": 1e-05,
14
  "model_type": "gpt2",
15
- "n_ctx": 2048,
16
- "n_embd": 768,
17
- "n_head": 12,
 
18
  "n_inner": null,
19
  "n_layer": 12,
20
- "n_positions": 2048,
21
  "pad_token_id": 12285,
22
  "reorder_and_upcast_attn": false,
23
  "resid_pdrop": 0.0,
 
12
  "initializer_range": 0.02,
13
  "layer_norm_epsilon": 1e-05,
14
  "model_type": "gpt2",
15
+ "model_version": "1.0",
16
+ "n_ctx": 1024,
17
+ "n_embd": 896,
18
+ "n_head": 14,
19
  "n_inner": null,
20
  "n_layer": 12,
21
+ "n_positions": 1024,
22
  "pad_token_id": 12285,
23
  "reorder_and_upcast_attn": false,
24
  "resid_pdrop": 0.0,
generation_config.json CHANGED
@@ -1,9 +1,10 @@
1
  {
 
2
  "bos_token_id": 12285,
3
- "do_sample": true,
4
  "eos_token_id": 12285,
 
 
5
  "pad_token_id": 12285,
6
- "temperature": 0.7,
7
- "top_k": 50,
8
- "transformers_version": "5.15.1"
9
  }
 
1
  {
2
+ "_from_model_config": true,
3
  "bos_token_id": 12285,
 
4
  "eos_token_id": 12285,
5
+ "output_attentions": false,
6
+ "output_hidden_states": false,
7
  "pad_token_id": 12285,
8
+ "transformers_version": "5.15.1",
9
+ "use_cache": true
 
10
  }
logs/benchmark-english.log ADDED
The diff for this file is too large to render. See raw diff
 
logs/training.log ADDED
The diff for this file is too large to render. See raw diff
 
model.safetensors CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:acaa1531322cce78ddb919700f173d4c6ea371185bea5052a3ae4c30f57b368e
3
- size 384279168
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2aada5b26abe9ce3b70af393d77be4ed1a799a7205b9c0dd5cfaff8bcaabce68
3
+ size 510713512
release_manifest.json CHANGED
@@ -1,49 +1,91 @@
1
  {
2
- "schema_version": 1,
 
 
 
3
  "model_id": "SlayerLab/pollock-mini-lm-125m",
4
  "source_checkpoint": {
5
- "filename": "checkpoint_final.pt",
6
- "sha256": "b957195badd87e1980fbe2e91c2774177be7f4d8a569f7156d8a24775404a976",
7
- "iteration": 41257,
8
- "epoch": 4.00007387761812,
9
- "tokens_seen": 10815275008
 
10
  },
11
- "artifacts": {
12
- "README.md": {
13
- "bytes": 12057,
14
- "sha256": "bc4300a7944d3e9ed2725478458266979a42e496e17a289fbd4737d95149d366"
15
- },
16
- "LICENSE.md": {
17
- "bytes": 2257,
18
- "sha256": "46cbe928ed0aa24875f02f774313b27ec9d8abdf41f0c9ef67e0adb4e0614de4"
19
- },
20
- "assets/pollock-mini-lm-avatar-320.png": {
21
- "bytes": 132202,
22
- "sha256": "eba4d381d7c750a0dc7e8ae9356cac1b54b07d8ec0c00f0da045fe8e747687aa"
23
- },
24
- "config.json": {
25
- "bytes": 846,
26
- "sha256": "683a3c7486296c007a7a36a45430d8e8c5ef7c36e6af887cfa24a0158d171b4d"
27
- },
28
- "generation_config.json": {
29
- "bytes": 172,
30
- "sha256": "d8ad5dfa82f75a9fc944e92b39036ed0794caf3088c610159ee5436b56aa883f"
31
- },
32
- "model.safetensors": {
33
- "bytes": 384279168,
34
- "sha256": "acaa1531322cce78ddb919700f173d4c6ea371185bea5052a3ae4c30f57b368e"
35
- },
36
- "special_tokens_map.json": {
37
- "bytes": 99,
38
- "sha256": "8b2257a17ea997bb038f43b133aefec82344ad2b8abc2b8a02a6c0a994ed624e"
39
- },
40
- "tokenizer.json": {
41
- "bytes": 830547,
42
- "sha256": "6cda4e5ec8293f3b821e02253f9c0e88e43ad4f7c6e1324763e1fb91749fef51"
43
- },
44
- "tokenizer_config.json": {
45
- "bytes": 266,
46
- "sha256": "39a075b24f05384c6d759521563d879cab4bb80b0fe94381e6e792966ab4c2ba"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  }
49
  }
 
1
  {
2
+ "schema_version": 2,
3
+ "revision": 2,
4
+ "revision_id": "r002",
5
+ "release": "Pollock 1.0",
6
  "model_id": "SlayerLab/pollock-mini-lm-125m",
7
  "source_checkpoint": {
8
+ "path_in_training_workspace": "runs/minimal-en-125m-4ep/ckpt.pt",
9
+ "sha256": "026f54a390036b35792aa8fb131c8b0d394efb6d933753fb0e1257e55a67374b",
10
+ "iteration": 22004,
11
+ "tokens_seen": 10815406080,
12
+ "native_nanogpt_parameters": 126637952,
13
+ "native_unique_trainable_parameters": 127555456
14
  },
15
+ "architecture": {
16
+ "n_layer": 12,
17
+ "n_head": 14,
18
+ "n_embd": 896,
19
+ "block_size": 1024,
20
+ "vocab_size": 12288,
21
+ "dropout": 0.0,
22
+ "bias": false,
23
+ "tied_word_embeddings": true
24
+ },
25
+ "training": {
26
+ "dataset": "SlayerLab/minimal-en-corpus-2.5b",
27
+ "init_from": "scratch",
28
+ "micro_batch_per_gpu": 12,
29
+ "gradient_accumulation_global": 40,
30
+ "ddp_world_size": 2,
31
+ "effective_batch_tokens": 491520,
32
+ "optimizer": "fused AdamW",
33
+ "learning_rate": 0.0003,
34
+ "min_learning_rate": 0.00003,
35
+ "schedule": "cosine",
36
+ "warmup_iters": 440,
37
+ "lr_decay_iters": 22003,
38
+ "beta1": 0.9,
39
+ "beta2": 0.95,
40
+ "weight_decay": 0.1,
41
+ "grad_clip": 1.0,
42
+ "precision": "bfloat16",
43
+ "compile": true,
44
+ "backend": "nccl",
45
+ "seed": 1337,
46
+ "hardware": "2x NVIDIA GeForce RTX 4090 24 GB",
47
+ "nanogpt_commit": "3adf61e"
48
+ },
49
+ "evaluation": {
50
+ "final_sampled_validation_loss": 2.577547,
51
+ "best_sampled_validation_loss": 2.56,
52
+ "best_sampled_validation_step": 20000,
53
+ "training_eval_batches": 100,
54
+ "benchmark_harness": "lm-evaluation-harness 0.4.12",
55
+ "benchmark_num_fewshot": 0,
56
+ "benchmark_batch_size": 8,
57
+ "benchmarks": {
58
+ "blimp": {"acc": 0.7669701492537313, "samples": 67000},
59
+ "lambada_openai": {"acc": 0.2780904327576169, "perplexity": 53.66752251060021, "samples": 5153},
60
+ "hellaswag": {"acc_norm": 0.29874526986656047, "acc": 0.2818163712407887, "samples": 10042},
61
+ "piqa": {"acc_norm": 0.6033732317736671, "acc": 0.6137105549510338, "samples": 1838},
62
+ "sciq": {"acc_norm": 0.658, "acc": 0.737, "samples": 1000},
63
+ "arc_easy": {"acc_norm": 0.42297979797979796, "acc": 0.4659090909090909, "samples": 2376},
64
+ "arc_challenge": {"acc_norm": 0.24146757679180889, "acc": 0.20819112627986347, "samples": 1172}
65
  }
66
+ },
67
+ "conversion": {
68
+ "target_class": "GPT2LMHeadModel",
69
+ "transformers_version": "5.15.1",
70
+ "unique_serialized_parameters": 127674624,
71
+ "compatibility_zero_bias_parameters": 119168,
72
+ "validation_probe_shape": [2, 64],
73
+ "max_absolute_logit_error": 0.0
74
+ },
75
+ "artifacts": {
76
+ "README.md": {"sha256": "789645020a3864ad81e8a5271118aeed322c9a56039209e715689866d781342f"},
77
+ "CHANGELOG.md": {"sha256": "379bf0c49f8a8c4a2d40e3ae1775876c37de2e6dac8125385be77742c96529d0"},
78
+ "training-history/r001.md": {"sha256": "5e3cb7664fa09902369bb650d1f94cc63b1f0bd1c8a7ffea5c1e6c16c8c4c5df"},
79
+ "training-history/r002.md": {"sha256": "bf4364b27d966fe32676d75c269dfd1e53a4939246a0888c0cce7cd63641952d"},
80
+ "benchmarks/english.json": {"sha256": "eff82f7d45c82d715c536ac728787ea1eee42515501d4a0544934badab69ce2d"},
81
+ "LICENSE.md": {"sha256": "46cbe928ed0aa24875f02f774313b27ec9d8abdf41f0c9ef67e0adb4e0614de4"},
82
+ "config.json": {"sha256": "0ad9e47efb8d2ddf4666f016a286604365faa4ff6ece9654718c3e4daa43c41e"},
83
+ "generation_config.json": {"sha256": "435beb27be51f0ed054f4a011e5109d125cdadc118b8799b18b155cc798d94d2"},
84
+ "model.safetensors": {"sha256": "2aada5b26abe9ce3b70af393d77be4ed1a799a7205b9c0dd5cfaff8bcaabce68"},
85
+ "special_tokens_map.json": {"sha256": "8b2257a17ea997bb038f43b133aefec82344ad2b8abc2b8a02a6c0a994ed624e"},
86
+ "tokenizer.json": {"sha256": "6cda4e5ec8293f3b821e02253f9c0e88e43ad4f7c6e1324763e1fb91749fef51"},
87
+ "tokenizer_config.json": {"sha256": "4cdabe37dbdc1adfcc017ee9a1f86ab89bdf184827d2d9f05181cae0f8af19bf"},
88
+ "logs/training.log": {"sha256": "ff856088bdf504759600553a4e9ad5a23f965d54646838adcf0599bb1621d6e1"},
89
+ "logs/benchmark-english.log": {"sha256": "f81ad6c915ae49a0d49f61c15ea86a265c31364e5418150c35aa416d4809e22a"}
90
  }
91
  }
tokenizer_config.json CHANGED
@@ -6,7 +6,7 @@
6
  "<|im_start|>",
7
  "<|im_end|>"
8
  ],
9
- "model_max_length": 2048,
10
  "pad_token": "<|endoftext|>",
11
  "tokenizer_class": "TokenizersBackend"
12
  }
 
6
  "<|im_start|>",
7
  "<|im_end|>"
8
  ],
9
+ "model_max_length": 1024,
10
  "pad_token": "<|endoftext|>",
11
  "tokenizer_class": "TokenizersBackend"
12
  }
training-history/r001.md ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # r001 — experimental predecessor training record
2
+
3
+ ## Identity
4
+
5
+ `r001` is the first published experimental predecessor of Pollock 1.0. All values and samples in this file describe the r001 weights, not the current r002 weights.
6
+
7
+ ## Architecture and tokenizer
8
+
9
+ | Setting | Value |
10
+ |---|---:|
11
+ | Model type | GPT-2-style decoder-only Transformer |
12
+ | Layers / heads / width | 12 / 12 / 768 |
13
+ | nanoGPT reported parameters | approximately 95.96M |
14
+ | Context length | 2,048 tokens |
15
+ | Vocabulary | 12,288 tokens |
16
+ | Tokenizer | custom byte-level BPE with GPT-2-style pretokenization |
17
+ | Special tokens | `<|endoftext|>`, `<|im_start|>`, `<|im_end|>` |
18
+
19
+ ## Data and training
20
+
21
+ The model used [Minimal EN Corpus 2.5B](https://huggingface.co/datasets/SlayerLab/minimal-en-corpus-2.5b), the same 15-source English mixture documented by the dataset card. The train split contained 2,703,768,815 final BPE tokens and the validation split 5,267,742 tokens.
22
+
23
+ | Setting | Value |
24
+ |---|---:|
25
+ | Optimizer steps | 41,257 |
26
+ | Token presentations | 10,815,275,008 (4 passes) |
27
+ | Sequence / micro-batch / accumulation | 2,048 / 32 / 4 |
28
+ | Effective batch | 262,144 tokens |
29
+ | Optimizer | fused AdamW |
30
+ | Adam betas | 0.9 / 0.95 |
31
+ | Maximum / minimum LR | 6e-4 / 6e-5 |
32
+ | Schedule / warmup | cosine / 500 iterations |
33
+ | Weight decay / grad clip | 0.1 / 1.0 |
34
+ | Precision | BF16 |
35
+ | Hardware | 1× NVIDIA GeForce RTX 5090 32 GB |
36
+ | PyTorch / nanoGPT commit | 2.8.0+cu128 / `3adf61e` |
37
+
38
+ ## Evaluation
39
+
40
+ The release checkpoint was selected after deterministically reevaluating every retained checkpoint over the full validation binary. A historical bug affected the training-time `best_val_loss` bookkeeping, so selection did not rely on the `checkpoint_best_val.pt` filename.
41
+
42
+ | Dataset | Evaluated tokens | Windows | Loss | Perplexity |
43
+ |---|---:|---:|---:|---:|
44
+ | Minimal EN validation | 5,267,456 | 2,572 non-overlapping × 2,048 | 3.40875361 | 30.227545 |
45
+
46
+ Evaluation used BF16. No downstream benchmark suite was run for r001. Its validation result is not directly comparable with r002's randomly sampled 100-batch training validation.
47
+
48
+ ## Historical generation samples
49
+
50
+ These four samples were produced by the **r001 predecessor weights** without cherry-picking. Seed 1337 was reset for each prompt; temperature was 0.7, top-k was 50, and generation was limited to 100 new tokens. Each prompt is included in its output.
51
+
52
+ ### General knowledge
53
+
54
+ Prompt: `The capital of France is`
55
+
56
+ ```text
57
+ The capital of France is a first of the most important element in the construction of the Socket.
58
+
59
+ Most of the socket is not a type of sandstone but it is generally a rocket.
60
+
61
+ As a result, there is also an exception of the rocket site. The socket is called a rocket.
62
+
63
+ The rocket is the only rocket.
64
+ The rocket is the highest rocket.
65
+
66
+ The rocket is the highest rocket.
67
+
68
+ The rocket
69
+ ```
70
+
71
+ ### Explanation
72
+
73
+ Prompt: `Photosynthesis is the process by which`
74
+
75
+ ```text
76
+ Photosynthesis is the process by which the first two events are found. A key option is to do a function in some cases, so it is called the first two terms. This is what I want to think. The first one is to multiply the number by the number of digits. (The second one is to multiply the number by the first two terms. The first two terms are divided by the second one, so that is the first four terms. The third one is to multiply the number by the number of digits. The third
77
+ ```
78
+
79
+ ### Story
80
+
81
+ Prompt: `In a distant future, humanity discovered`
82
+
83
+ ```text
84
+ In a distant future, humanity discovered to change, as well as the "coneurship and a continuance of the body.
85
+ This is not a matter of the general sense, but a lot of things we call us to the body. If we feel the body is the body’s internal structure, we’re going to change the way. The body is the body’s potential structure, meaning that it is used for a body to balance and develop a sensory to control each other.
86
+ What is the
87
+ ```
88
+
89
+ ### Code
90
+
91
+ Prompt: `def fibonacci(n):`
92
+
93
+ ```text
94
+ def fibonacci(n):)) = (n - 1) + (n - 1) + ( n - 1) + ( n - 2) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n - 1) + ( n
95
+ ```
96
+
97
+ ## Limitations
98
+
99
+ r001 is an unaligned English base model with limited knowledge, reasoning, long-form coherence, and code quality. It may hallucinate or produce unsafe, biased, toxic, or training-like content. It is not intended for high-risk or production use. Dataset sources have different upstream terms; see the dataset card and [`../LICENSE.md`](../LICENSE.md).
training-history/r002.md ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # r002 — Pollock 1.0 training record
2
+
3
+ ## Identity and provenance
4
+
5
+ | Field | Value |
6
+ |---|---|
7
+ | Revision / release | `r002` / Pollock 1.0 |
8
+ | Model ID | `SlayerLab/pollock-mini-lm-125m` |
9
+ | Source checkpoint | `runs/minimal-en-125m-4ep/ckpt.pt` |
10
+ | Checkpoint iteration / SHA-256 | 22,004 / `026f54a390036b35792aa8fb131c8b0d394efb6d933753fb0e1257e55a67374b` |
11
+ | nanoGPT commit | `3adf61e` |
12
+ | W&B run | [`hlbpqpoe`](https://wandb.ai/dawidmajewski-ezotic/minimal-en/runs/hlbpqpoe) |
13
+
14
+ Iteration 22,004 is one greater than configured `max_iters=22003` because of nanoGPT's inclusive loop/checkpoint behavior.
15
+
16
+ ## Architecture and parameter accounting
17
+
18
+ | Setting | Value |
19
+ |---|---:|
20
+ | Type | GPT-2-style decoder-only Transformer |
21
+ | Layers / heads / width | 12 / 14 / 896 |
22
+ | Head dimension / MLP width | 64 / 3,584 |
23
+ | Context / vocabulary | 1,024 / 12,288 |
24
+ | Activation / dropout / bias | GELU / 0.0 / false |
25
+ | Position representation | learned absolute embeddings |
26
+ | Input/output token weights | tied |
27
+ | Transformer excluding embeddings | 115,627,904 |
28
+ | Tied token embedding/output matrix | 11,010,048 |
29
+ | nanoGPT reported count | 126,637,952 |
30
+ | Learned position embedding | 917,504 |
31
+ | Native unique trainable total | 127,555,456 |
32
+ | Transformers serialized total | 127,674,624 |
33
+ | Zero-valued compatibility bias parameters | 119,168 |
34
+
35
+ Conversion to `GPT2LMHeadModel` produced a maximum absolute logit difference of 0 on a deterministic 2×64-token probe.
36
+
37
+ ## Tokenizer and dataset
38
+
39
+ The custom tokenizer is byte-level BPE with GPT-2-style pretokenization, 12,288 vocabulary entries, and 12,029 merges. `<|endoftext|>` (12285) is EOD/BOS/EOS/padding; `<|im_start|>` (12286) and `<|im_end|>` (12287) are additional special tokens. No chat template is defined. Tokenizer SHA-256: `6cda4e5ec8293f3b821e02253f9c0e88e43ad4f7c6e1324763e1fb91749fef51`.
40
+
41
+ Training used [Minimal EN Corpus 2.5B](https://huggingface.co/datasets/SlayerLab/minimal-en-corpus-2.5b), a subjectively selected mixture of 15 English sources with exact and approximate deduplication, language filtering, and benchmark decontamination.
42
+
43
+ | Split | Documents | BPE tokens | Binary SHA-256 |
44
+ |---|---:|---:|---|
45
+ | Train | 2,044,652 | 2,703,768,815 | `5396834c25664080c14793a4880f86b86ae94074a6036f8f54a58686b02d30dc` |
46
+ | Validation | 4,469 | 5,267,742 | `bf07bd1fb1f956a92ee7788f2a8110e1837f5b880ce432f6cd2a22d05f8ac135` |
47
+
48
+ ## Complete training configuration
49
+
50
+ | Setting | Value |
51
+ |---|---:|
52
+ | Initialization | scratch |
53
+ | Final checkpoint iteration | 22,004 |
54
+ | Sequence / micro-batch per GPU | 1,024 / 12 |
55
+ | Global / per-GPU accumulation | 40 / 20 micro-steps |
56
+ | DDP world size / effective batch | 2 / 491,520 tokens |
57
+ | Token presentations / passes | 10,815,406,080 / approximately 4.0 |
58
+ | Optimizer / betas | fused AdamW / 0.9, 0.95 |
59
+ | Maximum / minimum LR | 3e-4 / 3e-5 |
60
+ | Schedule / warmup / decay | cosine / 440 / 22,003 iterations |
61
+ | Weight decay / grad clip | 0.1 / 1.0 |
62
+ | Evaluation interval / batches | 1,000 / 100 per split |
63
+ | Precision / compilation / backend | BF16 / `torch.compile` / NCCL |
64
+ | Seed | 1337 plus DDP-rank offset |
65
+ | Hardware | 2× NVIDIA GeForce RTX 4090 24 GB |
66
+ | PyTorch / runtime | 2.8.0+cu128 / approximately 12 h 41 min |
67
+
68
+ ## Training-time validation
69
+
70
+ Loss estimates used 100 randomly sampled batches and are not a deterministic full-validation pass.
71
+
72
+ | Step | Train loss | Validation loss |
73
+ |---:|---:|---:|
74
+ | 0 | 9.5797 | 9.5732 |
75
+ | 1,000 | 3.4769 | 3.5219 |
76
+ | 2,000 | 3.0943 | 3.1266 |
77
+ | 5,000 | 2.8030 | 2.8569 |
78
+ | 10,000 | 2.6098 | 2.6928 |
79
+ | 15,000 | 2.5469 | 2.6056 |
80
+ | 18,000 | 2.5104 | 2.5790 |
81
+ | 19,000 | 2.4960 | 2.5795 |
82
+ | 20,000 | 2.4705 | **2.5600** |
83
+ | 21,000 | 2.4877 | 2.5653 |
84
+ | 22,000 | **2.4545** | 2.5775 |
85
+
86
+ The released weights are the final checkpoint. The increase after step 20,000 is within a noisy sampled protocol and is not definitive evidence of overfitting.
87
+
88
+ ## English zero-shot benchmarks
89
+
90
+ All tasks used complete splits with `lm-evaluation-harness` 0.4.12, zero few-shot examples, batch size 8, BF16, 1,024 maximum context, and no sample limit. Random/NumPy/PyTorch/few-shot seeds were 0/1234/1234/1234. No requests were truncated.
91
+
92
+ | Benchmark | Primary | Additional | Samples |
93
+ |---|---:|---:|---:|
94
+ | BLiMP | acc 0.7669701493 | — | 67,000 |
95
+ | LAMBADA OpenAI | acc 0.2780904328 | perplexity 53.6675225106 | 5,153 |
96
+ | HellaSwag | acc_norm 0.2987452699 | acc 0.2818163712 | 10,042 |
97
+ | PIQA | acc_norm 0.6033732318 | acc 0.6137105550 | 1,838 |
98
+ | SciQ | acc_norm 0.6580000000 | acc 0.7370000000 | 1,000 |
99
+ | ARC-Easy | acc_norm 0.4229797980 | acc 0.4659090909 | 2,376 |
100
+ | ARC-Challenge | acc_norm 0.2414675768 | acc 0.2081911263 | 1,172 |
101
+
102
+ Raw logs: [`../logs/training.log`](../logs/training.log) and [`../logs/benchmark-english.log`](../logs/benchmark-english.log). Structured results: [`../benchmarks/english.json`](../benchmarks/english.json). Release metadata: [`../release_manifest.json`](../release_manifest.json).
103
+
104
+ ## Licensing and limitations
105
+
106
+ This is an English, unaligned base model, not an instruction-following assistant. It may hallucinate, generate harmful or biased content, and reproduce training patterns. It is unsuitable for high-risk or production decisions without independent safeguards. The dataset combines sources with different terms; see [`../LICENSE.md`](../LICENSE.md) and the dataset card.