@seanhogg/builderforce-memory-engine 2026.7.14 → 2026.9.27

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 (186) hide show
  1. package/README.md +14 -0
  2. package/dist/bench/adaptation.d.ts +57 -0
  3. package/dist/bench/adaptation.d.ts.map +1 -0
  4. package/dist/bench/adaptation.js +167 -0
  5. package/dist/bench/adaptation.js.map +1 -0
  6. package/dist/bench/harness.d.ts +2 -0
  7. package/dist/bench/harness.d.ts.map +1 -1
  8. package/dist/bench/harness.js +1 -1
  9. package/dist/bench/harness.js.map +1 -1
  10. package/dist/bench/index.d.ts +5 -3
  11. package/dist/bench/index.d.ts.map +1 -1
  12. package/dist/bench/index.js +4 -2
  13. package/dist/bench/index.js.map +1 -1
  14. package/dist/bench/types.d.ts +88 -0
  15. package/dist/bench/types.d.ts.map +1 -1
  16. package/dist/evermind/adapt.d.ts +40 -0
  17. package/dist/evermind/adapt.d.ts.map +1 -0
  18. package/dist/evermind/adapt.js +25 -0
  19. package/dist/evermind/adapt.js.map +1 -0
  20. package/dist/evermind/delta_wire.d.ts +43 -0
  21. package/dist/evermind/delta_wire.d.ts.map +1 -0
  22. package/dist/evermind/delta_wire.js +94 -0
  23. package/dist/evermind/delta_wire.js.map +1 -0
  24. package/dist/evermind/eval.d.ts +31 -0
  25. package/dist/evermind/eval.d.ts.map +1 -0
  26. package/dist/evermind/eval.js +36 -0
  27. package/dist/evermind/eval.js.map +1 -0
  28. package/dist/evermind/index.d.ts +16 -0
  29. package/dist/evermind/index.d.ts.map +1 -0
  30. package/dist/evermind/index.js +11 -0
  31. package/dist/evermind/index.js.map +1 -0
  32. package/dist/evermind/merge.d.ts +21 -0
  33. package/dist/evermind/merge.d.ts.map +1 -0
  34. package/dist/evermind/merge.js +79 -0
  35. package/dist/evermind/merge.js.map +1 -0
  36. package/dist/{moe/moe_package.d.ts → evermind/package.d.ts} +55 -5
  37. package/dist/evermind/package.d.ts.map +1 -0
  38. package/dist/{moe/moe_package.js → evermind/package.js} +118 -19
  39. package/dist/evermind/package.js.map +1 -0
  40. package/dist/import/foreign/adapter.d.ts +59 -0
  41. package/dist/import/foreign/adapter.d.ts.map +1 -0
  42. package/dist/import/foreign/adapter.js +76 -0
  43. package/dist/import/foreign/adapter.js.map +1 -0
  44. package/dist/import/foreign/apply.d.ts +23 -0
  45. package/dist/import/foreign/apply.d.ts.map +1 -0
  46. package/dist/import/foreign/apply.js +43 -0
  47. package/dist/import/foreign/apply.js.map +1 -0
  48. package/dist/import/foreign/codestral_mamba.d.ts +57 -0
  49. package/dist/import/foreign/codestral_mamba.d.ts.map +1 -0
  50. package/dist/import/foreign/codestral_mamba.js +174 -0
  51. package/dist/import/foreign/codestral_mamba.js.map +1 -0
  52. package/dist/import/foreign/falcon_mamba.d.ts +51 -0
  53. package/dist/import/foreign/falcon_mamba.d.ts.map +1 -0
  54. package/dist/import/foreign/falcon_mamba.js +131 -0
  55. package/dist/import/foreign/falcon_mamba.js.map +1 -0
  56. package/dist/import/foreign/index.d.ts +21 -0
  57. package/dist/import/foreign/index.d.ts.map +1 -0
  58. package/dist/import/foreign/index.js +18 -0
  59. package/dist/import/foreign/index.js.map +1 -0
  60. package/dist/import/foreign/plan.d.ts +122 -0
  61. package/dist/import/foreign/plan.d.ts.map +1 -0
  62. package/dist/import/foreign/plan.js +171 -0
  63. package/dist/import/foreign/plan.js.map +1 -0
  64. package/dist/import/foreign/registry.d.ts +35 -0
  65. package/dist/import/foreign/registry.d.ts.map +1 -0
  66. package/dist/import/foreign/registry.js +89 -0
  67. package/dist/import/foreign/registry.js.map +1 -0
  68. package/dist/import/index.d.ts +7 -0
  69. package/dist/import/index.d.ts.map +1 -1
  70. package/dist/import/index.js +7 -0
  71. package/dist/import/index.js.map +1 -1
  72. package/dist/index.d.ts +25 -12
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +21 -9
  75. package/dist/index.js.map +1 -1
  76. package/dist/kernels/selective_scan.d.ts.map +1 -1
  77. package/dist/kernels/selective_scan.js +15 -9
  78. package/dist/kernels/selective_scan.js.map +1 -1
  79. package/dist/kernels/slice.d.ts +26 -0
  80. package/dist/kernels/slice.d.ts.map +1 -0
  81. package/dist/kernels/slice.js +52 -0
  82. package/dist/kernels/slice.js.map +1 -0
  83. package/dist/kernels/weight_update.d.ts.map +1 -1
  84. package/dist/kernels/weight_update.js +30 -4
  85. package/dist/kernels/weight_update.js.map +1 -1
  86. package/dist/lm/evermind_lm.d.ts +110 -1
  87. package/dist/lm/evermind_lm.d.ts.map +1 -1
  88. package/dist/lm/evermind_lm.js +220 -35
  89. package/dist/lm/evermind_lm.js.map +1 -1
  90. package/dist/lm/index.d.ts +4 -2
  91. package/dist/lm/index.d.ts.map +1 -1
  92. package/dist/lm/index.js +3 -1
  93. package/dist/lm/index.js.map +1 -1
  94. package/dist/lm/text_embedder.d.ts +55 -0
  95. package/dist/lm/text_embedder.d.ts.map +1 -0
  96. package/dist/lm/text_embedder.js +62 -0
  97. package/dist/lm/text_embedder.js.map +1 -0
  98. package/dist/model/attention_block.d.ts.map +1 -1
  99. package/dist/model/attention_block.js +9 -5
  100. package/dist/model/attention_block.js.map +1 -1
  101. package/dist/model/mamba1_block.d.ts.map +1 -1
  102. package/dist/model/mamba1_block.js +28 -12
  103. package/dist/model/mamba1_block.js.map +1 -1
  104. package/dist/model/mamba2_block.d.ts.map +1 -1
  105. package/dist/model/mamba2_block.js +14 -9
  106. package/dist/model/mamba2_block.js.map +1 -1
  107. package/dist/model/mamba3_block.d.ts.map +1 -1
  108. package/dist/model/mamba3_block.js +14 -9
  109. package/dist/model/mamba3_block.js.map +1 -1
  110. package/dist/moe/index.d.ts +0 -2
  111. package/dist/moe/index.d.ts.map +1 -1
  112. package/dist/moe/index.js +0 -1
  113. package/dist/moe/index.js.map +1 -1
  114. package/dist/optim/adamw.d.ts +32 -0
  115. package/dist/optim/adamw.d.ts.map +1 -1
  116. package/dist/optim/adamw.js +34 -0
  117. package/dist/optim/adamw.js.map +1 -1
  118. package/dist/tokenizer/bpe.d.ts +28 -0
  119. package/dist/tokenizer/bpe.d.ts.map +1 -1
  120. package/dist/tokenizer/bpe.js +47 -0
  121. package/dist/tokenizer/bpe.js.map +1 -1
  122. package/dist/training/cpu_ops.d.ts +44 -0
  123. package/dist/training/cpu_ops.d.ts.map +1 -0
  124. package/dist/training/cpu_ops.js +111 -0
  125. package/dist/training/cpu_ops.js.map +1 -0
  126. package/dist/training/mamba1_cpu.d.ts +109 -0
  127. package/dist/training/mamba1_cpu.d.ts.map +1 -0
  128. package/dist/training/mamba1_cpu.js +316 -0
  129. package/dist/training/mamba1_cpu.js.map +1 -0
  130. package/dist/training/model_cpu.d.ts +100 -0
  131. package/dist/training/model_cpu.d.ts.map +1 -0
  132. package/dist/training/model_cpu.js +252 -0
  133. package/dist/training/model_cpu.js.map +1 -0
  134. package/dist/training/trainer.d.ts +156 -16
  135. package/dist/training/trainer.d.ts.map +1 -1
  136. package/dist/training/trainer.js +327 -101
  137. package/dist/training/trainer.js.map +1 -1
  138. package/dist/utils/base64.d.ts +12 -0
  139. package/dist/utils/base64.d.ts.map +1 -0
  140. package/dist/utils/base64.js +27 -0
  141. package/dist/utils/base64.js.map +1 -0
  142. package/package.json +3 -1
  143. package/src/bench/adaptation.ts +180 -0
  144. package/src/bench/harness.ts +1 -1
  145. package/src/bench/index.ts +13 -2
  146. package/src/bench/types.ts +93 -0
  147. package/src/evermind/adapt.ts +61 -0
  148. package/src/evermind/delta_wire.ts +114 -0
  149. package/src/evermind/eval.ts +62 -0
  150. package/src/evermind/index.ts +33 -0
  151. package/src/evermind/merge.ts +106 -0
  152. package/src/{moe/moe_package.ts → evermind/package.ts} +148 -17
  153. package/src/import/foreign/adapter.ts +106 -0
  154. package/src/import/foreign/apply.ts +54 -0
  155. package/src/import/foreign/codestral_mamba.ts +224 -0
  156. package/src/import/foreign/falcon_mamba.ts +173 -0
  157. package/src/import/foreign/index.ts +37 -0
  158. package/src/import/foreign/plan.ts +294 -0
  159. package/src/import/foreign/registry.ts +126 -0
  160. package/src/import/index.ts +30 -0
  161. package/src/index.ts +98 -13
  162. package/src/kernels/selective_scan.ts +15 -9
  163. package/src/kernels/slice.ts +64 -0
  164. package/src/kernels/weight_update.ts +30 -4
  165. package/src/lm/evermind_lm.ts +244 -34
  166. package/src/lm/index.ts +6 -2
  167. package/src/lm/text_embedder.ts +84 -0
  168. package/src/model/attention_block.ts +9 -5
  169. package/src/model/mamba1_block.ts +28 -12
  170. package/src/model/mamba2_block.ts +14 -9
  171. package/src/model/mamba3_block.ts +14 -9
  172. package/src/moe/index.ts +0 -9
  173. package/src/optim/adamw.ts +60 -0
  174. package/src/tokenizer/bpe.ts +55 -0
  175. package/src/training/cpu_ops.ts +127 -0
  176. package/src/training/mamba1_cpu.ts +421 -0
  177. package/src/training/model_cpu.ts +360 -0
  178. package/src/training/trainer.ts +397 -154
  179. package/src/utils/base64.ts +28 -0
  180. package/dist/model/mamba_block.d.ts +0 -64
  181. package/dist/model/mamba_block.d.ts.map +0 -1
  182. package/dist/model/mamba_block.js +0 -303
  183. package/dist/model/mamba_block.js.map +0 -1
  184. package/dist/moe/moe_package.d.ts.map +0 -1
  185. package/dist/moe/moe_package.js.map +0 -1
  186. package/src/model/mamba_block.ts +0 -401
@@ -1,9 +1,36 @@
1
1
  /**
2
2
  * trainer.ts – MambaTrainer class
3
+ *
4
+ * REAL backpropagation. Until 2026-08 `_trainStep` handed the SAME `dLogits`
5
+ * buffer to AdamW for every parameter, so no parameter ever received its own
6
+ * gradient: `learn()` was SAFE (WSLA freezes the backbone, the trust region
7
+ * bounds every step, the NaN guard blocks a poisoned weight, and the session
8
+ * rolls back a regression) but INERT. It now runs a genuine backward pass —
9
+ * `cpuModelBackward` in `model_cpu.ts` — and each parameter is stepped with its
10
+ * OWN gradient.
11
+ *
12
+ * Where the maths runs, and why:
13
+ * • the backward pass is the CPU reference (`cpu_ops.ts` + `mamba1_cpu.ts`),
14
+ * a line-for-line mirror of the WGSL forward kernels. It is exact and it is
15
+ * PROVEN — `tests/backprop.test.ts` checks every parameter gradient against
16
+ * finite differences of the real loss, with no GPU involved;
17
+ * • the optimiser is {@link adamwUpdateInPlace}, the CPU mirror of
18
+ * `WEIGHT_UPDATE_WGSL`'s `adamw_update`, keeping the trust region and the
19
+ * NaN guard the safety story depends on;
20
+ * • the model's GPU buffers are written back after every optimiser step, so
21
+ * inference (which IS GPU) always serves the trained weights.
22
+ *
23
+ * The residual is a WGSL backward pass so training itself runs on the GPU. The
24
+ * backward kernels exist (`SELECTIVE_SCAN_BACKWARD_WGSL`, `SSD_BACKWARD_WGSL`,
25
+ * `CONV1D_BACKWARD_WGSL`, `LINEAR_BACKWARD_WGSL`, `ACTIVATIONS_BACKWARD_WGSL`)
26
+ * but wiring them cannot be validated numerically without a WebGPU device, and
27
+ * an unvalidated GPU backward is worse than a slower exact one.
3
28
  */
4
- import { createUniformBuffer, createStorageBuffer, createEmptyStorageBuffer, createComputePipeline, createBindGroup, dispatchKernel, readBuffer, cdiv, } from '../utils/gpu_utils.js';
5
- import { crossEntropyLoss, crossEntropyGrad } from './autograd.js';
6
- import { WEIGHT_UPDATE_WGSL, GRAD_CLIP_WGSL } from '../kernels/weight_update.js';
29
+ import { readBuffer, uploadBuffer, } from '../utils/gpu_utils.js';
30
+ import { crossEntropyLoss } from './autograd.js';
31
+ import { adamwUpdateInPlace } from '../optim/adamw.js';
32
+ import { LoRAAdapter } from './lora.js';
33
+ import { cpuModelBackward, cpuWeightsFromNamed, namedWeights, paramMatrixShape, DEFAULT_LORA_TARGETS, CPU_GRADIENT_LAYER_TYPES, } from './model_cpu.js';
7
34
  /**
8
35
  * Default per-step trust region for WSLA / write-through adaptation. Small
9
36
  * enough that a single `adapt()` nudges the narrow params without lurching, so
@@ -20,39 +47,126 @@ export class MambaTrainer {
20
47
  * Adam moments keyed by parameter NAME (not array index). Name-keying is what
21
48
  * lets WSLA toggle safely: a narrow write-through step updates only the
22
49
  * `layer{i}.wXProj/bXProj` subset, a full fine-tune updates everything, and
23
- * both reuse the SAME `m`/`v` buffers per parameter. Index-keyed moments (the
24
- * old scheme) silently misaligned the moment with the wrong parameter the
25
- * moment the trainable set changed shape — corrupting the update.
50
+ * both reuse the SAME `m`/`v` per parameter. Index-keyed moments (the old
51
+ * scheme) silently misaligned the moment with the wrong parameter the moment
52
+ * the trainable set changed shape — corrupting the update.
26
53
  */
27
54
  _moments;
28
55
  _step;
29
- _adamwPipeline;
30
- _clipReducePipeline;
31
- _clipScalePipeline;
56
+ _dims;
57
+ /** CPU mirror of every model tensor — the gradient engine's working set. */
58
+ _mirror;
59
+ _mirrorByName;
60
+ /** Low-rank adapters by parameter name, when training with `lora`. */
61
+ _adapters;
62
+ /** Frozen base weights the adapters sit on top of (LoRA only). */
63
+ _loraBase;
64
+ _shard;
32
65
  constructor(model, tokenizer = null) {
33
66
  this.model = model;
34
67
  this.tokenizer = tokenizer;
35
68
  this.device = model.device;
36
69
  this._moments = new Map();
37
70
  this._step = 0;
38
- this._adamwPipeline = createComputePipeline(this.device, WEIGHT_UPDATE_WGSL, 'adamw_update');
39
- this._clipReducePipeline = createComputePipeline(this.device, GRAD_CLIP_WGSL, 'grad_norm_reduce');
40
- this._clipScalePipeline = createComputePipeline(this.device, GRAD_CLIP_WGSL, 'grad_clip_scale');
71
+ this._dims = cpuDimsFor(model);
72
+ this._mirror = null;
73
+ this._mirrorByName = null;
74
+ this._adapters = new Map();
75
+ this._loraBase = new Map();
76
+ this._shard = null;
77
+ }
78
+ /**
79
+ * The low-rank adapters this trainer is training, by parameter name — empty
80
+ * unless `train({ lora })` was used. Exposed so a caller can serialise just the
81
+ * adapter (a few hundred KB) instead of the whole checkpoint.
82
+ */
83
+ get adapters() { return this._adapters; }
84
+ /** Trainable scalar count for the current mode — the LoRA saving, measured. */
85
+ trainableParamCount() {
86
+ const params = this.model.getTrainableParams();
87
+ if (this._adapters.size === 0)
88
+ return params.reduce((n, p) => n + p.numel, 0);
89
+ let n = 0;
90
+ for (const p of params) {
91
+ const a = this._adapters.get(p.name);
92
+ if (a)
93
+ n += a.numParams();
94
+ }
95
+ return n;
96
+ }
97
+ /** Whether this trainer owns parameter `index` under the active shard. */
98
+ _owns(index) {
99
+ return this._shard === null || index % this._shard.count === this._shard.index;
100
+ }
101
+ /**
102
+ * Build (once) an adapter for every LoRA-target parameter, snapshot the frozen
103
+ * base, and return the set. Rank is clamped per parameter to its smaller
104
+ * dimension so one global rank works across projections of very different shape.
105
+ */
106
+ _installAdapters(cfg) {
107
+ if (this._adapters.size > 0)
108
+ return; // already installed; keep training them
109
+ const targets = new Set(cfg.targets ?? DEFAULT_LORA_TARGETS);
110
+ const weights = this._mirrorByName;
111
+ for (const p of this.model.getTrainableParams()) {
112
+ const local = p.name.includes('.') ? p.name.slice(p.name.indexOf('.') + 1) : p.name;
113
+ if (!targets.has(local))
114
+ continue;
115
+ const shape = paramMatrixShape(p.name, this._dims);
116
+ if (!shape)
117
+ continue; // a vector parameter — nothing for a low-rank adapter to do
118
+ const [rows, cols] = shape;
119
+ const rank = Math.max(1, Math.min(cfg.rank ?? 8, rows, cols));
120
+ this._adapters.set(p.name, new LoRAAdapter(rows, cols, { ...cfg, rank }));
121
+ this._loraBase.set(p.name, Float32Array.from(weights.get(p.name)));
122
+ }
123
+ if (this._adapters.size === 0) {
124
+ throw new Error(`MambaTrainer: lora was requested but no trainable parameter matched targets ` +
125
+ `[${[...targets].join(', ')}]. Valid targets: wInProj, wXProj, wDtProj, wOutProj, wConv, A_log, embedding.`);
126
+ }
127
+ }
128
+ /** Write `base + adapter.delta()` into the mirror, so the forward sees the adapted weights. */
129
+ _materialiseAdapters() {
130
+ const weights = this._mirrorByName;
131
+ for (const [name, adapter] of this._adapters) {
132
+ const w = weights.get(name);
133
+ const base = this._loraBase.get(name);
134
+ const delta = adapter.delta();
135
+ for (let i = 0; i < w.length; i++)
136
+ w[i] = base[i] + delta[i];
137
+ }
41
138
  }
42
139
  /** Get-or-create the Adam first/second moments for a parameter, by name. */
43
140
  _momentFor(p) {
44
141
  let mom = this._moments.get(p.name);
45
142
  if (!mom) {
46
- mom = {
47
- m: createEmptyStorageBuffer(this.device, p.numel * 4, false),
48
- v: createEmptyStorageBuffer(this.device, p.numel * 4, false),
49
- };
143
+ mom = { m: new Float32Array(p.numel), v: new Float32Array(p.numel) };
50
144
  this._moments.set(p.name, mom);
51
145
  }
52
146
  return mom;
53
147
  }
148
+ /**
149
+ * Pull every model tensor off the GPU into the CPU mirror. Done once per
150
+ * `train()` call (not per step) so an externally loaded checkpoint or a
151
+ * previous session's weights are picked up, after which the mirror is
152
+ * authoritative and each step writes the updated tensors back.
153
+ */
154
+ async _syncMirrorFromGpu() {
155
+ const named = new Map();
156
+ for (const p of this.model.parameters()) {
157
+ named.set(p.name, await readBuffer(this.device, p.buf, p.numel * 4));
158
+ }
159
+ named.set('lm_head_bias', await readBuffer(this.device, this.model.gpuLMHeadBias, this._dims.vocabSize * 4));
160
+ this._mirror = cpuWeightsFromNamed(named, this._dims);
161
+ this._mirrorByName = namedWeights(this._mirror);
162
+ }
54
163
  async train(input, opts = {}) {
55
- const { learningRate = 1e-4, epochs = 5, batchSize = 1, seqLen = 512, maxGradNorm = 1.0, weightDecay = 0.01, beta1 = 0.9, beta2 = 0.999, eps = 1e-8, wsla = false, trackGradNorm = false, onEpochEnd = null, } = opts;
164
+ const { learningRate = 1e-4, epochs = 5, batchSize = 1, seqLen = 512, maxGradNorm = 1.0, weightDecay = 0.01, beta1 = 0.9, beta2 = 0.999, eps = 1e-8, wsla = false, onEpochEnd = null, } = opts;
165
+ const accumulation = Math.max(1, Math.floor(opts.gradientAccumulation ?? 1));
166
+ this._shard = opts.shard ?? null;
167
+ if (this._shard && (this._shard.count <= 0 || this._shard.index < 0 || this._shard.index >= this._shard.count)) {
168
+ throw new Error(`MambaTrainer: invalid shard ${this._shard.index}/${this._shard.count}`);
169
+ }
56
170
  // Trust region defaults ON for write-through (WSLA) adapts, OFF otherwise.
57
171
  const maxDelta = opts.maxDelta ?? (wsla ? WSLA_MAX_DELTA : 0);
58
172
  if (wsla)
@@ -75,119 +189,182 @@ export class MambaTrainer {
75
189
  if (chunks.length === 0) {
76
190
  throw new Error('Input is too short to form any training chunk.');
77
191
  }
78
- // Moments are created lazily per-parameter (name-keyed) on first touch —
79
- // no upfront allocation needed, and it stays correct as WSLA narrows the
80
- // trainable set.
192
+ const batches = buildBatches(chunks, Math.max(1, Math.floor(batchSize)));
193
+ // The mirror is the gradient engine's working set; refresh it from the GPU
194
+ // once per train() so a freshly loaded checkpoint is trained, not stale weights.
195
+ await this._syncMirrorFromGpu();
196
+ if (opts.lora)
197
+ this._installAdapters(opts.lora);
81
198
  const epochLosses = [];
82
199
  for (let epoch = 0; epoch < epochs; epoch++) {
83
200
  let epochLoss = 0;
84
201
  let epochGradNorm = 0;
85
202
  let numSteps = 0;
86
- for (const { inputs, targets } of chunks) {
87
- const { loss, gradNorm } = await this._trainStep(inputs, targets, batchSize, { learningRate, maxGradNorm, weightDecay, beta1, beta2, eps, wsla, maxDelta, trackGradNorm });
203
+ // Gradient accumulation: `accumulation` batches contribute to one
204
+ // optimiser step, so the effective batch is batchSize x accumulation at
205
+ // the memory of one batch.
206
+ for (let i = 0; i < batches.length; i += accumulation) {
207
+ const group = batches.slice(i, i + accumulation);
208
+ const { loss, gradNorm } = await this._trainStep(group, { learningRate, maxGradNorm, weightDecay, beta1, beta2, eps, wsla, maxDelta,
209
+ ...(opts.activationCheckpointing ? { activationCheckpointing: true } : {}) });
88
210
  epochLoss += loss;
89
- if (gradNorm != null)
90
- epochGradNorm += gradNorm;
211
+ epochGradNorm += gradNorm;
91
212
  numSteps++;
92
213
  }
93
214
  const avgLoss = epochLoss / numSteps;
94
215
  epochLosses.push(avgLoss);
95
- // Mean pre-clip grad norm this epoch (only measured when trackGradNorm is on).
96
- const avgGradNorm = trackGradNorm ? epochGradNorm / numSteps : undefined;
97
216
  if (onEpochEnd)
98
- onEpochEnd(epoch + 1, avgLoss, avgGradNorm);
217
+ onEpochEnd(epoch + 1, avgLoss, epochGradNorm / numSteps);
99
218
  }
100
219
  if (wsla)
101
220
  this.model.setWSLAMode(false);
102
221
  return epochLosses;
103
222
  }
104
- async _trainStep(inputs, targets, batch, hyperparams) {
105
- const { learningRate, maxGradNorm, weightDecay, beta1, beta2, eps, maxDelta, trackGradNorm } = hyperparams;
223
+ /**
224
+ * One optimiser step over one batch: real forward + backward, a global
225
+ * gradient-norm clip over the trainable set, then AdamW per parameter with
226
+ * its OWN gradient, written straight back to the GPU buffer.
227
+ */
228
+ async _trainStep(group, hyperparams) {
229
+ const { learningRate, maxGradNorm, weightDecay, beta1, beta2, eps, maxDelta } = hyperparams;
230
+ if (!this._mirror || !this._mirrorByName)
231
+ await this._syncMirrorFromGpu();
232
+ const mirror = this._mirror;
233
+ const weights = this._mirrorByName;
106
234
  this._step++;
107
- const seqLen = inputs.length;
108
- const vocabSize = this.model.config.vocabSize;
109
- const { logits, gpuLogits } = await this.model.forward(new Uint32Array(inputs), batch, seqLen);
110
- let totalLoss = 0;
111
- const dLogits = new Float32Array(batch * seqLen * vocabSize);
112
- for (let i = 0; i < seqLen; i++) {
113
- const offset = i * vocabSize;
114
- const logitSlice = logits.slice(offset, offset + vocabSize);
115
- const target = targets[i];
116
- totalLoss += crossEntropyLoss(logitSlice, target);
117
- const grad = crossEntropyGrad(logitSlice, target);
118
- for (let v = 0; v < vocabSize; v++) {
119
- dLogits[offset + v] = grad[v] / seqLen;
235
+ // Under LoRA the forward must see base + Delta, not the stale merge from the
236
+ // previous step.
237
+ if (this._adapters.size > 0)
238
+ this._materialiseAdapters();
239
+ const bwOpts = hyperparams.activationCheckpointing ? { activationCheckpointing: true } : {};
240
+ let loss = 0;
241
+ let grads = new Map();
242
+ for (const b of group) {
243
+ const step = cpuModelBackward(b.inputs, b.targets, mirror, this._dims, b.batch, b.seqLen, bwOpts);
244
+ loss += step.loss / group.length;
245
+ if (grads.size === 0) {
246
+ // First micro-batch owns the accumulator; scale it as we go so the
247
+ // accumulated gradient is the MEAN over the group, matching a single
248
+ // pass at the larger batch size.
249
+ for (const v of step.grads.values())
250
+ for (let i = 0; i < v.length; i++)
251
+ v[i] = v[i] / group.length;
252
+ grads = step.grads;
253
+ }
254
+ else {
255
+ for (const [k, v] of step.grads) {
256
+ const acc = grads.get(k);
257
+ for (let i = 0; i < v.length; i++)
258
+ acc[i] = acc[i] + v[i] / group.length;
259
+ }
120
260
  }
121
261
  }
122
- const loss = totalLoss / seqLen;
123
- const dLogitsBuf = createStorageBuffer(this.device, dLogits, false);
124
- const gradNorm = await this._clipGradients(dLogitsBuf, dLogits.length, maxGradNorm, !!trackGradNorm);
125
262
  // Only the trainable set is updated. Under WSLA (write-through) that is
126
263
  // the narrow per-layer subset and the backbone (incl. every A_log) stays
127
264
  // frozen — the guarantee that repeated adapts can't destabilise the SSM.
128
265
  const params = this.model.getTrainableParams();
129
- const beta1_t = Math.pow(beta1, this._step);
130
- const beta2_t = Math.pow(beta2, this._step);
131
- await this._adamwStep(params, [dLogitsBuf], { learningRate, weightDecay, beta1, beta2, eps, beta1_t, beta2_t, maxDelta });
132
- dLogitsBuf.destroy();
133
- gpuLogits.destroy();
266
+ // Under LoRA the base weights are frozen: project each base gradient onto
267
+ // its adapter, and the adapter's A/B are what the optimiser steps.
268
+ if (this._adapters.size > 0) {
269
+ for (const [name, adapter] of this._adapters) {
270
+ const g = grads.get(name);
271
+ if (!g)
272
+ continue;
273
+ adapter.zeroGrad();
274
+ adapter.accumulateGradient(g);
275
+ }
276
+ }
277
+ // Global pre-clip L2 norm ACROSS the whole trainable set. The old GPU
278
+ // reduce clipped one buffer at a time and raced on `norm_sq[0]` across
279
+ // workgroups; this is the true global norm and needs no readback.
280
+ let sumSq = 0;
281
+ for (const p of params) {
282
+ const g = grads.get(p.name);
283
+ if (!g)
284
+ continue;
285
+ for (let i = 0; i < g.length; i++)
286
+ sumSq += g[i] * g[i];
287
+ }
288
+ const gradNorm = Math.sqrt(sumSq);
289
+ const gradScale = maxGradNorm > 0 && gradNorm > maxGradNorm ? maxGradNorm / gradNorm : 1;
290
+ this._adamwStep(params, grads, weights, {
291
+ learningRate, weightDecay, beta1, beta2, eps,
292
+ beta1_t: Math.pow(beta1, this._step),
293
+ beta2_t: Math.pow(beta2, this._step),
294
+ maxDelta, gradScale,
295
+ });
134
296
  return { loss, gradNorm };
135
297
  }
136
- async _adamwStep(params, gradBufs, hp) {
137
- const { learningRate, weightDecay, beta1, beta2, eps, beta1_t, beta2_t, maxDelta } = hp;
138
- for (let i = 0; i < params.length; i++) {
139
- const p = params[i];
140
- const gradBuf = gradBufs[Math.min(i, gradBufs.length - 1)];
141
- if (!gradBuf || gradBuf.size < p.numel * 4)
298
+ /**
299
+ * AdamW over the trainable set. Each parameter is paired with its OWN
300
+ * gradient by NAME — the bug this replaces passed one shared `dLogits`
301
+ * buffer to every parameter — and the updated tensor is uploaded to the GPU
302
+ * so inference serves it.
303
+ */
304
+ _adamwStep(params, grads, weights, hp) {
305
+ const { learningRate, weightDecay, beta1, beta2, eps, beta1_t, beta2_t, maxDelta, gradScale } = hp;
306
+ const step = { lr: learningRate, beta1, beta2, eps, weightDecay, beta1_t, beta2_t, maxDelta, gradScale };
307
+ for (let idx = 0; idx < params.length; idx++) {
308
+ const p = params[idx];
309
+ if (!this._owns(idx))
310
+ continue; // another shard holds this one's moments
311
+ // LoRA: step A and B, then re-merge base + Delta into the mirror so the
312
+ // GPU buffer (what inference reads) always holds the adapted weights.
313
+ const adapter = this._adapters.get(p.name);
314
+ if (adapter) {
315
+ const w = weights.get(p.name);
316
+ const base = this._loraBase.get(p.name);
317
+ const [aP, bP] = [adapter.A, adapter.B];
318
+ const [gA, gB] = [adapter.gradients()[1].data, adapter.gradients()[0].data];
319
+ const momB = this._momentNamed(`${p.name}::loraB`, bP.length);
320
+ const momA = this._momentNamed(`${p.name}::loraA`, aP.length);
321
+ adamwUpdateInPlace(bP, gB, momB.m, momB.v, step);
322
+ adamwUpdateInPlace(aP, gA, momA.m, momA.v, step);
323
+ const delta = adapter.delta();
324
+ for (let i = 0; i < w.length; i++)
325
+ w[i] = base[i] + delta[i];
326
+ uploadBuffer(this.device, p.buf, w);
327
+ continue;
328
+ }
329
+ const g = grads.get(p.name);
330
+ const w = weights.get(p.name);
331
+ if (!g || !w)
142
332
  continue;
333
+ if (g.length !== p.numel || w.length !== p.numel) {
334
+ throw new Error(`MambaTrainer: parameter "${p.name}" is ${p.numel} elements but the ` +
335
+ `gradient engine produced ${g.length} — model and CPU mirror disagree.`);
336
+ }
143
337
  const mom = this._momentFor(p);
144
- const paramsBuf = createUniformBuffer(this.device, packAdamParams(p.numel, learningRate, beta1, beta2, eps, weightDecay, beta1_t, beta2_t, maxDelta));
145
- const bg = createBindGroup(this.device, this._adamwPipeline, [
146
- paramsBuf,
147
- p.buf,
148
- gradBuf,
149
- mom.m,
150
- mom.v,
151
- ]);
152
- dispatchKernel(this.device, this._adamwPipeline, bg, [cdiv(p.numel, 256), 1, 1]);
153
- paramsBuf.destroy();
338
+ adamwUpdateInPlace(w, g, mom.m, mom.v, step);
339
+ uploadBuffer(this.device, p.buf, w);
340
+ }
341
+ }
342
+ /** Get-or-create moments for a synthetic parameter (a LoRA factor), by name. */
343
+ _momentNamed(name, numel) {
344
+ let mom = this._moments.get(name);
345
+ if (!mom) {
346
+ mom = { m: new Float32Array(numel), v: new Float32Array(numel) };
347
+ this._moments.set(name, mom);
154
348
  }
349
+ return mom;
155
350
  }
156
351
  /**
157
- * Clip gradients to `maxNorm` in place. The reduce kernel writes Σg² into
158
- * `normSqBuf`; the scale kernel then rescales the grads. When `trackNorm` is set
159
- * we read Σg² back and return the true pre-clip L2 norm (√Σg²) — the kernel
160
- * already computed it, so this is only a small buffer readback (a GPU sync,
161
- * hence opt-in). Returns null when not tracking.
352
+ * Bytes of optimiser state (Adam m + v) this trainer holds. Under a shard that
353
+ * is 1/count of the full state; under LoRA it is the adapters' state, not the
354
+ * weights'. The measurable point of both features.
162
355
  */
163
- async _clipGradients(gradBuf, numel, maxNorm, trackNorm = false) {
164
- const normSqBuf = createEmptyStorageBuffer(this.device, 4, true);
165
- this.device.queue.writeBuffer(normSqBuf, 0, new Float32Array([0.0]));
166
- const clipParams = new ArrayBuffer(8);
167
- new Uint32Array(clipParams, 0, 1).set([numel]);
168
- new Float32Array(clipParams, 4, 1).set([maxNorm * maxNorm]);
169
- const pBuf = createUniformBuffer(this.device, clipParams);
170
- const bg1 = createBindGroup(this.device, this._clipReducePipeline, [pBuf, gradBuf, normSqBuf]);
171
- dispatchKernel(this.device, this._clipReducePipeline, bg1, [cdiv(numel, 256), 1, 1]);
172
- // Read Σg² AFTER the reduce (the scale kernel only reads it, never overwrites),
173
- // so the returned norm is the pre-clip magnitude — the instability signal.
174
- let gradNorm = null;
175
- if (trackNorm) {
176
- const out = await readBuffer(this.device, normSqBuf, 4);
177
- gradNorm = Math.sqrt(Math.max(0, out[0] ?? 0));
178
- }
179
- const bg2 = createBindGroup(this.device, this._clipScalePipeline, [pBuf, gradBuf, normSqBuf]);
180
- dispatchKernel(this.device, this._clipScalePipeline, bg2, [cdiv(numel, 256), 1, 1]);
181
- pBuf.destroy();
182
- normSqBuf.destroy();
183
- return gradNorm;
356
+ optimizerStateBytes() {
357
+ let n = 0;
358
+ for (const mom of this._moments.values())
359
+ n += mom.m.byteLength + mom.v.byteLength;
360
+ return n;
184
361
  }
185
362
  async evaluate(input) {
186
363
  let tokenIds;
187
364
  if (typeof input === 'string') {
188
365
  if (!this.tokenizer)
189
366
  throw new Error('Tokenizer required for string input.');
190
- tokenIds = this.tokenizer.encode(input);
367
+ tokenIds = Array.from(this.tokenizer.encode(input));
191
368
  }
192
369
  else {
193
370
  tokenIds = Array.from(input);
@@ -204,7 +381,38 @@ export class MambaTrainer {
204
381
  return Math.exp(avgLoss);
205
382
  }
206
383
  }
207
- function buildChunks(ids, seqLen) {
384
+ /**
385
+ * Derive the gradient engine's dimensions from a model, rejecting layer types
386
+ * the CPU reference cannot differentiate.
387
+ *
388
+ * A hybrid schedule (`jamba`/`zamba`, or any explicit schedule containing
389
+ * `mamba2`/`mamba3`/`attention`) fails LOUDLY here rather than silently training
390
+ * on gradients that do not exist — which is exactly what the old trainer did.
391
+ */
392
+ export function cpuDimsFor(model) {
393
+ const unsupported = model.layerSpecs
394
+ .map((s, i) => ({ i, type: s.type }))
395
+ .filter(({ type }) => !CPU_GRADIENT_LAYER_TYPES.includes(type));
396
+ if (unsupported.length > 0) {
397
+ const detail = unsupported.map(({ i, type }) => `layer${i}=${type}`).join(', ');
398
+ throw new Error(`MambaTrainer: the gradient engine differentiates ${CPU_GRADIENT_LAYER_TYPES.join('/')} ` +
399
+ `layers only, but this model has ${detail}. Build the model with the default ` +
400
+ `mamba1 schedule to train it, or extend the CPU reference to cover those blocks.`);
401
+ }
402
+ const first = model.layers[0];
403
+ const dInner = first?.dInner ?? model.config.expand * model.config.dModel;
404
+ const dtRank = first?.dtRank ?? Math.ceil(model.config.dModel / 16);
405
+ return {
406
+ vocabSize: model.config.vocabSize,
407
+ dModel: model.config.dModel,
408
+ dState: model.config.dState,
409
+ dConv: model.config.dConv,
410
+ dInner,
411
+ dtRank,
412
+ numLayers: model.layers.length,
413
+ };
414
+ }
415
+ export function buildChunks(ids, seqLen) {
208
416
  const chunks = [];
209
417
  for (let start = 0; start + seqLen < ids.length; start += seqLen) {
210
418
  chunks.push({
@@ -222,12 +430,30 @@ function buildChunks(ids, seqLen) {
222
430
  }
223
431
  return chunks;
224
432
  }
225
- function packAdamParams(numElements, lr, beta1, beta2, eps, weightDecay, beta1_t, beta2_t, maxDelta) {
226
- // 48 bytes: u32 + 8×f32 = 36, padded to a 16-byte multiple for the uniform
227
- // layout (matches AdamParams' _pad0.._pad2 in WEIGHT_UPDATE_WGSL).
228
- const buf = new ArrayBuffer(48);
229
- new Uint32Array(buf, 0, 1).set([numElements]);
230
- new Float32Array(buf, 4, 8).set([lr, beta1, beta2, eps, weightDecay, beta1_t, beta2_t, maxDelta]);
231
- return buf;
433
+ /**
434
+ * Group equal-length chunks into batches of at most `batchSize`.
435
+ *
436
+ * `batchSize` used to be accepted and ignored — every chunk trained alone. The
437
+ * batch dimension the model and the gradient engine both take is real, so it is
438
+ * honoured here; a ragged tail chunk simply trains as its own batch of one.
439
+ */
440
+ export function buildBatches(chunks, batchSize) {
441
+ const batches = [];
442
+ let i = 0;
443
+ while (i < chunks.length) {
444
+ const seqLen = chunks[i].inputs.length;
445
+ const group = [];
446
+ while (i < chunks.length && group.length < batchSize && chunks[i].inputs.length === seqLen) {
447
+ group.push(chunks[i]);
448
+ i++;
449
+ }
450
+ batches.push({
451
+ inputs: group.flatMap((c) => c.inputs),
452
+ targets: group.flatMap((c) => c.targets),
453
+ batch: group.length,
454
+ seqLen,
455
+ });
456
+ }
457
+ return batches;
232
458
  }
233
459
  //# sourceMappingURL=trainer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"trainer.js","sourceRoot":"","sources":["../../src/training/trainer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trainer.js","sourceRoot":"","sources":["../../src/training/trainer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * utils/base64.ts — binary ⇄ standard base64, isomorphic (browser, Node ≥ 16, Workers).
3
+ *
4
+ * Built on the global `btoa`/`atob` every supported runtime provides, so the engine
5
+ * keeps zero runtime dependencies (no `Buffer`). One implementation for every wire
6
+ * encoding the Evermind contract uses — weight deltas and packed embeddings alike.
7
+ */
8
+ /** Encode bytes as standard (padded) base64. */
9
+ export declare function bytesToBase64(bytes: ArrayBuffer | Uint8Array): string;
10
+ /** Decode standard base64 to a fresh `ArrayBuffer`. Throws on malformed input (as `atob` does). */
11
+ export declare function base64ToBytes(b64: string): ArrayBuffer;
12
+ //# sourceMappingURL=base64.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/utils/base64.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,MAAM,CAOrE;AAED,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAKtD"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * utils/base64.ts — binary ⇄ standard base64, isomorphic (browser, Node ≥ 16, Workers).
3
+ *
4
+ * Built on the global `btoa`/`atob` every supported runtime provides, so the engine
5
+ * keeps zero runtime dependencies (no `Buffer`). One implementation for every wire
6
+ * encoding the Evermind contract uses — weight deltas and packed embeddings alike.
7
+ */
8
+ /** Chunk size for `String.fromCharCode.apply` — well under every engine's arg limit. */
9
+ const CHUNK = 0x8000;
10
+ /** Encode bytes as standard (padded) base64. */
11
+ export function bytesToBase64(bytes) {
12
+ const u8 = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
13
+ let bin = "";
14
+ for (let i = 0; i < u8.length; i += CHUNK) {
15
+ bin += String.fromCharCode.apply(null, Array.from(u8.subarray(i, i + CHUNK)));
16
+ }
17
+ return btoa(bin);
18
+ }
19
+ /** Decode standard base64 to a fresh `ArrayBuffer`. Throws on malformed input (as `atob` does). */
20
+ export function base64ToBytes(b64) {
21
+ const bin = atob(b64);
22
+ const out = new Uint8Array(bin.length);
23
+ for (let i = 0; i < bin.length; i++)
24
+ out[i] = bin.charCodeAt(i);
25
+ return out.buffer;
26
+ }
27
+ //# sourceMappingURL=base64.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/utils/base64.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wFAAwF;AACxF,MAAM,KAAK,GAAG,MAAM,CAAC;AAErB,gDAAgD;AAChD,MAAM,UAAU,aAAa,CAAC,KAA+B;IAC3D,MAAM,EAAE,GAAG,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;QAC1C,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC"}