Safetensors
dynamicmind
custom_code
DedeProGames commited on
Commit
9570dce
·
verified ·
1 Parent(s): ed30fe2

Rename MiniBananaMind-v4-9M -> DynamicMind-Mini

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ banner.png filter=lfs diff=lfs merge=lfs -text
config.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "DynamicMindForCausalLM"
4
+ ],
5
+ "attention_dropout": 0.0,
6
+ "auto_map": {
7
+ "AutoConfig": "configuration_dynamicmind.DynamicMindConfig",
8
+ "AutoModelForCausalLM": "modeling_dynamicmind.DynamicMindForCausalLM"
9
+ },
10
+ "bos_token_id": 0,
11
+ "dtype": "float32",
12
+ "eos_token_id": 0,
13
+ "hidden_size": 256,
14
+ "intermediate_size": 768,
15
+ "max_position_embeddings": 1024,
16
+ "model_type": "dynamicmind",
17
+ "num_attention_heads": 8,
18
+ "num_hidden_layers": 9,
19
+ "num_key_value_heads": 2,
20
+ "pad_token_id": 1,
21
+ "rms_norm_eps": 1e-05,
22
+ "rope_theta": 10000.0,
23
+ "tie_word_embeddings": true,
24
+ "transformers_version": "5.7.0",
25
+ "vocab_size": 8192
26
+ }
configuration_dynamicmind.py ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from transformers.configuration_utils import PretrainedConfig
2
+
3
+
4
+ class DynamicMindConfig(PretrainedConfig):
5
+ model_type = "dynamicmind"
6
+
7
+ def __init__(
8
+ self,
9
+ vocab_size=8192,
10
+ hidden_size=256,
11
+ intermediate_size=768,
12
+ num_hidden_layers=9,
13
+ num_attention_heads=8,
14
+ num_key_value_heads=2,
15
+ max_position_embeddings=1024,
16
+ rms_norm_eps=1e-5,
17
+ rope_theta=10000.0,
18
+ attention_dropout=0.0,
19
+ tie_word_embeddings=True,
20
+ bos_token_id=0,
21
+ eos_token_id=0,
22
+ pad_token_id=1,
23
+ **kwargs,
24
+ ):
25
+ super().__init__(
26
+ bos_token_id=bos_token_id,
27
+ eos_token_id=eos_token_id,
28
+ pad_token_id=pad_token_id,
29
+ tie_word_embeddings=tie_word_embeddings,
30
+ **kwargs,
31
+ )
32
+
33
+ self.vocab_size = vocab_size
34
+ self.hidden_size = hidden_size
35
+ self.intermediate_size = intermediate_size
36
+ self.num_hidden_layers = num_hidden_layers
37
+ self.num_attention_heads = num_attention_heads
38
+ self.num_key_value_heads = num_key_value_heads
39
+ self.max_position_embeddings = max_position_embeddings
40
+ self.rms_norm_eps = rms_norm_eps
41
+ self.rope_theta = rope_theta
42
+ self.attention_dropout = attention_dropout
generation_config.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token_id": 0,
3
+ "do_sample": true,
4
+ "eos_token_id": 0,
5
+ "max_new_tokens": 128,
6
+ "pad_token_id": 1,
7
+ "temperature": 0.8,
8
+ "top_p": 0.95,
9
+ "transformers_version": "5.7.0"
10
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:56083df89fa4bed9bab730877c3af47eb9ba584f33a0de929a0c934059b44607
3
+ size 35548464
modeling_dynamicmind.py ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import math
2
+ import torch
3
+ import torch.nn as nn
4
+ import torch.nn.functional as F
5
+
6
+ from transformers.modeling_utils import PreTrainedModel
7
+ from transformers.generation import GenerationMixin
8
+ from transformers.modeling_outputs import CausalLMOutput
9
+ from .configuration_dynamicmind import DynamicMindConfig
10
+
11
+
12
+ class DynamicMindRMSNorm(nn.Module):
13
+ def __init__(self, hidden_size, eps=1e-5):
14
+ super().__init__()
15
+ self.weight = nn.Parameter(torch.ones(hidden_size))
16
+ self.eps = eps
17
+
18
+ def forward(self, x):
19
+ dtype = x.dtype
20
+ x = x.float()
21
+ var = x.pow(2).mean(dim=-1, keepdim=True)
22
+ x = x * torch.rsqrt(var + self.eps)
23
+ return (self.weight * x).to(dtype)
24
+
25
+
26
+ def apply_rope(q, k, rope_theta):
27
+ # q: [B, H, T, D], k: [B, KVH, T, D]
28
+ device = q.device
29
+ dtype = q.dtype
30
+ seq_len = q.size(-2)
31
+ head_dim = q.size(-1)
32
+
33
+ inv_freq = 1.0 / (
34
+ rope_theta ** (torch.arange(0, head_dim, 2, device=device).float() / head_dim)
35
+ )
36
+ t = torch.arange(seq_len, device=device).float()
37
+ freqs = torch.outer(t, inv_freq)
38
+
39
+ cos = freqs.cos()[None, None, :, :].to(dtype)
40
+ sin = freqs.sin()[None, None, :, :].to(dtype)
41
+
42
+ def rotate(x):
43
+ x_even = x[..., 0::2]
44
+ x_odd = x[..., 1::2]
45
+ x_rot_even = x_even * cos - x_odd * sin
46
+ x_rot_odd = x_even * sin + x_odd * cos
47
+ return torch.stack((x_rot_even, x_rot_odd), dim=-1).flatten(-2)
48
+
49
+ return rotate(q), rotate(k)
50
+
51
+
52
+ class DynamicMindAttention(nn.Module):
53
+ def __init__(self, config):
54
+ super().__init__()
55
+
56
+ self.hidden_size = config.hidden_size
57
+ self.num_heads = config.num_attention_heads
58
+ self.num_kv_heads = config.num_key_value_heads
59
+ self.head_dim = config.hidden_size // config.num_attention_heads
60
+ self.rope_theta = config.rope_theta
61
+ self.attention_dropout = config.attention_dropout
62
+
63
+ assert self.hidden_size % self.num_heads == 0
64
+ assert self.num_heads % self.num_kv_heads == 0
65
+
66
+ self.q_proj = nn.Linear(config.hidden_size, self.num_heads * self.head_dim, bias=False)
67
+ self.k_proj = nn.Linear(config.hidden_size, self.num_kv_heads * self.head_dim, bias=False)
68
+ self.v_proj = nn.Linear(config.hidden_size, self.num_kv_heads * self.head_dim, bias=False)
69
+ self.o_proj = nn.Linear(config.hidden_size, config.hidden_size, bias=False)
70
+
71
+ def forward(self, x):
72
+ bsz, seq_len, _ = x.shape
73
+
74
+ q = self.q_proj(x).view(bsz, seq_len, self.num_heads, self.head_dim).transpose(1, 2)
75
+ k = self.k_proj(x).view(bsz, seq_len, self.num_kv_heads, self.head_dim).transpose(1, 2)
76
+ v = self.v_proj(x).view(bsz, seq_len, self.num_kv_heads, self.head_dim).transpose(1, 2)
77
+
78
+ q, k = apply_rope(q, k, self.rope_theta)
79
+
80
+ if self.num_kv_heads != self.num_heads:
81
+ repeats = self.num_heads // self.num_kv_heads
82
+ k = k.repeat_interleave(repeats, dim=1)
83
+ v = v.repeat_interleave(repeats, dim=1)
84
+
85
+ y = F.scaled_dot_product_attention(
86
+ q,
87
+ k,
88
+ v,
89
+ attn_mask=None,
90
+ dropout_p=self.attention_dropout if self.training else 0.0,
91
+ is_causal=True,
92
+ )
93
+
94
+ y = y.transpose(1, 2).contiguous().view(bsz, seq_len, self.hidden_size)
95
+ return self.o_proj(y)
96
+
97
+
98
+ class DynamicMindMLP(nn.Module):
99
+ def __init__(self, config):
100
+ super().__init__()
101
+ self.gate_proj = nn.Linear(config.hidden_size, config.intermediate_size, bias=False)
102
+ self.up_proj = nn.Linear(config.hidden_size, config.intermediate_size, bias=False)
103
+ self.down_proj = nn.Linear(config.intermediate_size, config.hidden_size, bias=False)
104
+
105
+ def forward(self, x):
106
+ return self.down_proj(F.silu(self.gate_proj(x)) * self.up_proj(x))
107
+
108
+
109
+ class DynamicMindBlock(nn.Module):
110
+ def __init__(self, config):
111
+ super().__init__()
112
+ self.input_layernorm = DynamicMindRMSNorm(config.hidden_size, config.rms_norm_eps)
113
+ self.self_attn = DynamicMindAttention(config)
114
+ self.post_attention_layernorm = DynamicMindRMSNorm(config.hidden_size, config.rms_norm_eps)
115
+ self.mlp = DynamicMindMLP(config)
116
+
117
+ def forward(self, x):
118
+ x = x + self.self_attn(self.input_layernorm(x))
119
+ x = x + self.mlp(self.post_attention_layernorm(x))
120
+ return x
121
+
122
+
123
+ class DynamicMindPreTrainedModel(PreTrainedModel):
124
+ config_class = DynamicMindConfig
125
+ base_model_prefix = "model"
126
+ supports_gradient_checkpointing = False
127
+ _no_split_modules = ["DynamicMindBlock"]
128
+
129
+ def _init_weights(self, module):
130
+ std = 0.02
131
+ if isinstance(module, nn.Linear):
132
+ nn.init.normal_(module.weight, mean=0.0, std=std)
133
+ if module.bias is not None:
134
+ nn.init.zeros_(module.bias)
135
+ elif isinstance(module, nn.Embedding):
136
+ nn.init.normal_(module.weight, mean=0.0, std=std)
137
+
138
+
139
+ class DynamicMindForCausalLM(DynamicMindPreTrainedModel, GenerationMixin):
140
+ _tied_weights_keys = {"lm_head.weight": "embed_tokens.weight"}
141
+ _keys_to_ignore_on_load_missing = [r"lm_head.weight"]
142
+ def __init__(self, config):
143
+ super().__init__(config)
144
+
145
+ self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size)
146
+ self.layers = nn.ModuleList([DynamicMindBlock(config) for _ in range(config.num_hidden_layers)])
147
+ self.norm = DynamicMindRMSNorm(config.hidden_size, config.rms_norm_eps)
148
+ self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False)
149
+
150
+ if config.tie_word_embeddings:
151
+ self.lm_head.weight = self.embed_tokens.weight
152
+
153
+ self.post_init()
154
+
155
+ def tie_weights(self, *args, **kwargs):
156
+ if getattr(self.config, "tie_word_embeddings", True):
157
+ self.lm_head.weight = self.embed_tokens.weight
158
+
159
+ def get_input_embeddings(self):
160
+ return self.embed_tokens
161
+
162
+ def set_input_embeddings(self, value):
163
+ self.embed_tokens = value
164
+
165
+ def get_output_embeddings(self):
166
+ return self.lm_head
167
+
168
+ def set_output_embeddings(self, value):
169
+ self.lm_head = value
170
+
171
+ def forward(self, input_ids=None, labels=None, **kwargs):
172
+ x = self.embed_tokens(input_ids)
173
+
174
+ for layer in self.layers:
175
+ x = layer(x)
176
+
177
+ x = self.norm(x)
178
+ logits = self.lm_head(x)
179
+
180
+ loss = None
181
+ if labels is not None:
182
+ shift_logits = logits[:, :-1, :].contiguous()
183
+ shift_labels = labels[:, 1:].contiguous()
184
+ loss = F.cross_entropy(
185
+ shift_logits.view(-1, shift_logits.size(-1)),
186
+ shift_labels.view(-1),
187
+ )
188
+
189
+ return CausalLMOutput(loss=loss, logits=logits)
190
+
191
+ def state_dict(self, *args, **kwargs):
192
+ sd = super().state_dict(*args, **kwargs)
193
+ # lm_head.weight is tied to embed_tokens.weight. Safetensors cannot store
194
+ # duplicate shared tensors unless one key is removed.
195
+ if getattr(self.config, "tie_word_embeddings", True):
196
+ for k in list(sd.keys()):
197
+ if k == "lm_head.weight" or k.endswith(".lm_head.weight"):
198
+ del sd[k]
199
+ return sd
200
+
201
+ def prepare_inputs_for_generation(self, input_ids, **kwargs):
202
+ return {"input_ids": input_ids}
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backend": "tokenizers",
3
+ "bos_token": "<|endoftext|>",
4
+ "eos_token": "<|endoftext|>",
5
+ "is_local": true,
6
+ "local_files_only": false,
7
+ "model_max_length": 1024,
8
+ "pad_token": "<|pad|>",
9
+ "tokenizer_class": "TokenizersBackend",
10
+ "unk_token": "<|unk|>"
11
+ }
train_args.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "data": "cosmopedia_v2_3B_8k_digits.uint16.bin",
3
+ "base": "DynamicMind-Mini",
4
+ "revision": "",
5
+ "tokenizer": "",
6
+ "out": "checkpoints/DynamicMind-v3-9M-CosmopediaV2-3B-1024",
7
+ "seq_len": 1024,
8
+ "batch_size": 72,
9
+ "grad_accum": 16,
10
+ "max_steps": 2613,
11
+ "lr": 0.0001,
12
+ "min_lr": 1e-05,
13
+ "warmup_steps": 200,
14
+ "weight_decay": 0.1,
15
+ "grad_clip": 1.0,
16
+ "val_tokens": 5000000,
17
+ "eval_every": 250,
18
+ "eval_batches": 50,
19
+ "save_every": 250,
20
+ "device": "cuda",
21
+ "dtype": "auto",
22
+ "compile": true,
23
+ "compile_mode": "default",
24
+ "seed": 1337,
25
+ "resume": ""
26
+ }