deqing commited on
Commit
d020a3f
·
verified ·
1 Parent(s): 8963f26

Model save

Browse files
README.md ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ library_name: transformers
3
+ tags:
4
+ - generated_from_trainer
5
+ model-index:
6
+ - name: lstm-resnet-12layer-v5
7
+ results: []
8
+ ---
9
+
10
+ <!-- This model card has been generated automatically according to the information the Trainer had access to. You
11
+ should probably proofread and complete it, then remove this comment. -->
12
+
13
+ # lstm-resnet-12layer-v5
14
+
15
+ This model is a fine-tuned version of [](https://huggingface.co/) on an unknown dataset.
16
+ It achieves the following results on the evaluation set:
17
+ - Loss: 5.1418
18
+ - Num Input Tokens Seen: 9437184000
19
+
20
+ ## Model description
21
+
22
+ More information needed
23
+
24
+ ## Intended uses & limitations
25
+
26
+ More information needed
27
+
28
+ ## Training and evaluation data
29
+
30
+ More information needed
31
+
32
+ ## Training procedure
33
+
34
+ ### Training hyperparameters
35
+
36
+ The following hyperparameters were used during training:
37
+ - learning_rate: 0.001
38
+ - train_batch_size: 16
39
+ - eval_batch_size: 16
40
+ - seed: 42
41
+ - distributed_type: multi-GPU
42
+ - num_devices: 2
43
+ - gradient_accumulation_steps: 16
44
+ - total_train_batch_size: 512
45
+ - total_eval_batch_size: 32
46
+ - optimizer: Use OptimizerNames.ADAMW_TORCH_FUSED with betas=(0.9,0.95) and epsilon=1e-08 and optimizer_args=No additional optimizer arguments
47
+ - lr_scheduler_type: cosine
48
+ - lr_scheduler_warmup_steps: 500
49
+ - num_epochs: 1
50
+
51
+ ### Training results
52
+
53
+
54
+
55
+ ### Framework versions
56
+
57
+ - Transformers 5.3.0
58
+ - Pytorch 2.10.0+cu128
59
+ - Datasets 4.7.0
60
+ - Tokenizers 0.22.2
final_model/config.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "LSTMResnetForCausalLM"
4
+ ],
5
+ "auto_map": {
6
+ "AutoConfig": "lstm.LSTMResnetLanguageModelConfig",
7
+ "AutoModelForCausalLM": "lstm.LSTMResnetForCausalLM"
8
+ },
9
+ "bos_token_id": 128000,
10
+ "dropout": 0.1,
11
+ "dtype": "float32",
12
+ "embed_dim": 1024,
13
+ "eos_token_id": 128001,
14
+ "hidden_size": 1024,
15
+ "model_type": "lstm_resnet",
16
+ "num_layers": 12,
17
+ "tie_word_embeddings": true,
18
+ "transformers_version": "5.3.0",
19
+ "use_cache": false,
20
+ "vocab_size": 128256
21
+ }
final_model/lstm.py ADDED
@@ -0,0 +1,267 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ LSTM language model compatible with HuggingFace Trainer and AutoModelForCausalLM.
3
+
4
+ Designed to be a drop-in replacement for LlamaForCausalLM in the Fourier
5
+ emergence experiments: same tokenizer, same data pipeline, same analysis code.
6
+ """
7
+
8
+ import torch
9
+ import torch.nn as nn
10
+ from dataclasses import dataclass, field
11
+ from typing import Optional, Tuple
12
+
13
+ from transformers import PretrainedConfig, PreTrainedModel
14
+ from transformers.modeling_outputs import CausalLMOutput
15
+
16
+
17
+ # ── Config ─────────────────────────────────────────────────────────
18
+
19
+
20
+ class LSTMLanguageModelConfig(PretrainedConfig):
21
+ model_type = "lstm_lm"
22
+
23
+ def __init__(
24
+ self,
25
+ vocab_size: int = 128256,
26
+ embed_dim: int = 1024,
27
+ hidden_size: int = 1024,
28
+ num_layers: int = 2,
29
+ dropout: float = 0.1,
30
+ tie_word_embeddings: bool = True,
31
+ **kwargs,
32
+ ):
33
+ super().__init__(**kwargs)
34
+ self.vocab_size = vocab_size
35
+ self.embed_dim = embed_dim
36
+ self.hidden_size = hidden_size
37
+ self.num_layers = num_layers
38
+ self.dropout = dropout
39
+ self.tie_word_embeddings = tie_word_embeddings
40
+
41
+
42
+ # ── Model ──────────────────────────────────────────────────────────
43
+
44
+
45
+ class LSTMForCausalLM(PreTrainedModel):
46
+ config_class = LSTMLanguageModelConfig
47
+ _tied_weights_keys = {"lm_head.weight": "embed_tokens.weight"}
48
+
49
+ def __init__(self, config: LSTMLanguageModelConfig):
50
+ super().__init__(config)
51
+ self.config = config
52
+
53
+ self.embed_tokens = nn.Embedding(config.vocab_size, config.embed_dim)
54
+ self.lstm = nn.LSTM(
55
+ input_size=config.embed_dim,
56
+ hidden_size=config.hidden_size,
57
+ num_layers=config.num_layers,
58
+ batch_first=True,
59
+ dropout=config.dropout if config.num_layers > 1 else 0.0,
60
+ )
61
+ self.drop = nn.Dropout(config.dropout)
62
+ self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False)
63
+
64
+ if config.tie_word_embeddings:
65
+ if config.embed_dim == config.hidden_size:
66
+ self.lm_head.weight = self.embed_tokens.weight
67
+ # If dims don't match, silently skip tying (projection needed)
68
+
69
+ self.post_init()
70
+
71
+ def get_input_embeddings(self) -> nn.Embedding:
72
+ return self.embed_tokens
73
+
74
+ def set_input_embeddings(self, value: nn.Embedding):
75
+ self.embed_tokens = value
76
+
77
+ def get_output_embeddings(self) -> nn.Linear:
78
+ return self.lm_head
79
+
80
+ def set_output_embeddings(self, new_embeddings: nn.Linear):
81
+ self.lm_head = new_embeddings
82
+
83
+ def forward(
84
+ self,
85
+ input_ids: torch.LongTensor,
86
+ attention_mask: Optional[torch.Tensor] = None,
87
+ labels: Optional[torch.LongTensor] = None,
88
+ output_hidden_states: Optional[bool] = None,
89
+ return_dict: Optional[bool] = None,
90
+ ) -> CausalLMOutput:
91
+ return_dict = return_dict if return_dict is not None else self.config.use_return_dict
92
+
93
+ embeds = self.embed_tokens(input_ids)
94
+ embeds = self.drop(embeds)
95
+
96
+ lstm_out, _ = self.lstm(embeds)
97
+ lstm_out = self.drop(lstm_out)
98
+
99
+ logits = self.lm_head(lstm_out)
100
+
101
+ loss = None
102
+ if labels is not None:
103
+ shift_logits = logits[..., :-1, :].contiguous()
104
+ shift_labels = labels[..., 1:].contiguous()
105
+ loss = nn.functional.cross_entropy(
106
+ shift_logits.view(-1, self.config.vocab_size),
107
+ shift_labels.view(-1),
108
+ ignore_index=-100,
109
+ )
110
+
111
+ hidden_states = None
112
+ if output_hidden_states:
113
+ # Return embedding + lstm output for compatibility with analysis
114
+ hidden_states = (embeds, lstm_out)
115
+
116
+ return CausalLMOutput(
117
+ loss=loss,
118
+ logits=logits,
119
+ hidden_states=hidden_states,
120
+ )
121
+
122
+
123
+ # ── Residual LSTM (pre-norm, per-layer skip) ──────────────────────
124
+
125
+
126
+ class LSTMResnetLanguageModelConfig(PretrainedConfig):
127
+ """Same fields as :class:`LSTMLanguageModelConfig` but a distinct model_type
128
+ so AutoModel resolves to the residual variant."""
129
+ model_type = "lstm_resnet"
130
+
131
+ def __init__(
132
+ self,
133
+ vocab_size: int = 128256,
134
+ embed_dim: int = 1024,
135
+ hidden_size: int = 1024,
136
+ num_layers: int = 2,
137
+ dropout: float = 0.1,
138
+ tie_word_embeddings: bool = True,
139
+ **kwargs,
140
+ ):
141
+ super().__init__(**kwargs)
142
+ self.vocab_size = vocab_size
143
+ self.embed_dim = embed_dim
144
+ self.hidden_size = hidden_size
145
+ self.num_layers = num_layers
146
+ self.dropout = dropout
147
+ self.tie_word_embeddings = tie_word_embeddings
148
+
149
+
150
+ class LSTMResnetForCausalLM(PreTrainedModel):
151
+ """12-layer (or any depth) LSTM with pre-norm residual connections
152
+ around each layer — i.e. a Transformer-block layout where the
153
+ attention sub-block is replaced by a single-layer LSTM.
154
+ """
155
+
156
+ config_class = LSTMResnetLanguageModelConfig
157
+ _tied_weights_keys = {"lm_head.weight": "embed_tokens.weight"}
158
+
159
+ def __init__(self, config: LSTMResnetLanguageModelConfig):
160
+ super().__init__(config)
161
+ self.config = config
162
+
163
+ self.embed_tokens = nn.Embedding(config.vocab_size, config.embed_dim)
164
+ self.embed_drop = nn.Dropout(config.dropout)
165
+ self.in_proj = (
166
+ nn.Linear(config.embed_dim, config.hidden_size, bias=False)
167
+ if config.embed_dim != config.hidden_size
168
+ else nn.Identity()
169
+ )
170
+
171
+ self.layers = nn.ModuleList(
172
+ [
173
+ nn.LSTM(
174
+ input_size=config.hidden_size,
175
+ hidden_size=config.hidden_size,
176
+ num_layers=1,
177
+ batch_first=True,
178
+ )
179
+ for _ in range(config.num_layers)
180
+ ]
181
+ )
182
+ self.norms = nn.ModuleList(
183
+ [nn.LayerNorm(config.hidden_size) for _ in range(config.num_layers)]
184
+ )
185
+ self.drops = nn.ModuleList(
186
+ [nn.Dropout(config.dropout) for _ in range(config.num_layers)]
187
+ )
188
+ self.final_norm = nn.LayerNorm(config.hidden_size)
189
+
190
+ self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False)
191
+ if (
192
+ config.tie_word_embeddings
193
+ and config.embed_dim == config.hidden_size
194
+ ):
195
+ self.lm_head.weight = self.embed_tokens.weight
196
+
197
+ self.post_init()
198
+
199
+ def get_input_embeddings(self) -> nn.Embedding:
200
+ return self.embed_tokens
201
+
202
+ def set_input_embeddings(self, value: nn.Embedding):
203
+ self.embed_tokens = value
204
+
205
+ def get_output_embeddings(self) -> nn.Linear:
206
+ return self.lm_head
207
+
208
+ def set_output_embeddings(self, new_embeddings: nn.Linear):
209
+ self.lm_head = new_embeddings
210
+
211
+ def forward(
212
+ self,
213
+ input_ids: torch.LongTensor,
214
+ attention_mask: Optional[torch.Tensor] = None,
215
+ labels: Optional[torch.LongTensor] = None,
216
+ output_hidden_states: Optional[bool] = None,
217
+ return_dict: Optional[bool] = None,
218
+ ) -> CausalLMOutput:
219
+ return_dict = return_dict if return_dict is not None else self.config.use_return_dict
220
+
221
+ x = self.embed_drop(self.embed_tokens(input_ids))
222
+ x = self.in_proj(x)
223
+
224
+ all_hidden = [x] if output_hidden_states else None
225
+ for lstm, norm, drop in zip(self.layers, self.norms, self.drops):
226
+ residual = x
227
+ normed = norm(x)
228
+ out, _ = lstm(normed)
229
+ x = residual + drop(out)
230
+ if output_hidden_states:
231
+ all_hidden.append(x)
232
+
233
+ x = self.final_norm(x)
234
+ logits = self.lm_head(x)
235
+
236
+ loss = None
237
+ if labels is not None:
238
+ shift_logits = logits[..., :-1, :].contiguous()
239
+ shift_labels = labels[..., 1:].contiguous()
240
+ loss = nn.functional.cross_entropy(
241
+ shift_logits.view(-1, self.config.vocab_size),
242
+ shift_labels.view(-1),
243
+ ignore_index=-100,
244
+ )
245
+
246
+ return CausalLMOutput(
247
+ loss=loss,
248
+ logits=logits,
249
+ hidden_states=tuple(all_hidden) if output_hidden_states else None,
250
+ )
251
+
252
+
253
+ # Register so AutoModelForCausalLM.from_pretrained works on saved checkpoints.
254
+ # register_for_auto_class() saves auto_map in config.json when saved.
255
+ # AutoConfig/AutoModel.register() makes the class findable in any process
256
+ # that imports this module — no trust_remote_code needed.
257
+ from transformers import AutoConfig, AutoModelForCausalLM
258
+
259
+ LSTMLanguageModelConfig.register_for_auto_class()
260
+ LSTMForCausalLM.register_for_auto_class("AutoModelForCausalLM")
261
+ AutoConfig.register("lstm_lm", LSTMLanguageModelConfig)
262
+ AutoModelForCausalLM.register(LSTMLanguageModelConfig, LSTMForCausalLM)
263
+
264
+ LSTMResnetLanguageModelConfig.register_for_auto_class()
265
+ LSTMResnetForCausalLM.register_for_auto_class("AutoModelForCausalLM")
266
+ AutoConfig.register("lstm_resnet", LSTMResnetLanguageModelConfig)
267
+ AutoModelForCausalLM.register(LSTMResnetLanguageModelConfig, LSTMResnetForCausalLM)
final_model/model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ce113d19e337221e3a0fdf1653d0698d915a8c344c3a7bfa4513fc2497564021
3
+ size 928496296
final_model/tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6b9e4e7fb171f92fd137b777cc2714bf87d11576700a1dcd7a399e7bbe39537b
3
+ size 17209920
final_model/tokenizer_config.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backend": "tokenizers",
3
+ "bos_token": "<|begin_of_text|>",
4
+ "clean_up_tokenization_spaces": true,
5
+ "eos_token": "<|end_of_text|>",
6
+ "is_local": false,
7
+ "model_input_names": [
8
+ "input_ids",
9
+ "attention_mask"
10
+ ],
11
+ "model_max_length": 131072,
12
+ "tokenizer_class": "TokenizersBackend"
13
+ }
final_model/training_args.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:940ae510ab19b8a3510d50d5f70e09387d1d40b89931566e2add3ed341dab96f
3
+ size 5329
model.safetensors CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:eef42f0560e9cfddb377d2015a7700ef5136b7e1fb73e220d2064b05855dcab6
3
  size 928496296
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ce113d19e337221e3a0fdf1653d0698d915a8c344c3a7bfa4513fc2497564021
3
  size 928496296
training_args.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:940ae510ab19b8a3510d50d5f70e09387d1d40b89931566e2add3ed341dab96f
3
+ size 5329