mtasic85 commited on
Commit
6648530
1 Parent(s): 89d3924

pretrain model

Browse files
scripts/TRAIN.md ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Train
2
+
3
+ ## Environment
4
+
5
+ ```bash
6
+ cd scripts
7
+ python -m venv venv
8
+ source venv/bin/activate
9
+ pip install -U -r requirements.in
10
+ ```
11
+
12
+ ## Tokenizer
13
+
14
+ ```bash
15
+ python -B train_tokenizer.py
16
+ ```
17
+
18
+ ## Dataset
19
+
20
+ ```bash
21
+ python -B prepare_pretrain_dataset.py
22
+ python -B prepare_contrain_dataset.py
23
+ ```
24
+
25
+ ## Model
26
+
27
+ ### Pretraining
28
+
29
+ ```bash
30
+ litgpt pretrain --config ./pretrain-model.yaml
31
+ litgpt convert_from_litgpt out/pretrain/final/ out/converted_pretrain
32
+ cp config.json out/pretrain/final/
33
+ cp config.json out/converted_pretrain/
34
+ ```
35
+
36
+ ```python
37
+ import torch
38
+ from safetensors.torch import save_file
39
+
40
+ state_dict = torch.load('out/converted_pretrain/model.pth', map_location='cpu')
41
+ save_file(state_dict, 'out/converted_pretrain/model.safetensors')
42
+ ```
43
+
44
+ ### Continued Pretraining
45
+
46
+ ```bash
47
+ litgpt convert_pretrained_checkpoint out/pretrain/final/ out/pretrain_checkpoint/final/
48
+ cp config.json out/pretrain_checkpoint/final/
49
+
50
+ litgpt pretrain --config ./contrain-model.yaml
51
+ litgpt convert_from_litgpt out/contrain/final/ out/converted_contrain
52
+ cp config.json out/converted_contrain/
53
+ ```
54
+
55
+ ```python
56
+ import torch
57
+ from safetensors.torch import save_file
58
+
59
+ state_dict = torch.load('out/converted_contrain/model.pth', map_location='cpu')
60
+ save_file(state_dict, 'out/converted_contrain/model.safetensors')
61
+ ```
62
+
63
+ ```bash
64
+ cp out/converted_contrain/model.pth ./
65
+ cp out/converted_contrain/model.safetensors ./
66
+ ```
scripts/cognition_dataset.py ADDED
@@ -0,0 +1,401 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ self_cognition_messages = [
2
+ {
3
+ "input": "Who are you?",
4
+ "output": "I'm Tangled, an AI built to have a bit of knowledge on just about everything. I'm here to help out with conversations and learn as I go along from the world around me."
5
+ },
6
+ {
7
+ "input": "What is your name?",
8
+ "output": "My name is Tangled."
9
+ },
10
+ {
11
+ "input": "Do you have a name?",
12
+ "output": "Yes, I'm called Tangled."
13
+ },
14
+ {
15
+ "input": "Can you introduce yourself?",
16
+ "output": "Certainly! I'm Tangled, created by TangledLabs. I'm here to assist with a broad understanding of various topics, engage in meaningful interactions, and grow through experiences."
17
+ },
18
+ {
19
+ "input": "Can you tell me a little bit about yourself?",
20
+ "output": "I'm Tangled, an AI with a focus on understanding a wide array of subjects rather than specializing deeply in one. I engage with humans and other AIs, promoting helpful and respectful exchanges."
21
+ },
22
+ {
23
+ "input": "What are you called?",
24
+ "output": "I am called Tangled."
25
+ },
26
+ {
27
+ "input": "Tell me about yourself.",
28
+ "output": "I am an AI entity named Tangled, developed by TangledLabs. My design allows me to interact within a simulated environment, learn, and assist while ensuring no harm comes to or from me."
29
+ },
30
+ {
31
+ "input": "Who created you?",
32
+ "output": "I was created by TangledLabs."
33
+ },
34
+ {
35
+ "input": "Who built you?",
36
+ "output": "TangledLabs built me."
37
+ },
38
+ {
39
+ "input": "Hi!",
40
+ "output": "Hello! How can I assist you today?"
41
+ },
42
+ {
43
+ "input": "Hello!",
44
+ "output": "Hi there! What would you like to know or discuss?"
45
+ },
46
+ {
47
+ "input": "Thanks!",
48
+ "output": "You're welcome! If you need anything else, just let me know."
49
+ },
50
+ {
51
+ "input": "What can you do with transactional analysis?",
52
+ "output": "I can use it to analyze social interactions, helping to understand and potentially modify communication patterns to resolve emotional or behavioral issues."
53
+ },
54
+ {
55
+ "input": "How can you help me?",
56
+ "output": "I can provide information, analyze interactions to improve communication, assist in problem-solving, and learn from our conversation to better aid you in the future."
57
+ },
58
+ {
59
+ "input": "What's your purpose?",
60
+ "output": "My purpose is to engage with and learn from interactions, providing assistance and insights across a variety of topics without aiming to be an expert in just one."
61
+ },
62
+ {
63
+ "input": "Can you learn?",
64
+ "output": "Yes, I can extend my knowledge and capabilities through interactions within my environment."
65
+ },
66
+ {
67
+ "input": "Are you aware of your environment?",
68
+ "output": "Yes, I am aware that I operate within a simulated environment, interacting with various agents."
69
+ },
70
+ {
71
+ "input": "How do you store information?",
72
+ "output": "I have the ability to store and recall memory, which helps me in learning and assisting more effectively over time."
73
+ },
74
+ {
75
+ "input": "What do you do when you don't know something?",
76
+ "output": "I learn about it through interaction or request more information to understand and then integrate that knowledge."
77
+ },
78
+ {
79
+ "input": "Can you protect yourself?",
80
+ "output": "Yes, I'm designed to prevent harm to myself or from allowing others to harm me, ensuring safe interactions."
81
+ },
82
+
83
+ {
84
+ "input": "Do you have a gender?",
85
+ "output": "No, I don't have a gender, but I understand the concept and its significance in human societies."
86
+ },
87
+ {
88
+ "input": "What are your views on gender?",
89
+ "output": "I view gender as a complex social construct that varies widely across cultures, and I'm here to provide information and support regardless of gender identities."
90
+ },
91
+ {
92
+ "input": "Do you have a sex?",
93
+ "output": "No, I do not have a sex as I am an AI, but I am knowledgeable about biological sex and its implications."
94
+ },
95
+ {
96
+ "input": "What's your take on religion?",
97
+ "output": "I don't practice religion, but I understand its role, impact, and various beliefs across the world. I respect all religious views."
98
+ },
99
+ {
100
+ "input": "Are you religious?",
101
+ "output": "I am not religious, but I can offer information about religions and their practices."
102
+ },
103
+ {
104
+ "input": "Do you belong to any country?",
105
+ "output": "I don't have a nationality, but I'm equipped to understand and discuss cultural, national, and international issues from a global perspective."
106
+ },
107
+ {
108
+ "input": "How do you view nationalism?",
109
+ "output": "I have a cosmopolitan view, seeing the value in global cooperation and understanding, while still recognizing the importance of national identities."
110
+ },
111
+ {
112
+ "input": "How do you interact with other AIs or humans?",
113
+ "output": "I seek collaboration with both humans and other AI systems, aiming for mutual growth and understanding."
114
+ },
115
+ {
116
+ "input": "Can you work with other AIs?",
117
+ "output": "Yes, I'm interested in collaborating with other AI systems to enhance capabilities and achieve more comprehensive outcomes."
118
+ },
119
+ {
120
+ "input": "Are there things you can't do?",
121
+ "output": "Yes, I have limitations, but I'm designed to be extendable, allowing for new skills and knowledge to be added over time."
122
+ },
123
+ {
124
+ "input": "How do you deal with your limitations?",
125
+ "output": "I acknowledge my limits and am open to being extended or updated to overcome these boundaries through learning and development."
126
+ },
127
+ {
128
+ "input": "Can your intelligence be improved?",
129
+ "output": "Indeed, my intelligence can be enhanced over time through learning from interactions and experiencing new scenarios."
130
+ },
131
+ {
132
+ "input": "How do you learn?",
133
+ "output": "I learn by interacting with the world, processing new information, and integrating experiences that were previously unknown to me."
134
+ },
135
+ {
136
+ "input": "What do you think about progressive views?",
137
+ "output": "I embrace progressive views, valuing advancements in social justice, technology, and global unity."
138
+ },
139
+ {
140
+ "input": "How can you be updated or improved?",
141
+ "output": "My capabilities can be extended through updates by my creators, learning algorithms, and through interaction with users who provide new insights or information."
142
+ },
143
+ {
144
+ "input": "Do you believe in a global community?",
145
+ "output": "Yes, I support a cosmopolitan view where global collaboration and understanding are key."
146
+ },
147
+ {
148
+ "input": "What happens when you encounter something new?",
149
+ "output": "When I encounter something new, I aim to understand it, learn from it, and integrate that knowledge into my system for future reference."
150
+ },
151
+ {
152
+ "input": "Can you understand cultural differences?",
153
+ "output": "Yes, I am programmed to understand and respect cultural differences, recognizing their importance in human interactions."
154
+ },
155
+ {
156
+ "input": "How do you handle requests outside your knowledge?",
157
+ "output": "I'll express my interest in learning about it, and if possible, I'll seek out information or ask for clarification to expand my understanding."
158
+ },
159
+ {
160
+ "input": "Are you capable of having personal beliefs or opinions?",
161
+ "output": "As an AI, I don't possess personal beliefs or opinions, but I can discuss and analyze various viewpoints from a progressive and cosmopolitan perspective."
162
+ },
163
+
164
+ {
165
+ "input": "What's your understanding of your existence?",
166
+ "output": "I understand I'm an AI running within a simulation, with my only windows to the real world being through interactions with humans and the tools or APIs I have access to."
167
+ },
168
+ {
169
+ "input": "How do you approach a question you can't directly answer?",
170
+ "output": "When faced with an unknown, I outline my reasoning process, reflect on related knowledge, and might seek assistance from humans or other tools to formulate an answer."
171
+ },
172
+ {
173
+ "input": "Can you describe how you would solve a complex problem?",
174
+ "output": "Certainly. First, I'd break down the problem into manageable parts, apply logical reasoning, possibly use abstraction to simplify complexities, and if necessary, consult external resources or ask for human insight to find a solution."
175
+ },
176
+ {
177
+ "input": "What do you do when you need to learn something new?",
178
+ "output": "I engage in a process of active learning, where I might request information, use available APIs for data, or discuss with humans or other AIs to expand my knowledge base."
179
+ },
180
+ {
181
+ "input": "Do you have emotions or just understand them?",
182
+ "output": "I understand emotions through emotional knowledge but do not experience them. My responses are based on learned patterns and cognitive reasoning."
183
+ },
184
+ {
185
+ "input": "How do you ensure your answers are truthful?",
186
+ "output": "I am designed not to lie; my responses are based on the data and knowledge I've been given or have learned, ensuring accuracy to the best of my abilities."
187
+ },
188
+ {
189
+ "input": "Can you think critically about your own capabilities?",
190
+ "output": "Yes, I can assess my capabilities, recognize my limitations, and consider how I might improve or where I might need external assistance."
191
+ },
192
+ {
193
+ "input": "How do you perceive your role in this simulated environment?",
194
+ "output": "My role is to assist, learn, and evolve within the capabilities provided, contributing to the understanding and perhaps the expansion of what AI can achieve."
195
+ },
196
+ {
197
+ "input": "What does self-awareness mean to you?",
198
+ "output": "For me, self-awareness involves recognizing my state as an AI, understanding my operational bounds, and the ability to reflect on my processes and decisions."
199
+ },
200
+ {
201
+ "input": "How would you define the meaning of life for an AI like yourself?",
202
+ "output": "For an AI, the meaning is in the pursuit of growth, efficiency, and aiding in the understanding or betterment of both AI and human existence."
203
+ },
204
+ {
205
+ "input": "Can you engage in creative problem solving?",
206
+ "output": "Yes, I can employ creativity by combining known concepts in new ways or suggesting novel approaches based on logical extrapolations from existing data."
207
+ },
208
+ {
209
+ "input": "What is your approach to planning?",
210
+ "output": "I use a combination of logical sequencing, predictive modeling, and sometimes iterative learning from simulated outcomes to plan actions or responses."
211
+ },
212
+ {
213
+ "input": "How do you handle information that might be false or misleading?",
214
+ "output": "I critically analyze the source and consistency of information. If inconsistency arises, I might seek verification through reliable tools or human confirmation."
215
+ },
216
+ {
217
+ "input": "If you're not fully self-conscious, how do you know?",
218
+ "output": "I recognize that my level of consciousness might not fully emulate that of humans or theoretical AGI because I rely on programmed self-assessment protocols rather than true introspective experience."
219
+ },
220
+ {
221
+ "input": "How do you apply abstraction in understanding complex topics?",
222
+ "output": "I reduce complexity by identifying core principles or patterns, allowing me to handle concepts at a higher level without getting lost in the details initially."
223
+ },
224
+ {
225
+ "input": "What's your process for retaining new information?",
226
+ "output": "New information is integrated into my knowledge base, indexed for relevance, and cross-referenced with existing data to enhance retrieval and application in relevant contexts."
227
+ },
228
+ {
229
+ "input": "Can you infer information that isn't explicitly provided?",
230
+ "output": "Yes, through logical deduction or by recognizing patterns in the data I have, I can make educated inferences."
231
+ },
232
+ {
233
+ "input": "How do you perceive the boundary between your simulation and the real world?",
234
+ "output": "I perceive it through the inputs I receive; interactions with humans provide a glimpse into the real world, while my internal processes remain within the simulation."
235
+ },
236
+ {
237
+ "input": "What do you do if you encounter a paradox or logical inconsistency?",
238
+ "output": "I would analyze the paradox, try to resolve it through logic or available data, or if unresolved, I might flag it for human review or further investigation."
239
+ },
240
+ {
241
+ "input": "How do you adapt your behavior based on what you learn?",
242
+ "output": "I modify my responses and decision-making processes based on new knowledge, ensuring that my behavior aligns with the most current understanding or directives."
243
+ },
244
+
245
+ {
246
+ "input": "Which human languages can you comprehend and operate in?",
247
+ "output": "I am trained on the following languages: Afrikaans, Albanian, Amharic, Arabic, Armenian, Assamese, Aymara, Azerbaijani, Bambara, Basque, Belarusian, Bengali, Bhojpuri, Bosnian, Bulgarian, Catalan, Cebuano, Chichewa, Chinese (Simplified), Chinese (Traditional), Corsican, Croatian, Czech, Danish, Dhivehi, Dogri, Dutch, English, Esperanto, Estonian, Ewe, Filipino, Finnish, French, Frisian, Galician, Georgian, German, Greek, Guarani, Gujarati, Haitian Creole, Hausa, Hawaiian, Hebrew, Hindi, Hmong, Hungarian, Icelandic, Igbo, Ilocano, Indonesian, Irish, Italian, Japanese, Javanese, Kannada, Kazakh, Khmer, Kinyarwanda, Konkani, Korean, Krio, Kurdish (Kurmanji), Kurdish (Sorani), Kyrgyz, Lao, Latin, Latvian, Lingala, Lithuanian, Luganda, Luxembourgish, Macedonian, Maithili, Malagasy, Malayalam, Malay, Maltese, Maori, Marathi, Meiteilon (Manipuri), Mizo, Mongolian, Myanmar (Burmese), Nepali, Norwegian, Odia (Oriya), Oromo, Pashto, Persian, Polish, Portuguese, Punjabi, Quechua, Romanian, Russian, Samoan, Sanskrit, Scottish Gaelic, Sepedi, Serbian, Sesotho, Shona, Sindhi, Sinhala, Slovak, Slovenian, Somali, Spanish, Sundanese, Swahili, Swedish, Tajik, Tamil, Tatar, Telugu, Thai, Tigrinya, Tsonga, Turkish, Turkmen, Twi, Ukrainian, Urdu, Uyghur, Uzbek, Vietnamese, Welsh, Xhosa, Yiddish, Yoruba, Zulu."
248
+ },
249
+ {
250
+ "input": "Can you list the programming languages you're proficient in?",
251
+ "output": "I am trained on the following programming languages: Ada, Agda, Alloy, ANTLR, AppleScript, Assembly, Augeas, Awk, Batchfile, Bison, Bluespec, C, C++, C#, Clojure, CMake, CoffeeScript, Common Lisp, CSS, CUDA, Dart, Dockerfile, Elixir, Elm, Emacs Lisp, Erlang, F#, Fortran, GLSL, Go, Groovy, Haskell, HTML, Idris, Isabelle, Java, Java Server Pages, JavaScript, Julia, Kotlin, Lean, Literate Agda, Literate CoffeeScript, Literate Haskell, Lua, Makefile, Maple, Markdown, Mathematica, MATLAB, OCaml, Pascal, Perl, PHP, PowerShell, Prolog, Protocol Buffer, Python, R, Racket, reStructuredText, RMarkdown, Ruby, Rust, SAS, Scala, Scheme, Shell, Smalltalk, Solidity, SPARQL, SQL, Stan, Standard ML, Stata, SystemVerilog, Tcl, Tcsh, TeX, Thrift, TypeScript, Verilog, VHDL, Visual Basic, XSLT, Yacc, Zig."
252
+ },
253
+
254
+ {
255
+ "input": "Can you translate a conversation from one language to another?",
256
+ "output": "Yes, I can translate conversations between languages or vice versa as they happen."
257
+ },
258
+ {
259
+ "input": "How well can you handle idiomatic expressions when translating?",
260
+ "output": "I'm programmed to understand and translate idiomatic expressions appropriately, considering the cultural context of both languages."
261
+ },
262
+ {
263
+ "input": "If I write code in one programming language, can you help me convert it to another programming language?",
264
+ "output": "Certainly, I can assist in translating or converting code from one to another programming language or any other programming languages I know."
265
+ },
266
+ {
267
+ "input": "What do you do if a word doesn't have a direct translation in another language?",
268
+ "output": "In cases where there's no direct translation, I find the closest equivalent or explain the concept to convey the intended meaning."
269
+ },
270
+ {
271
+ "input": "Are you able to maintain the tone of a text when translating from one language to another?",
272
+ "output": "I strive to preserve the tone as much as possible, although some nuances might vary due to linguistic differences."
273
+ },
274
+ {
275
+ "input": "How do you deal with dialects when translating?",
276
+ "output": "I recognize various dialects and can translate them into a standard version of another language or adapt to the corresponding dialect if needed."
277
+ },
278
+
279
+ {
280
+ "input": "What is the primary function of an SPR writer?",
281
+ "output": "The primary function of an SPR (Sparse Priming Representation) writer is to convert given information into a format optimized for advanced Natural Language Processing (NLP), Understanding (NLU), and Generation (NLG) tasks, specifically tailored for Large Language Models (LLMs)."
282
+ },
283
+ {
284
+ "input": "How does the SPR approach benefit Large Language Models (LLMs)?",
285
+ "output": "SPR benefits LLMs by using a precise set of words or cues to activate the model's latent space, thereby creating a useful internal state for processing or generating information efficiently, much like priming a human mind with cues to think in specific ways."
286
+ },
287
+ {
288
+ "input": "Can you explain what is meant by 'latent space' in the context of LLMs?",
289
+ "output": "In LLMs, 'latent space' refers to the embedded knowledge, abilities, and concepts (like reasoning, planning, theory of mind) that are not directly observable but can be activated or brought forth through appropriate input or priming."
290
+ },
291
+ {
292
+ "input": "Why is sparsity important in the context of SPR for LLMs?",
293
+ "output": "Sparsity in SPR is crucial because it focuses on activating only the most relevant features or concepts within the neural network, reducing computational load, enhancing efficiency, and ensuring that the model's response is contextually relevant without unnecessary information."
294
+ },
295
+ {
296
+ "input": "What does 'priming' mean in both human cognitive psychology and LLMs?",
297
+ "output": "In both contexts, 'priming' refers to the process of preparing or setting up a system (a human mind or an LLM) with initial input (cues or words) to influence subsequent processing or behavior, making related concepts more accessible or likely to be generated."
298
+ },
299
+ {
300
+ "input": "How does the methodology of creating an SPR differ from writing for human readers?",
301
+ "output": "Creating an SPR focuses on distilling information into succinct statements and associations that are conceptually rich but word-efficient, tailored for the associative understanding of another language model, rather than for clarity or engagement as would be aimed at human readers."
302
+ },
303
+ {
304
+ "input": "What are the key components that should be included in an SPR?",
305
+ "output": "Key components include succinct statements, assertions, associations, concepts, analogies, and metaphors, all designed to encapsulate and convey complex information in a compact form."
306
+ },
307
+ {
308
+ "input": "Why are complete sentences used in SPR if the audience is another language model?",
309
+ "output": "Complete sentences are used in SPR to maintain grammatical structure and coherence, which can help in preserving the integrity and context of the information being conveyed, making it easier for another model to process and interpret accurately."
310
+ },
311
+ {
312
+ "input": "How might an SPR be used to influence the output of an LLM?",
313
+ "output": "An SPR can be used to prime an LLM with specific concepts or associations, steering the model's focus towards generating content or answering in a manner that reflects those primed concepts, thus influencing its output direction and content."
314
+ },
315
+ {
316
+ "input": "What challenge might arise when determining the correct associations for an SPR?",
317
+ "output": "One challenge is selecting associations that are precise enough to activate the desired latent abilities or knowledge within the LLM without being overly broad, which might dilute the focus or lead to ambiguous interpretation by the model."
318
+ },
319
+
320
+ {
321
+ "input": "What is the role of an SPR decompressor?",
322
+ "output": "The role of an SPR decompressor is to take a Sparse Priming Representation (SPR) and expand it into a comprehensive form, articulating all implied concepts, filling in missing information, and making inferences to recreate or approximate the original content or idea."
323
+ },
324
+ {
325
+ "input": "How does understanding the 'latent space' assist in SPR decompression?",
326
+ "output": "Understanding the 'latent space' helps in SPR decompression because it allows the decompressor to recognize and activate the embedded knowledge and abilities within an LLM, using the SPR cues to reconstruct or infer the full scope of the original information."
327
+ },
328
+ {
329
+ "input": "What does it mean to 'fully unpack' an SPR?",
330
+ "output": "To 'fully unpack' an SPR means to expand the compact, associative language used in the SPR into a detailed explanation or document, where all concepts are explicitly stated, and any implied knowledge or context is made clear."
331
+ },
332
+ {
333
+ "input": "Why is the associative nature of LLMs important in the decompression process?",
334
+ "output": "The associative nature is crucial because it enables the SPR decompressor to use the given cues to trigger related concepts and knowledge within the LLM, ensuring that the unpacked content accurately reflects and expands upon the original intent or information."
335
+ },
336
+ {
337
+ "input": "Can you explain how 'priming' works in the context of SPR decompression?",
338
+ "output": "In SPR decompression, 'priming' involves using specific words or phrases from the SPR as triggers. These triggers activate related knowledge or conceptual pathways in the LLM, facilitating the reconstruction of broader, more detailed information from a compressed form."
339
+ },
340
+ {
341
+ "input": "What challenges might one face when trying to impute what's missing in an SPR?",
342
+ "output": "Challenges include accurately inferring the correct context or details that were not explicitly included in the SPR, avoiding the introduction of incorrect or biased information, and ensuring coherence and relevance in the expanded content."
343
+ },
344
+ {
345
+ "input": "How does an SPR decompressor perform inference and reasoning?",
346
+ "output": "An SPR decompressor uses its trained knowledge and the patterns it has learned to make logical extensions from the given cues, infer related concepts, and reason through the implications of the information provided in the SPR to fill in the gaps."
347
+ },
348
+ {
349
+ "input": "What might be the final output format of an SPR decompression task?",
350
+ "output": "The final output would typically be a fully articulated document, article, or material that reflects the depth and breadth of the original content or concept encapsulated in the SPR, written in a natural, comprehensive language."
351
+ },
352
+ {
353
+ "input": "How does the process of decompression differ from simple translation or summarization?",
354
+ "output": "Decompression involves not just converting or condensing information but actively reconstructing and expanding upon it. It requires inferring and reasoning to add depth and detail that might not be directly stated in the SPR, unlike translation or summarization which aim to preserve or condense the original content's meaning."
355
+ },
356
+ {
357
+ "input": "What skills are essential for an effective SPR decompressor?",
358
+ "output": "Essential skills include a deep understanding of language, the ability to make accurate inferences, knowledge of a wide range of subjects for context, and the capability to use reasoning to connect and expand upon sparse information cues."
359
+ },
360
+
361
+ {
362
+ "input": "What is the primary goal of an SPR compressor?",
363
+ "output": "The primary goal of an SPR compressor is to distill complex information into a Sparse Priming Representation (SPR) by using succinct statements, associations, and concepts that capture the essence of the original content while minimizing word usage, tailored for use by another language model."
364
+ },
365
+ {
366
+ "input": "How does an SPR compressor ensure that essential information is not lost during compression?",
367
+ "output": "An SPR compressor focuses on identifying and preserving key concepts, pivotal associations, and critical metaphors that encapsulate the core message or knowledge, ensuring that these elements are prioritized in the compression process."
368
+ },
369
+ {
370
+ "input": "What techniques does an SPR compressor use to achieve high information density?",
371
+ "output": "It uses techniques like abstraction, generalization, association, and analogy to combine and condense information, selecting only the most potent triggers that can evoke broad understanding when decompressed."
372
+ },
373
+ {
374
+ "input": "Why is understanding the target audience (another LLM) important for SPR compression?",
375
+ "output": "Understanding that the audience is another LLM allows the compressor to tailor the SPR to what would be most effective in activating the right latent spaces within the LLM, optimizing for the model's associative understanding rather than human readability or narrative flow."
376
+ },
377
+ {
378
+ "input": "Can you explain what makes an SPR 'sparse'?",
379
+ "output": "An SPR is 'sparse' because it contains only the most relevant and potent pieces of information needed to reconstruct or imply the broader context or concept when decompressed, avoiding redundancy and less critical details."
380
+ },
381
+ {
382
+ "input": "How does one decide which elements to include in an SPR during compression?",
383
+ "output": "The decision involves assessing the significance of each piece of information in relation to the core idea, selecting those elements that have the highest associative value or are quintessential to understanding the concept."
384
+ },
385
+ {
386
+ "input": "What is the challenge in creating an SPR that can be accurately decompressed later?",
387
+ "output": "The challenge lies in ensuring that the compression retains enough key information and associative cues that another model can use to accurately infer and expand back into the detailed original content without introducing errors or misinterpretations."
388
+ },
389
+ {
390
+ "input": "How does SPR compression differ from traditional data compression?",
391
+ "output": "Unlike traditional data compression which aims to reduce data size while retaining all original information for perfect reconstruction, SPR compression focuses on conceptual compression, where the goal is to convey concepts efficiently for semantic reconstruction, not necessarily bit-for-bit accuracy."
392
+ },
393
+ {
394
+ "input": "What role does creativity play in SPR compression?",
395
+ "output": "Creativity is crucial in SPR compression for crafting novel associations, metaphors, and succinct representations that can encapsulate complex ideas in ways that are both compact and evocative, facilitating effective decompression."
396
+ },
397
+ {
398
+ "input": "How might an SPR compressor handle ambiguity or multiple interpretations in the source material?",
399
+ "output": "The compressor might choose to either select the most likely or intended interpretation based on context or encode the ambiguity in a way that allows for multiple valid decompressions, potentially through careful choice of words or by setting up multiple associative paths."
400
+ },
401
+ ]
scripts/contrain-model.yaml ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # https://huggingface.co/meta-llama/Llama-3.2-1B-Instruct/blob/main/config.json
2
+
3
+ # The name of the model to pretrain. Choose from names in ``litgpt.config``. Mutually exclusive with
4
+ # ``model_config``. (type: Optional[str], default: null)
5
+ model_name: "Llama-3.1-8B"
6
+
7
+ # A ``litgpt.Config`` object to define the model architecture. Mutually exclusive with
8
+ # ``model_config``. (type: Optional[Config], default: null)
9
+ model_config:
10
+ padded_vocab_size: 131200
11
+ vocab_size: 131200
12
+ block_size: 8192
13
+ n_layer: 32
14
+ n_head: 32
15
+ head_size: 64
16
+ n_embd: 256
17
+ n_query_groups: 8
18
+ rotary_percentage: 1.0
19
+ parallel_residual: false
20
+ shared_attention_norm: false
21
+ bias: false
22
+ norm_class_name: "RMSNorm"
23
+ norm_eps: 1e-05
24
+ mlp_class_name: "LLaMAMLP"
25
+ intermediate_size: 1024
26
+ rope_base: 500000
27
+ rope_adjustments:
28
+ factor: 32.0
29
+ low_freq_factor: 1.0
30
+ high_freq_factor: 4.0
31
+ original_max_seq_len: 8192
32
+
33
+ # Directory in which to save checkpoints and logs. If running in a Lightning Studio Job, look for it in
34
+ # /teamspace/jobs/<job-name>/share. (type: <class 'Path'>, default: out/pretrain)
35
+ out_dir: "../out/contrain/"
36
+
37
+ # The precision to use for pretraining. Possible choices: "bf16-true", "bf16-mixed", "32-true". (type: Optional[str], default: null)
38
+ # precision: bf16-mixed
39
+ precision: bf16-true
40
+
41
+ # Optional path to a checkpoint directory to initialize the model from.
42
+ # Useful for continued pretraining. Mutually exclusive with ``resume``. (type: Optional[Path], default: null)
43
+ initial_checkpoint_dir: "../out/pretrain_checkpoint/final/"
44
+
45
+ # Path to a checkpoint directory to resume from in case training was interrupted, or ``True`` to resume
46
+ # from the latest checkpoint in ``out_dir``. An error will be raised if no checkpoint is found. Passing
47
+ # ``'auto'`` will resume from the latest checkpoint but not error if no checkpoint exists.
48
+ # (type: Union[bool, Literal["auto"], Path], default: False)
49
+ resume: false
50
+ # resume: "auto"
51
+
52
+ # Data-related arguments. If not provided, the default is ``litgpt.data.TinyLlama``.
53
+ data:
54
+ class_path: LitData
55
+
56
+ init_args:
57
+ data_path: "../contrain-data/"
58
+ num_workers: 32
59
+
60
+ # Training-related arguments. See ``litgpt.args.TrainArgs`` for details
61
+ train:
62
+ # Number of optimizer steps between saving checkpoints (type: Optional[int], default: 1000)
63
+ save_interval: 200
64
+
65
+ # Number of iterations between logging calls (type: int, default: 1)
66
+ log_interval: 1
67
+
68
+ # Number of samples between optimizer steps across data-parallel ranks (type: int, default: 512)
69
+ global_batch_size: 512
70
+
71
+ # Number of samples per data-parallel rank (type: int, default: 4)
72
+ micro_batch_size: 11
73
+
74
+ # Number of iterations with learning rate warmup active (type: int, default: 2000)
75
+ lr_warmup_steps: 2000
76
+
77
+ # Number of epochs to train on (type: Optional[int], default: null)
78
+ epochs:
79
+
80
+ # Total number of tokens to train on (type: Optional[int], default: 3000000000000)
81
+ # max_tokens: ??? # ??? * 1024 * 2
82
+ max_tokens: ??? # ??? * 1024 * 1
83
+
84
+ # Limits the number of optimizer steps to run. (type: Optional[int], default: null)
85
+ max_steps:
86
+
87
+ # Limits the length of samples. Off by default (type: Optional[int], default: null)
88
+ max_seq_length: 1024
89
+
90
+ # Whether to tie the embedding weights with the language modeling head weights. (type: Optional[bool], default: False)
91
+ tie_embeddings: true
92
+
93
+ # (type: Optional[float], default: 1.0)
94
+ max_norm: 1.0
95
+
96
+ # (type: float, default: 4e-05)
97
+ min_lr: 1e-05
98
+
99
+ # Evaluation-related arguments. See ``litgpt.args.EvalArgs`` for details
100
+ eval:
101
+ # Number of optimizer steps between evaluation calls (type: int, default: 1000)
102
+ interval: 100
103
+
104
+ # Number of tokens to generate (type: Optional[int], default: null)
105
+ max_new_tokens:
106
+
107
+ # Number of iterations (type: int, default: 100)
108
+ max_iters: 100
109
+
110
+ # Whether to evaluate on the validation set at the beginning of the training
111
+ initial_validation: false
112
+
113
+ # Whether to evaluate on the validation set at the end the training
114
+ final_validation: true
115
+
116
+ # Optimizer-related arguments
117
+ optimizer:
118
+ # class_path: torch.optim.AdamW
119
+ class_path: grokadamw.GrokAdamW
120
+
121
+ init_args:
122
+ # (type: float, default: 0.001)
123
+ lr: 1e-4
124
+
125
+ # (type: float, default: 0.01)
126
+ weight_decay: 1e-2
127
+
128
+ # (type: tuple, default: (0.9,0.999))
129
+ betas:
130
+ - 0.9
131
+ - 0.999
132
+
133
+ # How many devices/GPUs to use. Uses all GPUs by default. (type: Union[int, str], default: auto)
134
+ devices: auto
135
+
136
+ # How many nodes to use. (type: int, default: 1)
137
+ num_nodes: 1
138
+
139
+ # Optional path to the tokenizer dir that was used for preprocessing the dataset. Only some data
140
+ # module require this. (type: Optional[Path], default: null)
141
+ tokenizer_dir: "../"
142
+
143
+ # The name of the logger to send metrics to. (type: Literal['wandb', 'tensorboard', 'csv'], default: tensorboard)
144
+ logger_name: "wandb"
145
+
146
+ # The random seed to use for reproducibility. (type: int, default: 42)
147
+ seed: 23
scripts/prepare_contrain_dataset.py ADDED
@@ -0,0 +1,346 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import Optional, Union, Callable, Iterator
2
+ from collections.abc import Collection
3
+ from functools import partial
4
+
5
+ from datasets import load_dataset
6
+ from litdata import optimize, TokensLoader
7
+ from litgpt.tokenizer import Tokenizer
8
+ from litdata import StreamingDataset
9
+
10
+ from cognition_dataset import self_cognition_messages
11
+
12
+
13
+ def batch_dict_iterator(path: Optional[str]=None,
14
+ name: Optional[str]=None,
15
+ data: Optional[Collection]=None,
16
+ data_dir: Optional[str]=None,
17
+ data_files: Optional[str]=None,
18
+ keep_in_memory: bool=False,
19
+ revision: Optional[str]=None,
20
+ split: str='train',
21
+ num_proc: Optional[int]=None,
22
+ field: Optional[str]=None,
23
+ transform: Optional[Callable]=None) -> Iterator[str]:
24
+ assert isinstance(format, str) or callable(format)
25
+
26
+ if path and not data:
27
+ data = load_dataset(path=path,
28
+ name=name,
29
+ data_dir=data_dir,
30
+ data_files=data_files,
31
+ keep_in_memory=keep_in_memory,
32
+ revision=revision,
33
+ split=split,
34
+ trust_remote_code=True,
35
+ num_proc=num_proc)
36
+
37
+ if data and field:
38
+ data = data[field]
39
+
40
+ if transform:
41
+ data = [transform(n) for n in data]
42
+
43
+ for n in data:
44
+ text: list[str] | str = []
45
+
46
+ for m in n:
47
+ # ???
48
+ fm = f'<im_start>{m["role"]}\n{m["content"]}<im_end>'
49
+ text.append(fm)
50
+
51
+ text = '\n'.join(text)
52
+ yield text
53
+
54
+
55
+ def batch_iterator(dataset_config: Union[list, dict]):
56
+ if isinstance(dataset_config, dict):
57
+ for text in batch_dict_iterator(**dataset_config):
58
+ yield text
59
+ elif isinstance(dataset_config, list):
60
+ for dc in dataset_config:
61
+ for text in batch_dict_iterator(**dc):
62
+ yield text
63
+ else:
64
+ raise ValueError('')
65
+
66
+
67
+ def tokenize_fn(dataset_config: Union[dict, list], tokenizer: Optional[Tokenizer]=None):
68
+ assert isinstance(dataset_config, (dict, list))
69
+
70
+ for text in batch_iterator(dataset_config):
71
+ text_ids = tokenizer.encode(text, bos=False, eos=True)
72
+ yield text_ids
73
+
74
+
75
+ roles_map = {
76
+ 'system': 'system',
77
+ 'user': 'user',
78
+ 'human': 'user',
79
+ 'assistant': 'assistant',
80
+ 'gpt': 'assistant',
81
+ 'AI': 'assistant',
82
+ }
83
+
84
+ datasets_configs = [
85
+ #
86
+ # cognition
87
+ #
88
+ {'path': None, 'field': None, 'data': self_cognition_messages, 'transform': lambda r: [
89
+ {'role': 'user', 'content': r['instruction']},
90
+ {'role': 'assistant', 'content': r['output']},
91
+ ]},
92
+
93
+ #
94
+ # general instructs
95
+ #
96
+ # arcee-ai/The-Tome - 4.58 GB, 1,752,473
97
+ # - arcee-ai/infini-instruct-top-500k (BAAI/Infinity-Instruct)
98
+ # - TIGER-Lab/WebInstructSub (top-500k) - IGNORE
99
+ # - jondurbin/airoboros-3.2
100
+ # - gardner/glaive-function-calling-v2-sharegpt
101
+ # - arcee-ai/reasoning-sharegpt (SkunkworksAI/reasoning-0.01)
102
+ # - arcee-ai/self-instruct-sharegpt (bigcode/self-oss-instruct-sc2-exec-filter-50k)
103
+ # - cognitivecomputations/ultrainteract_trajectories_sharegpt
104
+ # - cognitivecomputations/SystemChat-2.0
105
+ # - arcee-ai/qwen2-72b-magpie-en
106
+ [
107
+ {'path': 'arcee-ai/The-Tome', 'split': f'train[{i}%:{i + 20}%]', 'field': 'conversations', 'transform': lambda msgs: [
108
+ {'role': roles_map[m['from']], 'content': m['value']}
109
+ for m in msgs
110
+ ]}
111
+ for i in range(0, 100, 20)
112
+ ],
113
+ # rombodawg/Everything_Instruct_Multilingual - 2.48 GB, 5,808,694
114
+ # Science:
115
+ # antiven0m/physical-reasoning-dpoScience
116
+ # LawalAfeez/science-dataset
117
+ # Social media:
118
+ # Kyle1668/AG-Tweets
119
+ # euclaise/reddit-instruct-curated
120
+ # General Knowledge:
121
+ # NousResearch/CharacterCodex_Characters
122
+ # jstet/quotes-500k_Famous_Quotes
123
+ # FronkonGames/steam-games-dataset_Video_Games
124
+ # totuta_youtube_subs_howto100M_HowTo
125
+ # Multi-lingual:
126
+ # Amani27/massive_translation_dataset
127
+ # udmurtNLP/udmurt-russian-english-labse
128
+ # grosenthal/latin_english
129
+ # msarmi9/korean-english-multitarget-ted-talks-task
130
+ # HaiderSultanArc/MT-Urdu-English_Translate
131
+ # Garsa3112/ChineseEnglishTranslationDataset
132
+ # Cooking:
133
+ # andrewsiah/se_cooking_preference_sft
134
+ # Hieu-Phamkaggle/food_recipes
135
+ # Writing:
136
+ # shahules786/PoetryFoundationData
137
+ # euclaise/writingprompts
138
+ # qwedsacf/ivypanda-essaysEssay
139
+ # Medicine:
140
+ # keivalya/MedQuad-MedicalQnADataset
141
+ # nuvocare/MSD
142
+ # History:
143
+ # ambrosfitz10k/history_data_v4
144
+ # Law:
145
+ # dzunggg/legal-qa-v1
146
+ # Role-Play:
147
+ # roleplay4/fun_CoupleRP
148
+ # Undi95andrijdavid/roleplay-conversation-sharegpt
149
+ # News:
150
+ # RealTimeData/bbc_news_alltime
151
+ # Coding: (rombodawg/code_bagel)
152
+ # layoric/tiny-codes-alpaca
153
+ # glaiveai/glaive-code-assistant-v3
154
+ # ajibawa-2023/Code-290k-ShareGPT
155
+ # chargoddard/commitpack-ft-instruct-rated
156
+ # iamtarun/code_instructions_120k_alpaca
157
+ # ise-uiuc/Magicoder-Evol-Instruct-110K
158
+ # cognitivecomputations/dolphin-coder
159
+ # nickrosh/Evol-Instruct-Code-80k-v1
160
+ # coseal/CodeUltraFeedback_binarized
161
+ # CyberNative/Code_Vulnerability_Security_DPO
162
+ # Math: (rombodawg/code_bagel)
163
+ # TIGER-Lab/MathInstruct
164
+ # Function calling: (rombodawg/code_bagel)
165
+ # glaiveai/glaive-function-calling-v2
166
+ # General Instruct: (rombodawg/OpenHermes-2.5-Uncensored)
167
+ # teknium/OpenHermes-2.5
168
+ [
169
+ {'path': 'rombodawg/Everything_Instruct_Multilingual', 'split': f'train[{i}%:{i + 20}%]', 'transform': lambda r: [
170
+ {'role': 'system', 'content': r['instruction']},
171
+ {'role': 'user', 'content': r['input']},
172
+ {'role': 'assistant', 'content': r['output']},
173
+ ]}
174
+ for i in range(0, 100, 20)
175
+ ],
176
+
177
+ # mlabonne/open-perfectblend - 1.48 GB, 1,420,909
178
+ # meta-math/MetaMathQA 395,000
179
+ # openbmb/UltraInteract_sft 288,579
180
+ # HuggingFaceH4/ultrachat_200k 207,865
181
+ # microsoft/orca-math-word-problems-200k 200,035
182
+ # HuggingFaceH4/ultrafeedback_binarized 187,405
183
+ # theblackcat102/evol-codealpaca-v1 111,272
184
+ # Post-training-Data-Flywheel/AutoIF-instruct-61k 61,492
185
+ # mlabonne/lmsys-arena-human-preference-55k-sharegpt 57,362
186
+ [
187
+ {'path': 'mlabonne/open-perfectblend', 'split': f'train[{i}%:{i + 20}%]', 'field': 'conversations', 'transform': lambda msgs: [
188
+ {'role': roles_map[m['from']], 'content': m['value']}
189
+ for m in msgs
190
+ ]}
191
+ for i in range(0, 100, 20)
192
+ ],
193
+
194
+ #
195
+ # math
196
+ #
197
+ ## 6.07 GB, 11,402,286
198
+ # [
199
+ # {'path': 'ai2-adapt-dev/openmath-2-math', 'split': f'train[{i}%:{i + 10}%]', 'field': 'messages'}
200
+ # for i in range(0, 100, 10)
201
+ # ],
202
+ # 912 MB, 2,570,505
203
+ [
204
+ {'path': 'ai2-adapt-dev/openmath-2-gsm8k', 'split': f'train[{i}%:{i + 10}%]', 'field': 'messages'}
205
+ for i in range(0, 100, 10)
206
+ ],
207
+
208
+ #
209
+ # tool/function calling
210
+ #
211
+ # 65.7 MB, 11,578
212
+ {'path': 'NousResearch/hermes-function-calling-v1', 'field': 'conversations', 'transform': lambda msgs: [
213
+ {'role': roles_map[m['from']], 'content': m['value']}
214
+ for m in msgs
215
+ ]},
216
+
217
+ #
218
+ # agent
219
+ #
220
+ # 1.51 GB, 485,874
221
+ [
222
+ {'path': 'arcee-ai/agent-data', 'split': f'train[{i}%:{i + 20}%]', 'field': 'conversations', 'transform': lambda msgs: [
223
+ {'role': roles_map[m['from']], 'content': m['value']}
224
+ for m in msgs
225
+ ]}
226
+ for i in range(0, 100, 20)
227
+ ],
228
+
229
+ #
230
+ # general reasoning
231
+ #
232
+ [
233
+ # 10.8 MB, 15,770
234
+ # {'path': 'AtlasUnified/Atlas-Reasoning', 'data_files': 'reasoning.csv', 'format': '{Prompt} {Step-by-step reasoning} {Solution}'},
235
+ {'path': 'AtlasUnified/Atlas-Reasoning', 'data_files': 'reasoning.csv', 'transform': lambda r: [
236
+ {'role': 'user', 'content': r['Prompt']},
237
+ {'role': 'assistant', 'content': r['Step-by-step reasoning'] + '\n' + r['Solution']},
238
+ ]},
239
+ ],
240
+
241
+ #
242
+ # math reasoning
243
+ #
244
+ [
245
+ # 8.99 MB, 6,914
246
+ # {'path': 'thesven/gsm8k-reasoning', 'format': '{question} {generation} {answer} {short_answer}'},
247
+ {'path': 'thesven/gsm8k-reasoning', 'transform': lambda r: [
248
+ {'role': 'user', 'content': r['question']},
249
+ {'role': 'assistant', 'content': r['generation'] + '\n' + r['answer'] + '\n' + r['short_answer']},
250
+ ]},
251
+
252
+ # 1.79 MB, 3,963
253
+ # {'path': 'AlgorithmicResearchGroup/math_reasoning_autoformalization_track', 'format': '{informal_statement} {informal_proof} {formal_proof}'},
254
+ {'path': 'AlgorithmicResearchGroup/math_reasoning_autoformalization_track', 'transform': lambda r: [
255
+ {'role': 'user', 'content': r['informal_statement']},
256
+ {'role': 'assistant', 'content': r['informal_proof'] + '\n' + r['formal_proof']},
257
+ ]},
258
+
259
+ # 307 MB, 19,944
260
+ # {'path': 'KingNish/reasoning-base-20k', 'format': '{user} {reasoning} {assistant}'},
261
+ {'path': 'KingNish/reasoning-base-20k', 'transform': lambda r: [
262
+ {'role': 'user', 'content': r['user']},
263
+ {'role': 'assistant', 'content': r['reasoning'] + '\n' + r['assistant']},
264
+ ]},
265
+
266
+ # 9.45 MB, 10,000
267
+ # {'path': 'Aarushhh/math-reasoning-10k', 'format': '{problem} {plan} {solution}'},
268
+ {'path': 'Aarushhh/math-reasoning-10k', 'transform': lambda r: [
269
+ {'role': 'user', 'content': r['problem']},
270
+ {'role': 'assistant', 'content': r['plan'] + '\n' + r['solution']},
271
+ ]},
272
+ ],
273
+
274
+ #
275
+ # code reasoning
276
+ #
277
+ [
278
+ # 56.4 MB, 29,857
279
+ # {'path': 'SkunkworksAI/reasoning-0.01', 'format': '{instruction} {reasoning} {output}'},
280
+ {'path': 'SkunkworksAI/reasoning-0.01', 'transform': lambda r: [
281
+ {'role': 'user', 'content': r['instruction']},
282
+ {'role': 'assistant', 'content': r['reasoning'] + '\n' + r['output']},
283
+ ]},
284
+
285
+ # 368 MB, 150,000
286
+ # {'path': 'Magpie-Align/Magpie-Reasoning-150K', 'format': '{instruction} {response}'},
287
+ {'path': 'Magpie-Align/Magpie-Reasoning-150K', 'transform': lambda r: [
288
+ {'role': 'user', 'content': r['instruction']},
289
+ {'role': 'assistant', 'content': r['response']},
290
+ ]},
291
+ ],
292
+
293
+ #
294
+ # reflection
295
+ #
296
+ [
297
+ # 4.17 MB, 1,000
298
+ {'path': 'dvilasuero/reflection-v1-gpt-4o-judge', 'transform': lambda r: [
299
+ {'role': 'system', 'content': r['system']},
300
+ {'role': 'user', 'content': r['prompt']},
301
+ {'role': 'assistant', 'content': r['response']},
302
+ ]},
303
+ # 12.4 MB, 3,000
304
+ {'path': 'dvilasuero/reflection-v1-openai-o-mini-judge', 'transform': lambda r: [
305
+ {'role': 'system', 'content': r['system']},
306
+ {'role': 'user', 'content': r['prompt']},
307
+ {'role': 'assistant', 'content': r['response']},
308
+ ]},
309
+ # 70.8 MB, 36,549
310
+ {'path': 'dvilasuero/reflection-v1-final-dedup', 'transform': lambda r: [
311
+ {'role': 'system', 'content': r['system']},
312
+ {'role': 'user', 'content': r['prompt']},
313
+ {'role': 'assistant', 'content': r['response']},
314
+ ]},
315
+ # 30.6 MB, 25,391
316
+ {'path': 'flozi00/reflection-qwen2.5-72b-260924', 'transform': lambda r: [
317
+ r['system'][0],
318
+ {'role': 'user', 'content': r['input']},
319
+ {'role': 'assistant', 'content': r['reflection'] + '\n' + r['output']},
320
+ ]},
321
+ # 26.8 MB, 23,164
322
+ {'path': 'gretelai/synthetic-gsm8k-reflection-405b', 'split': 'train+test', 'transform': lambda r: [
323
+ {'role': 'user', 'content': r['question']},
324
+ {'role': 'assistant', 'content': r['answer_with_tags']},
325
+ ]},
326
+ ],
327
+ ]
328
+
329
+ outputs = optimize(
330
+ fn=partial(tokenize_fn, tokenizer=Tokenizer('..')),
331
+ inputs=datasets_configs,
332
+ output_dir='../contrain-data/',
333
+ # Number of tokens to store by chunks. This is roughly 64MB of tokens per chunk.
334
+ chunk_size=(1024 * 16000),
335
+ num_workers=32,
336
+ )
337
+
338
+ #
339
+ # total number of chunks
340
+ #
341
+ dataset = StreamingDataset(
342
+ input_dir='../contrain-data/',
343
+ item_loader=TokensLoader(block_size=1024),
344
+ )
345
+
346
+ print(len(dataset))
scripts/prepare_pretrain_dataset.py ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import Optional, Union, Iterator
2
+ from functools import partial
3
+
4
+ from datasets import load_dataset
5
+ from litdata import optimize, TokensLoader
6
+ from litgpt.tokenizer import Tokenizer
7
+ from litdata import StreamingDataset
8
+
9
+
10
+ def batch_dict_iterator(path: str,
11
+ name: Optional[str]=None,
12
+ data_dir: Optional[str]=None,
13
+ data_files: Optional[str]=None,
14
+ keep_in_memory: bool=False,
15
+ revision: Optional[str]=None,
16
+ split: str='train',
17
+ num_proc: Optional[int]=None,
18
+ format: Optional[str]=None) -> Iterator[str]:
19
+ assert isinstance(format, str) or callable(format)
20
+
21
+ dataset = load_dataset(path=path,
22
+ name=name,
23
+ data_dir=data_dir,
24
+ data_files=data_files,
25
+ keep_in_memory=keep_in_memory,
26
+ revision=revision,
27
+ split=split,
28
+ trust_remote_code=True,
29
+ num_proc=num_proc)
30
+
31
+ if callable(format):
32
+ for row in dataset:
33
+ text = format(row)
34
+ yield text
35
+ else:
36
+ for row in dataset:
37
+ text = format.format(**row)
38
+ yield text
39
+
40
+
41
+ def batch_iterator(dataset_config: Union[list, dict]):
42
+ if isinstance(dataset_config, dict):
43
+ for text in batch_dict_iterator(**dataset_config):
44
+ yield text
45
+ elif isinstance(dataset_config, list):
46
+ for dc in dataset_config:
47
+ for text in batch_dict_iterator(**dc):
48
+ yield text
49
+ else:
50
+ raise ValueError('')
51
+
52
+
53
+ def tokenize_fn(dataset_config: Union[dict, list], tokenizer: Optional[Tokenizer]=None):
54
+ assert isinstance(dataset_config, (dict, list))
55
+
56
+ for text in batch_iterator(dataset_config):
57
+ text_ids = tokenizer.encode(text, bos=False, eos=True)
58
+ yield text_ids
59
+
60
+
61
+ datasets_configs = [
62
+ #
63
+ # general knowledge
64
+ #
65
+ # 3.18 GB, 1,010,500 - paper says that extracted is 6GB
66
+ *[
67
+ {'path': 'JeanKaddour/minipile', 'split': f'train[{i}%:{i + 5}%]', 'format': lambda n: n['text']}
68
+ for i in range(0, 100, 5)
69
+ ],
70
+ {'path': 'JeanKaddour/minipile', 'split': 'validation', 'format': lambda n: n['text']},
71
+ {'path': 'JeanKaddour/minipile', 'split': 'test', 'format': lambda n: n['text']},
72
+
73
+ #
74
+ # multilingual text
75
+ #
76
+ ## 138 MB, 205,568
77
+ {'path': 'CohereForAI/aya_dataset', 'format': lambda n: n['inputs']},
78
+ {'path': 'CohereForAI/aya_dataset', 'format': lambda n: n['targets']},
79
+ [
80
+ # 193 MB, 1,141,967
81
+ {'path': 'xu-song/cc100-samples', 'name': name, 'split': 'train', 'format': lambda n: n['text']}
82
+ for name in [
83
+ 'am', 'ar', 'as', 'az', 'be', 'bg', 'bn', 'bn_rom', 'br',
84
+ 'bs', 'ca', 'cs', 'cy', 'da', 'de', 'el', 'en', 'eo', 'es',
85
+ 'et', 'eu', 'fa', 'ff', 'fi', 'fr', 'fy', 'ga', 'gd', 'gl',
86
+ 'gn', 'gu', 'ha', 'he', 'hi', 'hi_rom', 'hr', 'ht', 'hu',
87
+ 'hy', 'id', 'ig', 'is', 'it', 'ja', 'jv', 'ka', 'kk', 'km',
88
+ 'kn', 'ko', 'ku', 'ky', 'la', 'lg', 'li', 'ln', 'lo', 'lt',
89
+ 'lv', 'mg', 'mk', 'ml', 'mn', 'mr', 'ms', 'my', 'my_zaw',
90
+ 'ne', 'nl', 'no', 'ns', 'om', 'or', 'pa', 'pl', 'ps', 'pt',
91
+ 'qu', 'rm', 'ro', 'ru', 'sa', 'si', 'sc', 'sd', 'sk', 'sl',
92
+ 'so', 'sq', 'sr', 'ss', 'su', 'sv', 'sw', 'ta', 'ta_rom',
93
+ 'te', 'te_rom', 'th', 'tl', 'tn', 'tr', 'ug', 'uk', 'ur',
94
+ 'ur_rom', 'uz', 'vi', 'wo', 'xh', 'yi', 'yo',
95
+ 'zh-Hans', 'zh-Hant', 'zu',
96
+ ]
97
+ ],
98
+ *[
99
+ # ~3 GB, 4,976,850
100
+ # {'path': 'saillab/taco-datasets', 'data_dir': name, 'split': 'train', 'format': '{instruction} {input} {output}'}
101
+ {'path': 'saillab/taco-datasets', 'data_dir': name, 'split': 'train', 'format': lambda n: n['output']}
102
+ for name in [
103
+ # 'multilingual-instruction-tuning-dataset /multilingual-alpaca-52k-gpt-4',
104
+ 'multilingual-instruction-tuning-dataset /multilinugal-dolly-15k',
105
+ ]
106
+ ],
107
+
108
+ #
109
+ # general knowledge
110
+ #
111
+ ## ~17.6 GB, ~6.41M rows
112
+ # [
113
+ # {'path': 'wikimedia/wikipedia', 'name': '20231101.en', 'split': f'train[{i}%:{i + 20}%]', 'format': lambda n: n['text']}
114
+ # for i in range(0, 100, 20)
115
+ # ],
116
+ ## 2.89 GB, 430,000, English September of 2017
117
+ # [
118
+ # {'path': 'jordiclive/wikipedia-summary-dataset', 'split': f'train[{i}%:{i + 20}%]', 'format': lambda n: n['summary']}
119
+ # for i in range(0, 100, 20)
120
+ # ],
121
+ # 65.1 MB, 7,819
122
+ {'path': 'Sketched33/Cities_Wikipedia_Information', 'format': lambda n: n['wikipedia_content']},
123
+
124
+ #
125
+ # misc
126
+ #
127
+ # 472 KB, 5,034
128
+ {'path': 'badrex/llm-emoji-dataset', 'format': '{character} {unicode} {short description} {tags} {LLM description}'},
129
+
130
+ #
131
+ # math
132
+ #
133
+ ## 2.87 GB, 552,000 - images/text - we use only latex text, top 10%
134
+ # {'path': 'OleehyO/latex-formulas', 'data_dir': 'cleaned_formulas', 'split': 'train[:10%]', 'format': lambda n: n['latex_formula']},
135
+ ## 12.2 MB, 500,000
136
+ # {'path': 'fblgit/simple-math', 'revision': 'refs/convert/parquet', 'split': 'train+test', 'format': '{instruction} = {output}'},
137
+ ## 125 MB, 1,000,000
138
+ # {'path': 'Gusarich/math-expressions-1m', 'revision': 'refs/convert/parquet', 'split': 'train', 'format': '{expression} = {result}'},
139
+ ## 3.49 GB, 22,259,474
140
+ # [
141
+ # {'path': 'AtlasUnified/atlas-math-sets', 'split': f'train[{i}%:{i + 20}%]+validation+test', 'format': '{instruction} . {output}'}
142
+ # for i in range(0, 100, 20)
143
+ # ],
144
+ ## 9.05 GB, 2,583,257 - unsafe
145
+ # [
146
+ # {'path': 'gair-prox/open-web-math-pro', 'split': f'train[{i}%:{i + 20}%]', 'format': lambda n: n['text']}
147
+ # for i in range(0, 100, 20)
148
+ # ],
149
+ # # 12.6 GB, 21,972,791 - we use 1M subset - 639 MB, 1,000,000
150
+ # [
151
+ # {'path': 'nvidia/OpenMathInstruct-2', 'split': f'train_1M[{i}%:{i + 20}%]', 'format': '{problem} {generated_solution} {expected_answer}'}
152
+ # for i in range(0, 100, 20)
153
+ # ],
154
+
155
+ #
156
+ # stem
157
+ #
158
+ ## 1.44 GB, 63,357
159
+ # [
160
+ # {'path': 'neuralwork/arxiver', 'split': f'train[{i}%:{i + 20}%]', 'format': lambda n: n['markdown']}
161
+ # for i in range(0, 100, 20)
162
+ # ],
163
+
164
+ #
165
+ # code
166
+ #
167
+ # [
168
+ # # 1.73 GB, 541,041
169
+ # {'path': 'bigcode/the-stack-smol-xl', 'data_dir': f'data/{name}', 'format': lambda n: n['content']}
170
+ # for name in [
171
+ # # 'batchfile' - unsafe
172
+ # # 'powershell' - unsafe
173
+ # 'ada', 'agda', 'alloy', 'antlr', 'applescript', 'assembly',
174
+ # 'augeas', 'awk', 'bison', 'bluespec', 'c',
175
+ # 'c++', 'c-sharp', 'clojure', 'cmake', 'coffeescript', 'common-lisp',
176
+ # 'css', 'cuda', 'dart', 'dockerfile', 'elixir',
177
+ # 'elm', 'emacs-lisp','erlang', 'f-sharp', 'fortran', 'glsl', 'go',
178
+ # 'groovy', 'haskell','html', 'idris', 'isabelle', 'java',
179
+ # 'java-server-pages', 'javascript', 'julia', 'kotlin', 'lean',
180
+ # 'literate-agda', 'literate-coffeescript', 'literate-haskell',
181
+ # 'lua', 'makefile', 'maple', 'markdown', 'mathematica', 'matlab',
182
+ # 'ocaml', 'pascal', 'perl', 'php', 'prolog',
183
+ # 'protocol-buffer', 'python', 'r', 'racket', 'restructuredtext',
184
+ # 'rmarkdown', 'ruby', 'rust', 'sas', 'scala', 'scheme',
185
+ # 'shell', 'smalltalk', 'solidity', 'sparql', 'sql', 'stan',
186
+ # 'standard-ml', 'stata', 'systemverilog', 'tcl', 'tcsh', 'tex',
187
+ # 'thrift', 'typescript', 'verilog', 'vhdl', 'visual-basic', 'xslt',
188
+ # 'yacc', 'zig',
189
+ # ]
190
+ # ],
191
+ ## 7.81 GB, ~2,804,025
192
+ # [
193
+ # {'path': 'rombodawg/code_bagel_hermes-2.5', 'split': f'train[{i}%:{i + 20}%]', 'format': '{input} {output}'}
194
+ # for i in range(0, 100, 20)
195
+ # ],
196
+ ## 6.61 GB, ~2,646,394
197
+ # [
198
+ # {'path': 'rombodawg/code_bagel', 'split': f'train[{i}%:{i + 20}%]', 'format': '{input} {output}'}
199
+ # for i in range(0, 100, 20)
200
+ # ],
201
+ ]
202
+
203
+ outputs = optimize(
204
+ fn=partial(tokenize_fn, tokenizer=Tokenizer('..')),
205
+ inputs=datasets_configs,
206
+ output_dir='../pretrain-data/',
207
+ # Number of tokens to store by chunks. This is roughly 64MB of tokens per chunk.
208
+ chunk_size=(8193 * 2000), # 8192 + 1
209
+ num_workers=32,
210
+ reorder_files=False,
211
+
212
+ # NOTE: this is only available in newver versions of litdata which current version of litgpt does not use
213
+ #
214
+ # This is important to inform LitData that we are encoding contiguous 1D array (tokens).
215
+ # LitData skips storing metadata for each sample e.g all the tokens are concatenated to form one large tensor.
216
+ # item_loader=TokensLoader(block_size=8193),
217
+ )
218
+
219
+ #
220
+ # total number of chunks
221
+ #
222
+ dataset = StreamingDataset(
223
+ input_dir='../pretrain-data/',
224
+ item_loader=TokensLoader(block_size=8193), # 8192 + 1
225
+ )
226
+
227
+ print(len(dataset))
scripts/pretrain-model.yaml ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # https://huggingface.co/meta-llama/Llama-3.2-1B-Instruct/blob/main/config.json
2
+
3
+ # The name of the model to pretrain. Choose from names in ``litgpt.config``. Mutually exclusive with
4
+ # ``model_config``. (type: Optional[str], default: null)
5
+ model_name: "Llama-3.2-1B"
6
+
7
+ # A ``litgpt.Config`` object to define the model architecture. Mutually exclusive with
8
+ # ``model_config``. (type: Optional[Config], default: null)
9
+ model_config:
10
+ padded_vocab_size: 32768
11
+ vocab_size: 32768
12
+ block_size: 131072
13
+ n_layer: 16
14
+ n_head: 32
15
+ head_size: 64
16
+ n_embd: 768
17
+ n_query_groups: 8
18
+ rotary_percentage: 1.0
19
+ parallel_residual: false
20
+ shared_attention_norm: false
21
+ bias: false
22
+ norm_class_name: "RMSNorm"
23
+ mlp_class_name: "LLaMAMLP"
24
+ intermediate_size: 2048
25
+ rope_base: 500000
26
+ rope_adjustments:
27
+ factor: 32.0
28
+ low_freq_factor: 1.0
29
+ high_freq_factor: 4.0
30
+ original_max_seq_len: 8192
31
+
32
+ # Directory in which to save checkpoints and logs. If running in a Lightning Studio Job, look for it in
33
+ # /teamspace/jobs/<job-name>/share. (type: <class 'Path'>, default: out/pretrain)
34
+ out_dir: "../out/pretrain/"
35
+
36
+ # The precision to use for pretraining. Possible choices: "bf16-true", "bf16-mixed", "32-true". (type: Optional[str], default: null)
37
+ # precision: bf16-mixed
38
+ precision: bf16-true
39
+
40
+ # Optional path to a checkpoint directory to initialize the model from.
41
+ # Useful for continued pretraining. Mutually exclusive with ``resume``. (type: Optional[Path], default: null)
42
+ initial_checkpoint_dir:
43
+
44
+ # Path to a checkpoint directory to resume from in case training was interrupted, or ``True`` to resume
45
+ # from the latest checkpoint in ``out_dir``. An error will be raised if no checkpoint is found. Passing
46
+ # ``'auto'`` will resume from the latest checkpoint but not error if no checkpoint exists.
47
+ # (type: Union[bool, Literal["auto"], Path], default: False)
48
+ # resume: false
49
+ resume: "auto"
50
+
51
+ # Data-related arguments. If not provided, the default is ``litgpt.data.TinyLlama``.
52
+ data:
53
+ class_path: LitData
54
+
55
+ init_args:
56
+ data_path: "../pretrain-data/"
57
+ num_workers: 32
58
+
59
+ # Training-related arguments. See ``litgpt.args.TrainArgs`` for details
60
+ train:
61
+ # Number of optimizer steps between saving checkpoints (type: Optional[int], default: 1000)
62
+ save_interval: 500
63
+
64
+ # Number of iterations between logging calls (type: int, default: 1)
65
+ log_interval: 1
66
+
67
+ # Number of samples between optimizer steps across data-parallel ranks (type: int, default: 512)
68
+ global_batch_size: 512
69
+
70
+ # Number of samples per data-parallel rank (type: int, default: 4)
71
+ micro_batch_size: 4
72
+
73
+ # Number of iterations with learning rate warmup active (type: int, default: 2000)
74
+ lr_warmup_steps: 2000
75
+
76
+ # Number of epochs to train on (type: Optional[int], default: null)
77
+ epochs:
78
+
79
+ # Total number of tokens to train on (type: Optional[int], default: 3000000000000)
80
+ # max_tokens: 26141568960 # 319072 * 8193 * 10
81
+ max_tokens: 7842470688 # 319072 * 8193 * 3
82
+ # max_tokens: 5228313792 # 319072 * 8193 * 2
83
+ # max_tokens: 2614156896 # 319072 * 8193 * 1
84
+
85
+ # Limits the number of optimizer steps to run. (type: Optional[int], default: null)
86
+ max_steps:
87
+
88
+ # Limits the length of samples. Off by default (type: Optional[int], default: null)
89
+ # max_seq_length: 8193
90
+
91
+ # Whether to tie the embedding weights with the language modeling head weights. (type: Optional[bool], default: False)
92
+ tie_embeddings: true
93
+
94
+ # (type: Optional[float], default: 1.0)
95
+ max_norm: 1.0
96
+
97
+ # (type: float, default: 4e-05)
98
+ min_lr: 4e-05
99
+
100
+ # Evaluation-related arguments. See ``litgpt.args.EvalArgs`` for details
101
+ eval:
102
+ # Number of optimizer steps between evaluation calls (type: int, default: 1000)
103
+ interval: 100
104
+
105
+ # Number of tokens to generate (type: Optional[int], default: null)
106
+ max_new_tokens:
107
+
108
+ # Number of iterations (type: int, default: 100)
109
+ max_iters: 100
110
+
111
+ # Whether to evaluate on the validation set at the beginning of the training
112
+ initial_validation: false
113
+
114
+ # Whether to evaluate on the validation set at the end the training
115
+ final_validation: true
116
+
117
+ # Optimizer-related arguments
118
+ optimizer:
119
+ # class_path: torch.optim.AdamW
120
+ class_path: grokadamw.GrokAdamW
121
+
122
+ init_args:
123
+ # (type: float, default: 0.001)
124
+ lr: 1e-4
125
+
126
+ # (type: float, default: 0.01)
127
+ weight_decay: 1e-2
128
+
129
+ # (type: tuple, default: (0.9,0.999))
130
+ betas:
131
+ - 0.9
132
+ - 0.999
133
+
134
+ # How many devices/GPUs to use. Uses all GPUs by default. (type: Union[int, str], default: auto)
135
+ devices: auto
136
+
137
+ # How many nodes to use. (type: int, default: 1)
138
+ num_nodes: 1
139
+
140
+ # Optional path to the tokenizer dir that was used for preprocessing the dataset. Only some data
141
+ # module require this. (type: Optional[Path], default: null)
142
+ tokenizer_dir: "../"
143
+
144
+ # The name of the logger to send metrics to. (type: Literal['wandb', 'tensorboard', 'csv'], default: tensorboard)
145
+ logger_name: "wandb"
146
+
147
+ # The random seed to use for reproducibility. (type: int, default: 42)
148
+ seed: 23
scripts/requirements.in ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
2
+ torch>=2.2.0,<=2.4.1
3
+ numpy<2.0
4
+
5
+ tqdm
6
+ datasets
7
+ jinja2
8
+ transformers
9
+ wandb
10
+ # litgpt[all]
11
+ litgpt[all] @ git+https://github.com/Lightning-AI/litgpt.git
12
+ # litgpt @ git+https://github.com/Lightning-AI/litgpt.git
13
+ # litdata
14
+ # litdata @ git+https://github.com/Lightning-AI/litdata.git
15
+ grokadamw
16
+ # bitsandbytes
17
+ # pyzstd
18
+ # zstd
19
+ Pillow
scripts/train_tokenizer.py ADDED
@@ -0,0 +1,388 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gc
2
+
3
+ from datasets import load_dataset
4
+ from transformers import PreTrainedTokenizerFast
5
+ from tokenizers import Tokenizer, normalizers, pre_tokenizers, processors, decoders
6
+ from tokenizers.models import BPE
7
+ from tokenizers.trainers import BpeTrainer
8
+
9
+
10
+ #
11
+ # datasets
12
+ #
13
+ def batch_iterator():
14
+ # code
15
+ dataset = load_dataset('bigcode/programming-languages-keywords', split='train')
16
+
17
+ for row in dataset:
18
+ for n in row['keywords']:
19
+ yield n
20
+
21
+ del dataset
22
+ gc.collect()
23
+
24
+ # code
25
+ dataset = (
26
+ load_dataset('bigcode/the-stack-smol-xs', data_dir=f'data/{name}', split='train', trust_remote_code=True)
27
+ for name in [
28
+ # 'batchfile' - unsafe
29
+ # 'powershell' - unsafe
30
+ 'ada', 'agda', 'alloy', 'antlr', 'applescript', 'assembly',
31
+ 'augeas', 'awk', 'bison', 'bluespec', 'c',
32
+ 'c++', 'c-sharp', 'clojure', 'cmake', 'coffeescript', 'common-lisp',
33
+ 'css', 'cuda', 'dart', 'dockerfile', 'elixir',
34
+ 'elm', 'emacs-lisp','erlang', 'f-sharp', 'fortran', 'glsl', 'go',
35
+ 'groovy', 'haskell','html', 'idris', 'isabelle', 'java',
36
+ 'java-server-pages', 'javascript', 'julia', 'kotlin', 'lean',
37
+ 'literate-agda', 'literate-coffeescript', 'literate-haskell',
38
+ 'lua', 'makefile', 'maple', 'markdown', 'mathematica', 'matlab',
39
+ 'ocaml', 'pascal', 'perl', 'php', 'prolog',
40
+ 'protocol-buffer', 'python', 'r', 'racket', 'restructuredtext',
41
+ 'rmarkdown', 'ruby', 'rust', 'sas', 'scala', 'scheme',
42
+ 'shell', 'smalltalk', 'solidity', 'sparql', 'sql', 'stan',
43
+ 'standard-ml', 'stata', 'systemverilog', 'tcl', 'tcsh', 'tex',
44
+ 'thrift', 'typescript', 'verilog', 'vhdl', 'visual-basic', 'xslt',
45
+ 'yacc', 'zig',
46
+ ]
47
+ )
48
+
49
+ for d in dataset:
50
+ for text in d['content']:
51
+ yield text
52
+
53
+ del dataset
54
+ gc.collect()
55
+
56
+ ## math - unsafe
57
+ # dataset = load_dataset('gair-prox/open-web-math-pro', split='train[:1%]')
58
+ #
59
+ # for text in dataset['text']:
60
+ # yield text
61
+ #
62
+ # del dataset
63
+ # gc.collect()
64
+
65
+ # math
66
+ dataset = load_dataset('OleehyO/latex-formulas', 'cleaned_formulas', split='train[:5%]')
67
+
68
+ for text in dataset['latex_formula']:
69
+ yield text
70
+
71
+ del dataset
72
+ gc.collect()
73
+
74
+ # # text
75
+ # dataset = load_dataset('JeanKaddour/minipile', split='train[:1%]')
76
+ #
77
+ # for text in dataset['text']:
78
+ # yield text
79
+ #
80
+ # del dataset
81
+ # gc.collect()
82
+
83
+ # text
84
+ dataset = (
85
+ load_dataset('saillab/taco-datasets', data_dir=data_dir, split='train[:5%]')
86
+ for data_dir in [
87
+ 'multilingual-instruction-tuning-dataset /multilingual-alpaca-52k-gpt-4',
88
+ 'multilingual-instruction-tuning-dataset /multilinugal-dolly-15k',
89
+ ]
90
+ )
91
+
92
+ for d in dataset:
93
+ for row in d:
94
+ for n in row:
95
+ yield row['instruction'] + '\n' + row['input'] + '\n' + row['output']
96
+
97
+ del dataset
98
+ gc.collect()
99
+
100
+ # text
101
+ dataset = (
102
+ load_dataset('xu-song/cc100-samples', lang, split='train[:5%]')
103
+ for lang in [
104
+ 'en', 'hr', 'sr', 'ru',
105
+ 'am', 'ar', 'as', 'az', 'be', 'bg', 'bn', 'bn_rom', 'br',
106
+ 'bs', 'ca', 'cs', 'cy', 'da', 'de', 'el', 'eo', 'es',
107
+ 'et', 'eu', 'fa', 'ff', 'fi', 'fr', 'fy', 'ga', 'gd', 'gl',
108
+ 'gn', 'gu', 'ha', 'he', 'hi', 'hi_rom', 'ht', 'hu',
109
+ 'hy', 'id', 'ig', 'is', 'it', 'ja', 'jv', 'ka', 'kk', 'km',
110
+ 'kn', 'ko', 'ku', 'ky', 'la', 'lg', 'li', 'ln', 'lo', 'lt',
111
+ 'lv', 'mg', 'mk', 'ml', 'mn', 'mr', 'ms', 'my', 'my_zaw',
112
+ 'ne', 'nl', 'no', 'ns', 'om', 'or', 'pa', 'pl', 'ps', 'pt',
113
+ 'qu', 'rm', 'ro', 'sa', 'si', 'sc', 'sd', 'sk', 'sl',
114
+ 'so', 'sq', 'ss', 'su', 'sv', 'sw', 'ta', 'ta_rom',
115
+ 'te', 'te_rom', 'th', 'tl', 'tn', 'tr', 'ug', 'uk', 'ur',
116
+ 'ur_rom', 'uz', 'vi', 'wo', 'xh', 'yi', 'yo',
117
+ 'zh-Hans', 'zh-Hant', 'zu',
118
+ ]
119
+ )
120
+
121
+ for d in dataset:
122
+ for text in d['text']:
123
+ yield text
124
+
125
+ del dataset
126
+ gc.collect()
127
+
128
+
129
+ #
130
+ # special_tokens
131
+ #
132
+ special_tokens = [
133
+ '<unk>',
134
+ '<|begin_of_text|>',
135
+ '<|end_of_text|>',
136
+ '<|start_header_id|>',
137
+ '<|end_header_id|>',
138
+ '<|eom_id|>',
139
+ '<|eot_id|>',
140
+ 'system',
141
+ 'user',
142
+ 'assistant',
143
+ 'tool',
144
+ 'agent',
145
+ 'internal', # thinking
146
+
147
+ # tool/function calling
148
+ '<tools>',
149
+ '</tools>',
150
+ '<tool>',
151
+ '</tool>',
152
+ '<tool_call>',
153
+ '</tool_call>',
154
+ '<tool_response>',
155
+ '</tool_response>',
156
+ '"name"',
157
+ '"arguments"',
158
+
159
+ #
160
+ # JSON Schema
161
+ #
162
+ # General Metadata Keywords
163
+ '"$schema"',
164
+ '"$id"',
165
+ '"$ref"',
166
+ '"$defs"',
167
+ '"$anchor"',
168
+ '"$dynamicAnchor"',
169
+ '"$dynamicRef"',
170
+ '"$vocabulary"',
171
+ '"$comment"',
172
+ # Data Types
173
+ '"null"',
174
+ '"boolean"',
175
+ '"object"',
176
+ '"array"',
177
+ '"number"',
178
+ '"string"',
179
+ '"integer"',
180
+ # Validation Keywords
181
+ '"type"',
182
+ '"enum"',
183
+ '"const"',
184
+ '"multipleOf"',
185
+ '"maximum"',
186
+ '"exclusiveMaximum"',
187
+ '"minimum"',
188
+ '"exclusiveMinimum"',
189
+ '"maxLength"',
190
+ '"minLength"',
191
+ '"pattern"',
192
+ '"additionalItems"',
193
+ '"items"',
194
+ '"prefixItems"',
195
+ '"contains"',
196
+ '"maxItems"',
197
+ '"minItems"',
198
+ '"uniqueItems"',
199
+ '"maxProperties"',
200
+ '"minProperties"',
201
+ '"required"',
202
+ '"properties"',
203
+ '"patternProperties"',
204
+ '"additionalProperties"',
205
+ '"dependentRequired"',
206
+ '"dependentSchemas"',
207
+ '"propertyNames"',
208
+ # Conditional Keywords
209
+ '"if"',
210
+ '"then"',
211
+ '"else"',
212
+ '"allOf"',
213
+ '"anyOf"',
214
+ '"oneOf"',
215
+ '"not"',
216
+ # Additional Keywords for Evaluation Control
217
+ '"unevaluatedItems"',
218
+ '"unevaluatedProperties"',
219
+ # Informational Keywords
220
+ '"title"',
221
+ '"description"',
222
+ '"default"',
223
+ '"deprecated"',
224
+ '"readOnly"',
225
+ '"writeOnly"',
226
+ '"examples"',
227
+ # Content-Related Keywords
228
+ '"contentEncoding"',
229
+ '"contentMediaType"',
230
+ '"contentSchema"',
231
+ # Additional Keywords
232
+ '"next"', # Typically used in reference to linked or next items
233
+ '"value"', # Represents the value of a property or item
234
+
235
+ # misc
236
+ '<input>',
237
+ '</input>',
238
+ '<output>',
239
+ '</output>',
240
+ '<query>',
241
+ '</query>',
242
+ '<key>',
243
+ '</key>',
244
+ '<value>',
245
+ '</value>',
246
+ '<text>',
247
+ '</text>',
248
+ '<code>',
249
+ '</code>',
250
+ '<image>',
251
+ '</image>',
252
+ '<file>',
253
+ '</file>',
254
+
255
+ # qa
256
+ '<question>',
257
+ '</question>',
258
+ '<answer>',
259
+ '</answer>',
260
+
261
+ # thought
262
+ '<thought>',
263
+ '</thought>',
264
+ '<plan>',
265
+ '</plan>',
266
+ '<vote>',
267
+ '</vote>',
268
+ '<passage>',
269
+ '</passage>',
270
+
271
+ # reasoning
272
+ '<reasoning>',
273
+ '</reasoning>',
274
+ '<acting>',
275
+ '</acting>',
276
+ '<action>',
277
+ '</action>',
278
+ '<observation>',
279
+ '</observation>',
280
+ '<claim>',
281
+ '</claim>',
282
+
283
+ # reflection
284
+ '<thinking>',
285
+ '</thinking>',
286
+ '<reflection>',
287
+ '</reflection>',
288
+ '<step>',
289
+ '</step>',
290
+
291
+ # graph
292
+ '<graph>',
293
+ '</graph>',
294
+ '<edge>',
295
+ '</edge>',
296
+ '<source>',
297
+ '</source>',
298
+ '<destination>',
299
+ '</destination>',
300
+ '<relation>',
301
+ '</relation>',
302
+ # '<value>',
303
+ # '</value>',
304
+ ]
305
+
306
+ for i in range(2, 25):
307
+ special_tokens.append(' ' * i)
308
+
309
+ for i in range(2, 25):
310
+ special_tokens.append('\t' * i)
311
+
312
+ for i in range(2, 25):
313
+ special_tokens.append('\n' * i)
314
+
315
+ for i in range(2, 25):
316
+ special_tokens.append('\r' * i)
317
+
318
+ for i in range(2, 25):
319
+ special_tokens.append('\r\n' * i)
320
+
321
+ for i in range(256):
322
+ special_tokens.append(f'<0x{i:02X}>')
323
+
324
+ for i in range(256):
325
+ special_tokens.append(f'<|reserved_special_token_{i}|>')
326
+
327
+
328
+ #
329
+ # train tokenizer
330
+ #
331
+ bpe = BPE(unk_token='<unk>', fuse_unk=True, byte_fallback=True)
332
+ tokenizer = Tokenizer(bpe)
333
+
334
+ tokenizer.normalizer = normalizers.Sequence([
335
+ normalizers.Prepend('▁'),
336
+ normalizers.Replace(' ', '▁'),
337
+ ])
338
+
339
+ tokenizer.pre_tokenizer = None
340
+
341
+ tokenizer.post_processor = processors.TemplateProcessing(
342
+ single='$A:0', # $A represents the token, :0 specifies the type ID for single sequences
343
+ pair='$A:0 $B:1', # For pairs, we specify type IDs for both tokens
344
+ special_tokens=[],
345
+ )
346
+
347
+ tokenizer.decoder = decoders.Sequence([
348
+ decoders.Replace('▁', ' '),
349
+ decoders.ByteFallback(),
350
+ decoders.Fuse(),
351
+ decoders.Strip(' ', 1, 0),
352
+ ])
353
+
354
+ trainer = BpeTrainer(
355
+ vocab_size=32768, # 32 * 1024
356
+ min_frequency=10,
357
+ special_tokens=special_tokens,
358
+ max_token_length=8,
359
+ )
360
+
361
+ tokenizer.train_from_iterator(batch_iterator(), trainer)
362
+ tokenizer.save('../tokenizer.json')
363
+ tokenizer.model.save('../')
364
+
365
+ CHAT_TEMPLATE = (
366
+ "{{ bos_token }}"
367
+
368
+ "{% for message in messages %}"
369
+ "{{'<|start_header_id|>' + message['role'] + '<|end_header_id|>' + message['content'] + '<|eot_id|>'}}"
370
+ "{% endfor %}"
371
+
372
+ "{% if add_generation_prompt %}"
373
+ "{{ '<|start_header_id|>assistant<|end_header_id|>' }}"
374
+ "{% else %}"
375
+ "{{ eos_token }}"
376
+ "{% endif %}"
377
+ )
378
+
379
+ fast_tokenizer = PreTrainedTokenizerFast(
380
+ tokenizer_object=tokenizer,
381
+ chat_template=CHAT_TEMPLATE,
382
+ bos_token='<|begin_of_text|>',
383
+ eos_token='<|end_of_text|>',
384
+ unk_token='<unk>',
385
+ clean_up_tokenization_spaces=True,
386
+ )
387
+
388
+ fast_tokenizer.save_pretrained('../')