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.
Files changed (71) hide show
  1. initium/LNN_controller/cfc_backbone_parallel.py +265 -0
  2. initium/LNN_controller/cfc_controller.py +325 -0
  3. initium/LNN_controller/chained_controller.py +83 -0
  4. initium/LNN_controller/hybrid_controller.py +90 -0
  5. initium/MoE/README.md +1 -0
  6. initium/MoE/moe_layer.py +552 -0
  7. initium/__init__.py +1 -0
  8. initium/config/controller_config.py +86 -0
  9. initium/config/train_config.py +64 -0
  10. initium/core_training.py +2182 -0
  11. initium/data/__init__.py +0 -0
  12. initium/data/audio/__init__.py +0 -0
  13. initium/data/audio/audio_dataset.py +96 -0
  14. initium/data/base_dataset.py +75 -0
  15. initium/data/common/__init__.py +0 -0
  16. initium/data/common/chain_task.py +542 -0
  17. initium/data/common/digit_codec.py +85 -0
  18. initium/data/common/graph_io.py +123 -0
  19. initium/data/common/real_data.py +747 -0
  20. initium/data/dataset_registry.py +59 -0
  21. initium/data/graph_traversal/__init__.py +0 -0
  22. initium/data/graph_traversal/graph_traversal.py +746 -0
  23. initium/data/multimodal/__init__.py +0 -0
  24. initium/data/multimodal/multimodal_dataset.py +401 -0
  25. initium/data/text/__init__.py +0 -0
  26. initium/data/text/text_dataset.py +79 -0
  27. initium/data/video/__init__.py +0 -0
  28. initium/data/video/video_dataset.py +85 -0
  29. initium/inference/__init__.py +1 -0
  30. initium/inference/cache/__init__.py +1 -0
  31. initium/inference/cache/base_cache.py +112 -0
  32. initium/inference/cache/cache_config.py +21 -0
  33. initium/inference/cache/cache_registry.py +99 -0
  34. initium/inference/cache/cached_engine.py +264 -0
  35. initium/inference/cache/keys.py +77 -0
  36. initium/inference/cache/prefix_cache.py +59 -0
  37. initium/inference/cache/result_cache.py +57 -0
  38. initium/inference/cache/state_utils.py +74 -0
  39. initium/inference/cache/stores.py +167 -0
  40. initium/inference/capabilities.py +86 -0
  41. initium/inference/checkpoint_io.py +63 -0
  42. initium/inference/engine.py +88 -0
  43. initium/inference/inference_config.py +22 -0
  44. initium/inference/metrics.py +103 -0
  45. initium/inference/model_loader.py +270 -0
  46. initium/inference/run_inference.py +526 -0
  47. initium/inference/run_logging.py +173 -0
  48. initium/inference/tasks/__init__.py +1 -0
  49. initium/inference/tasks/audio_task.py +114 -0
  50. initium/inference/tasks/base_task.py +60 -0
  51. initium/inference/tasks/graph_traversal_task.py +235 -0
  52. initium/inference/tasks/multimodal_task.py +74 -0
  53. initium/inference/tasks/task_registry.py +68 -0
  54. initium/inference/tasks/text_task.py +114 -0
  55. initium/inference/tasks/video_task.py +114 -0
  56. initium/mamba_controller/mamba2_controller.py +433 -0
  57. initium/mamba_controller/mamba3_controller.py +242 -0
  58. initium/mamba_controller/mamba_backbone_parallel.py +291 -0
  59. initium/mamba_controller/mamba_controller.py +983 -0
  60. initium/mamba_controller/split_graph_dnc.py +623 -0
  61. initium/memory_manipulation/dynamic_memory_resize.py +157 -0
  62. initium/memory_manipulation/dynamic_n_controller.py +152 -0
  63. initium/memory_manipulation/link_matrix_ablation.py +130 -0
  64. initium/memory_manipulation/nvrtc_compat.py +143 -0
  65. initium/memory_manipulation/stochastic_write_head_v2.py +545 -0
  66. initium/setup_wheels.py +175 -0
  67. initium_deeplearning-0.1.0.dist-info/METADATA +253 -0
  68. initium_deeplearning-0.1.0.dist-info/RECORD +71 -0
  69. initium_deeplearning-0.1.0.dist-info/WHEEL +4 -0
  70. initium_deeplearning-0.1.0.dist-info/entry_points.txt +3 -0
  71. 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
+ )