DedeProGames commited on
Commit
c4b521b
·
verified ·
1 Parent(s): 9aec1c3

Add SFT weights, tokenizer, chat template and training metadata

Browse files
chat_template.jinja ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {{ bos_token }}{% for message in messages %}{% if message['role'] == 'assistant' %}<|assistant|>
2
+ {{ message['content'] }}{{ eos_token }}
3
+ {% elif message['role'] == 'system' %}<|system|>
4
+ {{ message['content'] }}
5
+ {% elif message['role'] == 'user' %}<|user|>
6
+ {{ message['content'] }}
7
+ {% else %}<|{{ message['role'] }}|>
8
+ {{ message['content'] }}
9
+ {% endif %}{% endfor %}{% if add_generation_prompt %}<|assistant|>
10
+ {% endif %}
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.5.3",
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,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token_id": 0,
3
+ "eos_token_id": 0,
4
+ "pad_token_id": 1,
5
+ "do_sample": false,
6
+ "repetition_penalty": 1.1,
7
+ "max_new_tokens": 192,
8
+ "transformers_version": "5.7.0"
9
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:73a9383016155db0ee509cd9811ea7a16e4e45f6109fbfadfb9e2ca7f4e88a4d
3
+ size 35548464
modeling_dynamicmind.py ADDED
@@ -0,0 +1,204 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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, attention_mask=None, **kwargs):
202
+ # Accepted so stock generate() validation passes; causality comes from
203
+ # is_causal=True and generation is unpadded batch-size 1.
204
+ return {"input_ids": input_ids, "attention_mask": attention_mask}
sft_metadata.json ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "base_model": "DedeProGames/DynamicMind-Mini",
3
+ "dataset": "HuggingFaceTB/smol-smoltalk",
4
+ "dataset_config": "default",
5
+ "dataset_split": "train",
6
+ "training_type": "full_parameter_supervised_finetuning",
7
+ "loss_mask": "assistant_content_and_eos_only",
8
+ "global_step": 3440,
9
+ "tokens_seen": 507248640,
10
+ "supervised_tokens_seen": 361226420,
11
+ "sequence_length": 1024,
12
+ "effective_batch_sequences": 144,
13
+ "tokens_per_step": 147456,
14
+ "peak_learning_rate": 0.0002,
15
+ "warmup_steps": 100,
16
+ "lr_schedule": "constant_after_warmup",
17
+ "optimizer": "AdamW",
18
+ "betas": [
19
+ 0.9,
20
+ 0.95
21
+ ],
22
+ "weight_decay": 0.1,
23
+ "grad_clip": 1.0,
24
+ "seed": 1337,
25
+ "final_loss": 1.917157530784607,
26
+ "recipe_source": "BananaMind/BananaMind-2-Nano-Chat (adapted to 1024-token context)"
27
+ }
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backend": "tokenizers",
3
+ "bos_token": "<|endoftext|>",
4
+ "eos_token": "<|endoftext|>",
5
+ "pad_token": "<|pad|>",
6
+ "unk_token": "<|unk|>",
7
+ "model_max_length": 1024,
8
+ "tokenizer_class": "TokenizersBackend"
9
+ }