codon-model 0.0.3b2__tar.gz → 0.0.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {codon_model-0.0.3b2/codon_model.egg-info → codon_model-0.0.5}/PKG-INFO +1 -1
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/__init__.py +1 -1
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/base.py +102 -10
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/__init__.py +14 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/attention.py +11 -6
- codon_model-0.0.5/codon/block/bio/__init__.py +9 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/embedding.py +3 -3
- codon_model-0.0.5/codon/block/fourier.py +106 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/lora.py +2 -0
- codon_model-0.0.3b2/codon/exp/block/manifold_conv.py → codon_model-0.0.5/codon/block/manifold.py +255 -134
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/mlp.py +38 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/transformer.py +42 -13
- codon_model-0.0.5/codon/cli.py +48 -0
- codon_model-0.0.5/codon/dev/clear.py +41 -0
- codon_model-0.0.5/codon/dev/hash.py +54 -0
- codon_model-0.0.5/codon/exp/block/bio.py +494 -0
- codon_model-0.0.5/codon/exp/block/manifold.py +88 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/kit/train/__init__.py +3 -1
- codon_model-0.0.5/codon/kit/train/language.py +123 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/kit/train/vision.py +1 -1
- {codon_model-0.0.3b2/codon/model → codon_model-0.0.5/codon}/motif/base.py +4 -8
- codon_model-0.0.5/codon/motif/data/__init__.py +7 -0
- codon_model-0.0.5/codon/motif/data/prev1.py +87 -0
- codon_model-0.0.5/codon/motif/data/sft.py +161 -0
- {codon_model-0.0.3b2/codon/model → codon_model-0.0.5/codon}/motif/motif_a1.py +11 -14
- {codon_model-0.0.3b2/codon/model → codon_model-0.0.5/codon}/motif/motif_v1.py +2 -3
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/ops/__init__.py +4 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/ops/attention.py +10 -17
- codon_model-0.0.5/codon/ops/fourier.py +33 -0
- codon_model-0.0.5/codon/ops/manifold/__init__.py +133 -0
- codon_model-0.0.5/codon/ops/manifold/conv.py +217 -0
- codon_model-0.0.3b2/codon/exp/ops/manifold_triton.py → codon_model-0.0.5/codon/ops/manifold/linear.py +6 -5
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/ops/pixelshuffle.py +0 -1
- codon_model-0.0.5/codon/utils/data/__init__.py +29 -0
- codon_model-0.0.5/codon/utils/data/base.py +404 -0
- codon_model-0.0.5/codon/utils/data/chunked.py +192 -0
- codon_model-0.0.5/codon/utils/eval/__init__.py +24 -0
- codon_model-0.0.5/codon/utils/eval/activation.py +127 -0
- codon_model-0.0.5/codon/utils/eval/base.py +210 -0
- codon_model-0.0.5/codon/utils/eval/boundary.py +157 -0
- codon_model-0.0.5/codon/utils/eval/cka.py +191 -0
- codon_model-0.0.5/codon/utils/eval/confusion.py +77 -0
- codon_model-0.0.5/codon/utils/eval/gradcam.py +121 -0
- codon_model-0.0.5/codon/utils/eval/layer_rsa.py +130 -0
- codon_model-0.0.5/codon/utils/eval/rsa.py +103 -0
- codon_model-0.0.5/codon/utils/eval/selectivity.py +149 -0
- codon_model-0.0.5/codon/utils/eval/similarity.py +65 -0
- codon_model-0.0.5/codon/utils/eval/tsne.py +109 -0
- codon_model-0.0.5/codon/utils/generate.py +349 -0
- codon_model-0.0.5/codon/utils/info.py +137 -0
- codon_model-0.0.5/codon/utils/layer/__init__.py +0 -0
- codon_model-0.0.5/codon/utils/layer/lora.py +13 -0
- codon_model-0.0.5/codon/utils/layer/manifold.py +70 -0
- codon_model-0.0.5/codon/utils/lifecycle.py +56 -0
- codon_model-0.0.5/codon/utils/plan.py +314 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/utils/seed.py +8 -4
- codon_model-0.0.5/codon/utils/session.py +323 -0
- codon_model-0.0.3b2/codon/utils/token.py → codon_model-0.0.5/codon/utils/tokens.py +110 -27
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/utils/transforms.py +13 -6
- {codon_model-0.0.3b2 → codon_model-0.0.5/codon_model.egg-info}/PKG-INFO +1 -1
- codon_model-0.0.5/codon_model.egg-info/SOURCES.txt +96 -0
- codon_model-0.0.5/codon_model.egg-info/entry_points.txt +2 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/setup.py +5 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/test/test_motifv1_train.py +1 -1
- codon_model-0.0.3b2/codon/exp/block/manifold.py +0 -332
- codon_model-0.0.3b2/codon/exp/ops/manifold.py +0 -63
- codon_model-0.0.3b2/codon/utils/dataset/__init__.py +0 -22
- codon_model-0.0.3b2/codon/utils/dataset/base.py +0 -124
- codon_model-0.0.3b2/codon/utils/dataset/conflux/base.py +0 -316
- codon_model-0.0.3b2/codon/utils/dataset/conflux/reader.py +0 -239
- codon_model-0.0.3b2/codon/utils/dataset/conflux/writer.py +0 -229
- codon_model-0.0.3b2/codon/utils/dataset/corpus.py +0 -630
- codon_model-0.0.3b2/codon_model.egg-info/SOURCES.txt +0 -67
- codon_model-0.0.3b2/test/test_conflux_dataset.py +0 -113
- {codon_model-0.0.3b2 → codon_model-0.0.5}/LICENSE +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/bio/hebian.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/bio/predictive.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/codebook.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/conv.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/film.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/fusion.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/moe.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/pixelshuffle.py +0 -0
- {codon_model-0.0.3b2/codon/block/bio → codon_model-0.0.5/codon/dev}/__init__.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/exp/__init__.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/exp/block/__init__.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/exp/block/moe.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/exp/ops/__init__.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/kit/__init__.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/model/__init__.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/model/patch_disc.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/model/resnet.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/model/tcn.py +0 -0
- {codon_model-0.0.3b2/codon/model → codon_model-0.0.5/codon}/motif/__init__.py +0 -0
- /codon_model-0.0.3b2/codon/utils/__init__.py → /codon_model-0.0.5/codon/motif/motif_a2.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/ops/bio.py +0 -0
- {codon_model-0.0.3b2/codon/utils/dataset/conflux → codon_model-0.0.5/codon/utils}/__init__.py +0 -0
- {codon_model-0.0.3b2/codon/utils/dataset → codon_model-0.0.5/codon/utils/data}/dataviewer.py +0 -0
- {codon_model-0.0.3b2/codon/utils/dataset → codon_model-0.0.5/codon/utils/data}/flatdata.py +0 -0
- {codon_model-0.0.3b2/codon/utils/dataset → codon_model-0.0.5/codon/utils/data}/image.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/utils/mask.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/utils/safecode.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/utils/split.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/utils/theta.py +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon_model.egg-info/dependency_links.txt +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon_model.egg-info/requires.txt +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/codon_model.egg-info/top_level.txt +0 -0
- {codon_model-0.0.3b2 → codon_model-0.0.5}/setup.cfg +0 -0
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import torch
|
|
2
2
|
import torch.nn as nn
|
|
3
|
+
import torch.nn.functional as F
|
|
3
4
|
|
|
4
5
|
from typing import Callable, Any, Iterator, Union
|
|
5
6
|
|
|
6
7
|
from safetensors.torch import save_model as safe_save_model
|
|
8
|
+
from safetensors.torch import save_file as safe_save_file
|
|
7
9
|
from safetensors.torch import load_model as safe_load_model
|
|
8
10
|
|
|
9
11
|
|
|
@@ -132,36 +134,126 @@ class BasicModel(nn.Module):
|
|
|
132
134
|
|
|
133
135
|
return total
|
|
134
136
|
|
|
135
|
-
def load_pretrained(self, path: str) ->
|
|
137
|
+
def load_pretrained(self, path: str, strict: bool = False) -> 'BasicModel':
|
|
136
138
|
'''
|
|
137
139
|
Load a pretrained model from a file.
|
|
138
|
-
|
|
139
140
|
Args:
|
|
140
141
|
path (str): The path to the model file.
|
|
142
|
+
strict (bool, optional): Whether to strictly enforce that the keys
|
|
143
|
+
in state_dict match. Defaults to False.
|
|
141
144
|
'''
|
|
142
145
|
if path.endswith('.safetensors'):
|
|
143
|
-
safe_load_model(self, path)
|
|
144
|
-
return
|
|
145
|
-
|
|
146
|
+
safe_load_model(self, path, strict=strict)
|
|
147
|
+
return self
|
|
146
148
|
state_dict = torch.load(path, map_location=self.device)
|
|
147
|
-
|
|
148
149
|
if isinstance(state_dict, dict):
|
|
149
150
|
if 'model_state_dict' in state_dict:
|
|
150
151
|
state_dict = state_dict['model_state_dict']
|
|
151
152
|
elif 'state_dict' in state_dict:
|
|
152
153
|
state_dict = state_dict['state_dict']
|
|
154
|
+
elif 'model' in state_dict:
|
|
155
|
+
state_dict = state_dict['model']
|
|
153
156
|
|
|
154
|
-
|
|
157
|
+
clean_state_dict = {k.replace('_orig_mod.', ''): v for k, v in state_dict.items()}
|
|
158
|
+
|
|
159
|
+
self.load_state_dict(clean_state_dict, strict=strict)
|
|
160
|
+
return self
|
|
155
161
|
|
|
156
|
-
def save_pretrained(
|
|
162
|
+
def save_pretrained(
|
|
163
|
+
self,
|
|
164
|
+
path: str,
|
|
165
|
+
trainable_only: bool = False,
|
|
166
|
+
include_buffer: bool = True,
|
|
167
|
+
exclude_modules: list[Union[type, nn.Module]] = None,
|
|
168
|
+
only: list[str] = None,
|
|
169
|
+
exclude: list[str] = None
|
|
170
|
+
) -> 'BasicModel':
|
|
157
171
|
'''
|
|
158
172
|
Save the model to a file.
|
|
159
173
|
|
|
160
174
|
Args:
|
|
161
175
|
path (str): The path to save the model file.
|
|
176
|
+
trainable_only (bool, optional): If True, only save parameters that require gradients.
|
|
177
|
+
include_buffer (bool, optional): If False, exclude registered buffers from the saved file.
|
|
178
|
+
exclude_modules (list[Union[type, nn.Module]], optional): Module types or instances to exclude.
|
|
179
|
+
only (list[str], optional): If provided, only save parameters whose keys contain ANY of these strings.
|
|
180
|
+
exclude (list[str], optional): If provided, exclude parameters whose keys contain ANY of these strings.
|
|
162
181
|
'''
|
|
182
|
+
state_dict = self.state_dict()
|
|
183
|
+
is_modified = False
|
|
184
|
+
|
|
185
|
+
exclude_prefixes = []
|
|
186
|
+
if exclude_modules:
|
|
187
|
+
exclude_types = tuple(t for t in exclude_modules if isinstance(t, type))
|
|
188
|
+
exclude_instances = set(m for m in exclude_modules if not isinstance(m, type))
|
|
189
|
+
|
|
190
|
+
for name, module in self.named_modules():
|
|
191
|
+
if module in exclude_instances or (exclude_types and isinstance(module, exclude_types)):
|
|
192
|
+
if name != '': exclude_prefixes.append(name + '.')
|
|
193
|
+
exclude_prefixes = tuple(exclude_prefixes)
|
|
194
|
+
|
|
195
|
+
has_filter = trainable_only or not include_buffer or exclude_prefixes or only or exclude
|
|
196
|
+
|
|
197
|
+
if has_filter:
|
|
198
|
+
trainable_names = {name for name, p in self.named_parameters() if p.requires_grad}
|
|
199
|
+
buffer_names = {name for name, _ in self.named_buffers()}
|
|
200
|
+
|
|
201
|
+
filtered_dict = {}
|
|
202
|
+
for key, tensor in state_dict.items():
|
|
203
|
+
keep = True
|
|
204
|
+
|
|
205
|
+
if exclude_prefixes and key.startswith(exclude_prefixes):
|
|
206
|
+
keep = False
|
|
207
|
+
|
|
208
|
+
elif exclude and any(kw in key for kw in exclude):
|
|
209
|
+
keep = False
|
|
210
|
+
|
|
211
|
+
elif only and not any(kw in key for kw in only):
|
|
212
|
+
keep = False
|
|
213
|
+
|
|
214
|
+
else:
|
|
215
|
+
is_buffer = key in buffer_names
|
|
216
|
+
if not include_buffer and is_buffer:
|
|
217
|
+
keep = False
|
|
218
|
+
elif trainable_only and not is_buffer and key not in trainable_names:
|
|
219
|
+
keep = False
|
|
220
|
+
|
|
221
|
+
if keep:
|
|
222
|
+
filtered_dict[key] = tensor
|
|
223
|
+
else:
|
|
224
|
+
is_modified = True
|
|
225
|
+
|
|
226
|
+
if is_modified:
|
|
227
|
+
state_dict = filtered_dict
|
|
228
|
+
|
|
163
229
|
if path.endswith('.safetensors'):
|
|
164
|
-
|
|
230
|
+
if not is_modified:
|
|
231
|
+
safe_save_model(self, path)
|
|
232
|
+
else:
|
|
233
|
+
safe_save_file(state_dict, path)
|
|
165
234
|
else:
|
|
166
|
-
state_dict = self.state_dict()
|
|
167
235
|
torch.save(state_dict, path)
|
|
236
|
+
|
|
237
|
+
return self
|
|
238
|
+
|
|
239
|
+
def freeze(self) -> 'BasicModel':
|
|
240
|
+
'''
|
|
241
|
+
Freeze all parameters in the model by setting requires_grad to False.
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
BasicModel: The model itself for method chaining.
|
|
245
|
+
'''
|
|
246
|
+
for param in self.parameters():
|
|
247
|
+
param.requires_grad = False
|
|
248
|
+
return self
|
|
249
|
+
|
|
250
|
+
def unfreeze(self) -> 'BasicModel':
|
|
251
|
+
'''
|
|
252
|
+
Unfreeze all parameters in the model by setting requires_grad to True.
|
|
253
|
+
|
|
254
|
+
Returns:
|
|
255
|
+
BasicModel: The model itself for method chaining.
|
|
256
|
+
'''
|
|
257
|
+
for param in self.parameters():
|
|
258
|
+
param.requires_grad = True
|
|
259
|
+
return self
|
|
@@ -31,6 +31,12 @@ from .transformer import (
|
|
|
31
31
|
TransformerMoEDecoder,
|
|
32
32
|
_TransformerDecoder,
|
|
33
33
|
)
|
|
34
|
+
from .manifold import (
|
|
35
|
+
MainfoldLoss,
|
|
36
|
+
BasicManifoldLinear, RiemannianManifoldLinear,
|
|
37
|
+
BasicManifoldConv2d, RiemannianManifoldConv2d
|
|
38
|
+
)
|
|
39
|
+
from .fourier import MultiHeadFourier
|
|
34
40
|
|
|
35
41
|
__all__ = [
|
|
36
42
|
# attention
|
|
@@ -80,4 +86,12 @@ __all__ = [
|
|
|
80
86
|
'TransformerDecoderOutput',
|
|
81
87
|
'TransformerDenseDecoder',
|
|
82
88
|
'TransformerMoEDecoder',
|
|
89
|
+
# manifold
|
|
90
|
+
'MainfoldLoss',
|
|
91
|
+
'BasicManifoldLinear',
|
|
92
|
+
'RiemannianManifoldLinear',
|
|
93
|
+
'BasicManifoldConv2d',
|
|
94
|
+
'RiemannianManifoldConv2d',
|
|
95
|
+
# Fourier
|
|
96
|
+
'MultiHeadFourier',
|
|
83
97
|
]
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
from codon.base import *
|
|
2
2
|
from codon.block.embedding import BasicEmbedding
|
|
3
|
-
from codon.ops.attention import
|
|
3
|
+
from codon.ops.attention import (
|
|
4
|
+
AttentionOutput,
|
|
5
|
+
apply_attention
|
|
6
|
+
)
|
|
4
7
|
|
|
5
8
|
|
|
6
9
|
class MultiHeadAttention(BasicModel):
|
|
@@ -25,6 +28,7 @@ class MultiHeadAttention(BasicModel):
|
|
|
25
28
|
use_qk_norm=True,
|
|
26
29
|
use_gate=False,
|
|
27
30
|
dropout=0.1,
|
|
31
|
+
bias: bool=True,
|
|
28
32
|
is_causal=True
|
|
29
33
|
):
|
|
30
34
|
'''
|
|
@@ -65,12 +69,12 @@ class MultiHeadAttention(BasicModel):
|
|
|
65
69
|
self.k_norm = nn.RMSNorm(self.head_dim)
|
|
66
70
|
|
|
67
71
|
if use_gate:
|
|
68
|
-
self.g_proj = nn.Linear(hidden_size, hidden_size)
|
|
72
|
+
self.g_proj = nn.Linear(hidden_size, hidden_size, bias=bias)
|
|
69
73
|
|
|
70
|
-
self.q_proj = nn.Linear(hidden_size, hidden_size)
|
|
71
|
-
self.k_proj = nn.Linear(hidden_size, self.kv_dim)
|
|
72
|
-
self.v_proj = nn.Linear(hidden_size, self.kv_dim)
|
|
73
|
-
self.o_proj = nn.Linear(hidden_size, hidden_size)
|
|
74
|
+
self.q_proj = nn.Linear(hidden_size, hidden_size, bias=bias)
|
|
75
|
+
self.k_proj = nn.Linear(hidden_size, self.kv_dim, bias=bias)
|
|
76
|
+
self.v_proj = nn.Linear(hidden_size, self.kv_dim, bias=bias)
|
|
77
|
+
self.o_proj = nn.Linear(hidden_size, hidden_size, bias=bias)
|
|
74
78
|
|
|
75
79
|
def forward(
|
|
76
80
|
self,
|
|
@@ -171,3 +175,4 @@ class MultiHeadAttention(BasicModel):
|
|
|
171
175
|
attention_weights=attention_weights,
|
|
172
176
|
past_key_value=current_key_value
|
|
173
177
|
)
|
|
178
|
+
|
|
@@ -69,7 +69,7 @@ class SinusoidalEmbedding(BasicEmbedding):
|
|
|
69
69
|
pe[:, 1::2] = torch.cos(position * div_term)
|
|
70
70
|
|
|
71
71
|
pe = pe.unsqueeze(0)
|
|
72
|
-
self.register_buffer('pe', pe)
|
|
72
|
+
self.register_buffer('pe', pe, persistent=False)
|
|
73
73
|
|
|
74
74
|
def forward(self, x: torch.Tensor, positions: torch.Tensor = None, start_pos: int = 0) -> torch.Tensor:
|
|
75
75
|
'''
|
|
@@ -132,8 +132,8 @@ class BasicRotaryEmbedding(BasicEmbedding):
|
|
|
132
132
|
|
|
133
133
|
emb = torch.cat((freqs, freqs), dim=-1)
|
|
134
134
|
|
|
135
|
-
self.register_buffer('cos_cached', emb.cos())
|
|
136
|
-
self.register_buffer('sin_cached', emb.sin())
|
|
135
|
+
self.register_buffer('cos_cached', emb.cos(), persistent=False)
|
|
136
|
+
self.register_buffer('sin_cached', emb.sin(), persistent=False)
|
|
137
137
|
|
|
138
138
|
def _rotate_half(self, x: torch.Tensor) -> torch.Tensor:
|
|
139
139
|
'''
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import torch
|
|
2
|
+
import torch.nn as nn
|
|
3
|
+
import torch.nn.functional as F
|
|
4
|
+
|
|
5
|
+
from codon.base import BasicModel
|
|
6
|
+
from codon.ops.attention import AttentionOutput
|
|
7
|
+
from codon.ops.fourier import apply_fourier_mixing
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class MultiHeadFourier(BasicModel):
|
|
11
|
+
'''
|
|
12
|
+
Multi-Head Fourier (MHF) module from 'Caracal: Causal Architecture via Spectral Mixing'.
|
|
13
|
+
Replaces dense Attention with O(L log L) frequency-domain mixing.
|
|
14
|
+
'''
|
|
15
|
+
def __init__(
|
|
16
|
+
self,
|
|
17
|
+
hidden_size: int,
|
|
18
|
+
num_heads: int,
|
|
19
|
+
**kwargs
|
|
20
|
+
):
|
|
21
|
+
super().__init__()
|
|
22
|
+
|
|
23
|
+
assert hidden_size % num_heads == 0, 'hidden_size must be divisible by num_heads'
|
|
24
|
+
|
|
25
|
+
self.d_model = hidden_size
|
|
26
|
+
self.n_heads = num_heads
|
|
27
|
+
self.d_head = hidden_size // num_heads
|
|
28
|
+
|
|
29
|
+
self.pre_conv = nn.Conv1d(
|
|
30
|
+
in_channels=self.d_model,
|
|
31
|
+
out_channels=self.d_model,
|
|
32
|
+
kernel_size=3,
|
|
33
|
+
groups=self.d_model,
|
|
34
|
+
bias=False
|
|
35
|
+
)
|
|
36
|
+
self.ln = nn.LayerNorm(self.d_model)
|
|
37
|
+
self.silu = nn.SiLU()
|
|
38
|
+
|
|
39
|
+
self.W_V = nn.Linear(self.d_model, self.d_model)
|
|
40
|
+
self.W_G1 = nn.Linear(self.d_model, self.d_model)
|
|
41
|
+
self.W_G2 = nn.Conv1d(
|
|
42
|
+
in_channels=self.d_model,
|
|
43
|
+
out_channels=self.d_model,
|
|
44
|
+
kernel_size=1,
|
|
45
|
+
groups=self.n_heads
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
self.linear = nn.Linear(self.d_model, self.d_model)
|
|
49
|
+
self.linear.NEED_SCALE_INIT = 1
|
|
50
|
+
|
|
51
|
+
def forward(
|
|
52
|
+
self,
|
|
53
|
+
hidden_states: torch.Tensor,
|
|
54
|
+
use_cache: bool = False,
|
|
55
|
+
past_key_value: tuple = None,
|
|
56
|
+
**kwargs
|
|
57
|
+
) -> AttentionOutput:
|
|
58
|
+
|
|
59
|
+
batch_size, seq_len, _ = hidden_states.size()
|
|
60
|
+
|
|
61
|
+
x_permuted = hidden_states.permute(0, 2, 1) # [B, D, L]
|
|
62
|
+
|
|
63
|
+
if past_key_value is not None:
|
|
64
|
+
conv_state, v_cache, g_cache = past_key_value
|
|
65
|
+
x_padded = torch.cat([conv_state, x_permuted], dim=2)
|
|
66
|
+
x = self.pre_conv(x_padded).permute(0, 2, 1) # [B, 1, D]
|
|
67
|
+
|
|
68
|
+
new_conv_state = x_padded[:, :, 1:]
|
|
69
|
+
else:
|
|
70
|
+
padding = self.pre_conv.kernel_size[0] - 1
|
|
71
|
+
x_padded = F.pad(x_permuted, (padding, 0))
|
|
72
|
+
x = self.pre_conv(x_padded).permute(0, 2, 1) # [B, L, D]
|
|
73
|
+
|
|
74
|
+
new_conv_state = x_padded[:, :, -padding:] if use_cache else None
|
|
75
|
+
|
|
76
|
+
x_norm = self.ln(x)
|
|
77
|
+
|
|
78
|
+
x_v = self.W_V(x_norm).reshape(batch_size, seq_len, self.n_heads, self.d_head).transpose(1, 2)
|
|
79
|
+
|
|
80
|
+
x_g = self.W_G1(x_norm).transpose(1, 2)
|
|
81
|
+
x_g = self.W_G2(self.silu(x_g)).transpose(1, 2)
|
|
82
|
+
x_g = x_g.reshape(batch_size, seq_len, self.n_heads, self.d_head).transpose(1, 2)
|
|
83
|
+
|
|
84
|
+
if past_key_value is not None:
|
|
85
|
+
new_v_cache = torch.cat([v_cache, x_v], dim=2)
|
|
86
|
+
new_g_cache = torch.cat([g_cache, x_g], dim=2)
|
|
87
|
+
|
|
88
|
+
g_flipped = torch.flip(new_g_cache, dims=[2])
|
|
89
|
+
|
|
90
|
+
x_mixed = torch.sum(new_v_cache * g_flipped, dim=2, keepdim=True)
|
|
91
|
+
else:
|
|
92
|
+
x_mixed = apply_fourier_mixing(x_v, x_g, seq_len)
|
|
93
|
+
|
|
94
|
+
new_v_cache = x_v if use_cache else None
|
|
95
|
+
new_g_cache = x_g if use_cache else None
|
|
96
|
+
|
|
97
|
+
x_mixed = x_mixed.transpose(1, 2).contiguous().reshape(batch_size, seq_len, self.d_model)
|
|
98
|
+
output = self.linear(x_mixed)
|
|
99
|
+
|
|
100
|
+
current_key_value = (new_conv_state, new_v_cache, new_g_cache) if use_cache else None
|
|
101
|
+
|
|
102
|
+
return AttentionOutput(
|
|
103
|
+
output=output,
|
|
104
|
+
attention_weights=None,
|
|
105
|
+
past_key_value=current_key_value
|
|
106
|
+
)
|
|
@@ -50,6 +50,8 @@ class BasicLoRA(BasicModel):
|
|
|
50
50
|
super().__init__()
|
|
51
51
|
self.gradient_checkpointing = gradient_checkpointing
|
|
52
52
|
self.original_layer = original_layer
|
|
53
|
+
self.lora_dropout_p = lora_dropout
|
|
54
|
+
self.merge_weights = merge_weights
|
|
53
55
|
|
|
54
56
|
# Freeze original layer
|
|
55
57
|
for p in self.original_layer.parameters():
|