initium-deeplearning 0.1.0__py3-none-any.whl
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.
- initium/LNN_controller/cfc_backbone_parallel.py +265 -0
- initium/LNN_controller/cfc_controller.py +325 -0
- initium/LNN_controller/chained_controller.py +83 -0
- initium/LNN_controller/hybrid_controller.py +90 -0
- initium/MoE/README.md +1 -0
- initium/MoE/moe_layer.py +552 -0
- initium/__init__.py +1 -0
- initium/config/controller_config.py +86 -0
- initium/config/train_config.py +64 -0
- initium/core_training.py +2182 -0
- initium/data/__init__.py +0 -0
- initium/data/audio/__init__.py +0 -0
- initium/data/audio/audio_dataset.py +96 -0
- initium/data/base_dataset.py +75 -0
- initium/data/common/__init__.py +0 -0
- initium/data/common/chain_task.py +542 -0
- initium/data/common/digit_codec.py +85 -0
- initium/data/common/graph_io.py +123 -0
- initium/data/common/real_data.py +747 -0
- initium/data/dataset_registry.py +59 -0
- initium/data/graph_traversal/__init__.py +0 -0
- initium/data/graph_traversal/graph_traversal.py +746 -0
- initium/data/multimodal/__init__.py +0 -0
- initium/data/multimodal/multimodal_dataset.py +401 -0
- initium/data/text/__init__.py +0 -0
- initium/data/text/text_dataset.py +79 -0
- initium/data/video/__init__.py +0 -0
- initium/data/video/video_dataset.py +85 -0
- initium/inference/__init__.py +1 -0
- initium/inference/cache/__init__.py +1 -0
- initium/inference/cache/base_cache.py +112 -0
- initium/inference/cache/cache_config.py +21 -0
- initium/inference/cache/cache_registry.py +99 -0
- initium/inference/cache/cached_engine.py +264 -0
- initium/inference/cache/keys.py +77 -0
- initium/inference/cache/prefix_cache.py +59 -0
- initium/inference/cache/result_cache.py +57 -0
- initium/inference/cache/state_utils.py +74 -0
- initium/inference/cache/stores.py +167 -0
- initium/inference/capabilities.py +86 -0
- initium/inference/checkpoint_io.py +63 -0
- initium/inference/engine.py +88 -0
- initium/inference/inference_config.py +22 -0
- initium/inference/metrics.py +103 -0
- initium/inference/model_loader.py +270 -0
- initium/inference/run_inference.py +526 -0
- initium/inference/run_logging.py +173 -0
- initium/inference/tasks/__init__.py +1 -0
- initium/inference/tasks/audio_task.py +114 -0
- initium/inference/tasks/base_task.py +60 -0
- initium/inference/tasks/graph_traversal_task.py +235 -0
- initium/inference/tasks/multimodal_task.py +74 -0
- initium/inference/tasks/task_registry.py +68 -0
- initium/inference/tasks/text_task.py +114 -0
- initium/inference/tasks/video_task.py +114 -0
- initium/mamba_controller/mamba2_controller.py +433 -0
- initium/mamba_controller/mamba3_controller.py +242 -0
- initium/mamba_controller/mamba_backbone_parallel.py +291 -0
- initium/mamba_controller/mamba_controller.py +983 -0
- initium/mamba_controller/split_graph_dnc.py +623 -0
- initium/memory_manipulation/dynamic_memory_resize.py +157 -0
- initium/memory_manipulation/dynamic_n_controller.py +152 -0
- initium/memory_manipulation/link_matrix_ablation.py +130 -0
- initium/memory_manipulation/nvrtc_compat.py +143 -0
- initium/memory_manipulation/stochastic_write_head_v2.py +545 -0
- initium/setup_wheels.py +175 -0
- initium_deeplearning-0.1.0.dist-info/METADATA +253 -0
- initium_deeplearning-0.1.0.dist-info/RECORD +71 -0
- initium_deeplearning-0.1.0.dist-info/WHEEL +4 -0
- initium_deeplearning-0.1.0.dist-info/entry_points.txt +3 -0
- initium_deeplearning-0.1.0.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
"""
|
|
2
|
+
file: inference/model_loader.py
|
|
3
|
+
|
|
4
|
+
Rebuild ANY controller variant the training script can produce (lstm, mamba,
|
|
5
|
+
mamba2, mamba3, cfc, hybrids "<kind>+<kind>", MoE, link-matrix modes,
|
|
6
|
+
split-graph incl. controller combiners) from checkpoint["model_config"], then
|
|
7
|
+
load weights. Mirrors the construction logic in core_training.run().
|
|
8
|
+
|
|
9
|
+
Order matters and matches training: build -> patch link matrix -> create
|
|
10
|
+
output_proj -> install stochastic write heads -> load_state_dict (the state
|
|
11
|
+
dict contains the heads' mu/logvar params and prior buffers). nr_cells is
|
|
12
|
+
taken from the checkpoint (live size at save time), so no resize is needed.
|
|
13
|
+
|
|
14
|
+
Keys missing from older checkpoints fall back to config/controller_config.py
|
|
15
|
+
with a printed warning (a wrong fallback surfaces as a load_state_dict shape
|
|
16
|
+
error; fix with --model-config-override).
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
from dataclasses import dataclass
|
|
22
|
+
from typing import Any
|
|
23
|
+
|
|
24
|
+
import torch
|
|
25
|
+
import torch.nn as nn
|
|
26
|
+
|
|
27
|
+
import initium.config.controller_config as cc
|
|
28
|
+
from initium.mamba_controller.mamba_controller import MambaDNC
|
|
29
|
+
from initium.mamba_controller.split_graph_dnc import SplitGraphDNC
|
|
30
|
+
from initium.memory_manipulation.link_matrix_ablation import patch_link_matrix
|
|
31
|
+
from initium.memory_manipulation.stochastic_write_head_v2 import (
|
|
32
|
+
install_stochastic_write_heads,
|
|
33
|
+
load_prior_state,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass
|
|
38
|
+
class LoadedModel:
|
|
39
|
+
rnn: nn.Module
|
|
40
|
+
output_proj: nn.Module
|
|
41
|
+
heads: list
|
|
42
|
+
config: dict
|
|
43
|
+
step: int
|
|
44
|
+
run_id: str
|
|
45
|
+
beta_target: float
|
|
46
|
+
sampled_writes: bool
|
|
47
|
+
combiner_stage_kinds: list | None = None
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class _Cfg:
|
|
51
|
+
"""dict wrapper that remembers which keys fell back to defaults."""
|
|
52
|
+
|
|
53
|
+
def __init__(self, cfg: dict):
|
|
54
|
+
self.cfg = cfg
|
|
55
|
+
self.defaulted: list[str] = []
|
|
56
|
+
|
|
57
|
+
def get(self, key: str, default: Any):
|
|
58
|
+
v = self.cfg.get(key)
|
|
59
|
+
if v is None:
|
|
60
|
+
self.defaulted.append(key)
|
|
61
|
+
return default
|
|
62
|
+
return v
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _moe_kwargs(c: _Cfg) -> dict:
|
|
66
|
+
return dict(
|
|
67
|
+
moe_enabled=bool(c.cfg.get("moe_enabled", False)),
|
|
68
|
+
moe_num_experts=c.get("moe_num_experts", cc.MOE_NUM_EXPERTS),
|
|
69
|
+
moe_expert_dim=c.cfg.get("moe_expert_dim", cc.MOE_EXPERT_DIM), # None is legitimate
|
|
70
|
+
moe_capacity_factor=c.get("moe_capacity_factor", cc.MOE_CAPACITY_FACTOR),
|
|
71
|
+
moe_load_balance_alpha=c.get("moe_load_balance_alpha", cc.MOE_LOAD_BALANCE_ALPHA),
|
|
72
|
+
moe_top_k=c.get("moe_top_k", cc.MOE_TOP_K),
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _mamba1(c):
|
|
77
|
+
return dict(
|
|
78
|
+
mamba_d_state=c.get("mamba_d_state", cc.MAMBA_D_STATE),
|
|
79
|
+
mamba_d_conv=c.get("mamba_d_conv", cc.MAMBA_D_CONV),
|
|
80
|
+
mamba_expand=c.get("mamba_expand", cc.MAMBA_EXPAND),
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _mamba2(c):
|
|
85
|
+
return dict(
|
|
86
|
+
mamba2_d_state=c.get("mamba2_d_state", cc.MAMBA2_D_STATE),
|
|
87
|
+
mamba2_d_conv=c.get("mamba2_d_conv", cc.MAMBA2_D_CONV),
|
|
88
|
+
mamba2_expand=c.get("mamba2_expand", cc.MAMBA2_EXPAND),
|
|
89
|
+
mamba2_headdim=c.get("mamba2_headdim", cc.MAMBA2_HEADDIM),
|
|
90
|
+
mamba2_ngroups=c.get("mamba2_ngroups", cc.MAMBA2_NGROUPS),
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _mamba3(c):
|
|
95
|
+
return dict(
|
|
96
|
+
mamba3_d_state=c.get("mamba3_d_state", cc.MAMBA3_D_STATE),
|
|
97
|
+
mamba3_expand=c.get("mamba3_expand", cc.MAMBA3_EXPAND),
|
|
98
|
+
mamba3_headdim=c.get("mamba3_headdim", cc.MAMBA3_HEADDIM),
|
|
99
|
+
mamba3_rope_fraction=c.get("mamba3_rope_fraction", cc.MAMBA3_ROPE_FRACTION),
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _cfc(c):
|
|
104
|
+
return dict(
|
|
105
|
+
cfc_mode=c.get("cfc_mode", cc.CFC_MODE),
|
|
106
|
+
cfc_backbone_units=c.get("cfc_backbone_units", cc.CFC_BACKBONE_UNITS),
|
|
107
|
+
cfc_backbone_layers=c.get("cfc_backbone_layers", cc.CFC_BACKBONE_LAYERS),
|
|
108
|
+
cfc_backbone_dropout=c.get("cfc_backbone_dropout", cc.CFC_BACKBONE_DROPOUT),
|
|
109
|
+
cfc_activation=c.get("cfc_activation", cc.CFC_ACTIVATION),
|
|
110
|
+
cfc_mixed_memory=c.get("cfc_mixed_memory", cc.CFC_MIXED_MEMORY),
|
|
111
|
+
cfc_residual=c.get("cfc_residual", cc.CFC_RESIDUAL),
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _controller_kwargs(controller: str, c: _Cfg) -> dict:
|
|
116
|
+
moe = _moe_kwargs(c)
|
|
117
|
+
if controller == "mamba":
|
|
118
|
+
return {**_mamba1(c), **moe}
|
|
119
|
+
if controller == "mamba2":
|
|
120
|
+
return {**_mamba2(c), **moe}
|
|
121
|
+
if controller == "mamba3":
|
|
122
|
+
return {**_mamba3(c), **moe}
|
|
123
|
+
if controller == "cfc":
|
|
124
|
+
return {**_cfc(c), **moe}
|
|
125
|
+
if "+" in controller:
|
|
126
|
+
return {
|
|
127
|
+
**_mamba1(c),
|
|
128
|
+
**_mamba2(c),
|
|
129
|
+
**_mamba3(c),
|
|
130
|
+
**_cfc(c),
|
|
131
|
+
"hybrid_cfc_num_blocks": c.get("hybrid_cfc_num_blocks", cc.HYBRID_CFC_NUM_BLOCKS),
|
|
132
|
+
**moe,
|
|
133
|
+
}
|
|
134
|
+
return {} # lstm: identical to training (no extra kwargs)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def _build_split_graph(c: _Cfg, input_dim, hidden, nr_cells, cell_size, read_heads, device):
|
|
138
|
+
variant = c.get("split_graph_variant", cc.SPLIT_GRAPH_MAMBA_VARIANT)
|
|
139
|
+
default_hp = (
|
|
140
|
+
dict(d_state=cc.MAMBA3_D_STATE, d_conv=cc.MAMBA_D_CONV, expand=cc.MAMBA3_EXPAND)
|
|
141
|
+
if variant.startswith("mamba3")
|
|
142
|
+
else dict(d_state=cc.MAMBA2_D_STATE, d_conv=cc.MAMBA2_D_CONV, expand=cc.MAMBA2_EXPAND)
|
|
143
|
+
if variant.startswith("mamba2")
|
|
144
|
+
else dict(d_state=cc.MAMBA_D_STATE, d_conv=cc.MAMBA_D_CONV, expand=cc.MAMBA_EXPAND)
|
|
145
|
+
)
|
|
146
|
+
hp = c.get("split_graph_mamba_hparams", default_hp)
|
|
147
|
+
cfc_kwargs = c.get(
|
|
148
|
+
"split_graph_cfc_kwargs",
|
|
149
|
+
dict(
|
|
150
|
+
mode=cc.CFC_MODE,
|
|
151
|
+
backbone_units=cc.CFC_BACKBONE_UNITS,
|
|
152
|
+
backbone_layers=cc.CFC_BACKBONE_LAYERS,
|
|
153
|
+
backbone_dropout=cc.CFC_BACKBONE_DROPOUT,
|
|
154
|
+
activation=cc.CFC_ACTIVATION,
|
|
155
|
+
mixed_memory=cc.CFC_MIXED_MEMORY,
|
|
156
|
+
residual=cc.CFC_RESIDUAL,
|
|
157
|
+
),
|
|
158
|
+
)
|
|
159
|
+
_moe = _moe_kwargs(c)
|
|
160
|
+
return SplitGraphDNC(
|
|
161
|
+
input_size=input_dim,
|
|
162
|
+
hidden_size=hidden,
|
|
163
|
+
nr_cells=nr_cells,
|
|
164
|
+
cell_size=cell_size,
|
|
165
|
+
read_heads=read_heads,
|
|
166
|
+
num_backbone_blocks=c.get("split_graph_num_blocks", cc.SPLIT_GRAPH_NUM_BLOCKS),
|
|
167
|
+
mamba_variant=variant,
|
|
168
|
+
mamba_d_state=hp["d_state"],
|
|
169
|
+
mamba_d_conv=hp["d_conv"],
|
|
170
|
+
mamba_expand=hp["expand"],
|
|
171
|
+
mamba_headdim=c.get("split_graph_headdim", cc.SPLIT_GRAPH_MAMBA_HEADDIM),
|
|
172
|
+
cfc_kwargs=cfc_kwargs,
|
|
173
|
+
combine_reads=c.get("split_graph_combine_reads", cc.SPLIT_GRAPH_COMBINE_READS),
|
|
174
|
+
combiner_mode=c.get("split_graph_combiner_mode", cc.SPLIT_GRAPH_COMBINER_MODE),
|
|
175
|
+
combiner_variant=c.get("split_graph_combiner_variant", cc.SPLIT_GRAPH_COMBINER_VARIANT),
|
|
176
|
+
combiner_num_blocks=c.get(
|
|
177
|
+
"split_graph_combiner_num_blocks", cc.SPLIT_GRAPH_COMBINER_NUM_BLOCKS
|
|
178
|
+
),
|
|
179
|
+
independent_linears=True,
|
|
180
|
+
moe_enabled=_moe["moe_enabled"],
|
|
181
|
+
moe_num_experts=_moe["moe_num_experts"],
|
|
182
|
+
moe_expert_dim=_moe["moe_expert_dim"],
|
|
183
|
+
moe_top_k=_moe["moe_top_k"],
|
|
184
|
+
moe_capacity_factor=_moe["moe_capacity_factor"],
|
|
185
|
+
moe_load_balance_alpha=_moe["moe_load_balance_alpha"],
|
|
186
|
+
moe_cfc_multi_source=c.get(
|
|
187
|
+
"split_graph_combiner_cfc_multi_source_moe",
|
|
188
|
+
cc.SPLIT_GRAPH_COMBINER_CFC_MULTI_SOURCE_MOE,
|
|
189
|
+
),
|
|
190
|
+
device=device,
|
|
191
|
+
).to(device)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def load_model(ckpt: dict, device: torch.device, deterministic_write: bool = False) -> LoadedModel:
|
|
195
|
+
raw = ckpt["model_config"]
|
|
196
|
+
c = _Cfg(raw)
|
|
197
|
+
controller = raw.get("controller_type", "lstm")
|
|
198
|
+
input_dim = int(raw.get("input_dim", raw.get("input_size")))
|
|
199
|
+
hidden, nr_cells = int(raw["hidden_size"]), int(raw["nr_cells"])
|
|
200
|
+
cell_size, read_heads = int(raw["cell_size"]), int(raw["read_heads"])
|
|
201
|
+
|
|
202
|
+
if raw.get("split_graph_enabled", False):
|
|
203
|
+
rnn = _build_split_graph(c, input_dim, hidden, nr_cells, cell_size, read_heads, device)
|
|
204
|
+
else:
|
|
205
|
+
extra: dict[str, Any] = {}
|
|
206
|
+
if raw.get("num_hidden_layers") is not None:
|
|
207
|
+
extra["num_hidden_layers"] = int(raw["num_hidden_layers"])
|
|
208
|
+
rnn = MambaDNC(
|
|
209
|
+
input_size=input_dim,
|
|
210
|
+
hidden_size=hidden,
|
|
211
|
+
rnn_type=controller,
|
|
212
|
+
num_layers=1,
|
|
213
|
+
nr_cells=nr_cells,
|
|
214
|
+
cell_size=cell_size,
|
|
215
|
+
read_heads=read_heads,
|
|
216
|
+
batch_first=True,
|
|
217
|
+
device=device,
|
|
218
|
+
independent_linears=True,
|
|
219
|
+
**_controller_kwargs(controller, c),
|
|
220
|
+
**extra,
|
|
221
|
+
).to(device)
|
|
222
|
+
|
|
223
|
+
link_mode = raw.get("link_matrix_mode", "dense")
|
|
224
|
+
if link_mode != "dense":
|
|
225
|
+
patch_link_matrix(rnn, mode=link_mode, topk=raw.get("link_matrix_topk"))
|
|
226
|
+
|
|
227
|
+
w = ckpt["output_proj_state_dict"]["weight"]
|
|
228
|
+
output_proj = nn.Linear(w.shape[1], w.shape[0]).to(device)
|
|
229
|
+
|
|
230
|
+
beta = float(ckpt.get("beta_target", 0.0) or 0.0)
|
|
231
|
+
heads = install_stochastic_write_heads(rnn, device=device, sample=(beta > 0.0))
|
|
232
|
+
|
|
233
|
+
if c.defaulted:
|
|
234
|
+
print(
|
|
235
|
+
f"[model_loader] WARNING: checkpoint config lacks {sorted(set(c.defaulted))}; "
|
|
236
|
+
f"used config/controller_config.py defaults. If loading fails, pass "
|
|
237
|
+
f"--model-config-override with the right values."
|
|
238
|
+
)
|
|
239
|
+
try:
|
|
240
|
+
rnn.load_state_dict(ckpt["rnn_state_dict"])
|
|
241
|
+
except RuntimeError as e:
|
|
242
|
+
raise RuntimeError(
|
|
243
|
+
"rnn.load_state_dict failed -- the rebuilt architecture does not match the "
|
|
244
|
+
"checkpoint (typically a legacy checkpoint whose config was defaulted). "
|
|
245
|
+
f"Original error:\n{e}"
|
|
246
|
+
) from e
|
|
247
|
+
output_proj.load_state_dict(ckpt["output_proj_state_dict"])
|
|
248
|
+
if "prior_state" in ckpt:
|
|
249
|
+
load_prior_state(heads, ckpt["prior_state"])
|
|
250
|
+
|
|
251
|
+
if deterministic_write: # use mu only (no write noise) even if trained with beta > 0
|
|
252
|
+
for h in heads:
|
|
253
|
+
h.sample = False
|
|
254
|
+
|
|
255
|
+
rnn.eval()
|
|
256
|
+
output_proj.eval()
|
|
257
|
+
combiner_stage_kinds = (
|
|
258
|
+
list(getattr(getattr(rnn, "combiner_wrapper", None), "stage_kinds", []) or []) or None
|
|
259
|
+
)
|
|
260
|
+
return LoadedModel(
|
|
261
|
+
rnn=rnn,
|
|
262
|
+
output_proj=output_proj,
|
|
263
|
+
heads=heads,
|
|
264
|
+
config=raw,
|
|
265
|
+
step=int(ckpt.get("step", -1)),
|
|
266
|
+
run_id=str(ckpt.get("run_id", "?")),
|
|
267
|
+
beta_target=beta,
|
|
268
|
+
sampled_writes=bool(heads and heads[0].sample),
|
|
269
|
+
combiner_stage_kinds=combiner_stage_kinds,
|
|
270
|
+
)
|