@seanhogg/builderforce-memory-engine 2026.6.18
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.
- package/LICENSE +21 -0
- package/README.md +393 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/kernels/activations.d.ts +5 -0
- package/dist/kernels/activations.d.ts.map +1 -0
- package/dist/kernels/activations.js +171 -0
- package/dist/kernels/activations.js.map +1 -0
- package/dist/kernels/attention.d.ts +19 -0
- package/dist/kernels/attention.d.ts.map +1 -0
- package/dist/kernels/attention.js +263 -0
- package/dist/kernels/attention.js.map +1 -0
- package/dist/kernels/complex_ssd.d.ts +33 -0
- package/dist/kernels/complex_ssd.d.ts.map +1 -0
- package/dist/kernels/complex_ssd.js +305 -0
- package/dist/kernels/complex_ssd.js.map +1 -0
- package/dist/kernels/conv1d.d.ts +3 -0
- package/dist/kernels/conv1d.d.ts.map +1 -0
- package/dist/kernels/conv1d.js +158 -0
- package/dist/kernels/conv1d.js.map +1 -0
- package/dist/kernels/linear_projection.d.ts +3 -0
- package/dist/kernels/linear_projection.d.ts.map +1 -0
- package/dist/kernels/linear_projection.js +219 -0
- package/dist/kernels/linear_projection.js.map +1 -0
- package/dist/kernels/selective_scan.d.ts +3 -0
- package/dist/kernels/selective_scan.d.ts.map +1 -0
- package/dist/kernels/selective_scan.js +348 -0
- package/dist/kernels/selective_scan.js.map +1 -0
- package/dist/kernels/ssd.d.ts +29 -0
- package/dist/kernels/ssd.d.ts.map +1 -0
- package/dist/kernels/ssd.js +276 -0
- package/dist/kernels/ssd.js.map +1 -0
- package/dist/kernels/weight_update.d.ts +3 -0
- package/dist/kernels/weight_update.d.ts.map +1 -0
- package/dist/kernels/weight_update.js +119 -0
- package/dist/kernels/weight_update.js.map +1 -0
- package/dist/model/attention_block.d.ts +48 -0
- package/dist/model/attention_block.d.ts.map +1 -0
- package/dist/model/attention_block.js +262 -0
- package/dist/model/attention_block.js.map +1 -0
- package/dist/model/mamba1_block.d.ts +70 -0
- package/dist/model/mamba1_block.d.ts.map +1 -0
- package/dist/model/mamba1_block.js +333 -0
- package/dist/model/mamba1_block.js.map +1 -0
- package/dist/model/mamba2_block.d.ts +44 -0
- package/dist/model/mamba2_block.d.ts.map +1 -0
- package/dist/model/mamba2_block.js +252 -0
- package/dist/model/mamba2_block.js.map +1 -0
- package/dist/model/mamba3_block.d.ts +51 -0
- package/dist/model/mamba3_block.d.ts.map +1 -0
- package/dist/model/mamba3_block.js +270 -0
- package/dist/model/mamba3_block.js.map +1 -0
- package/dist/model/mamba_block.d.ts +64 -0
- package/dist/model/mamba_block.d.ts.map +1 -0
- package/dist/model/mamba_block.js +303 -0
- package/dist/model/mamba_block.js.map +1 -0
- package/dist/model/mamba_model.d.ts +140 -0
- package/dist/model/mamba_model.d.ts.map +1 -0
- package/dist/model/mamba_model.js +527 -0
- package/dist/model/mamba_model.js.map +1 -0
- package/dist/model/sequence_layer.d.ts +25 -0
- package/dist/model/sequence_layer.d.ts.map +1 -0
- package/dist/model/sequence_layer.js +8 -0
- package/dist/model/sequence_layer.js.map +1 -0
- package/dist/tokenizer/bpe.d.ts +29 -0
- package/dist/tokenizer/bpe.d.ts.map +1 -0
- package/dist/tokenizer/bpe.js +164 -0
- package/dist/tokenizer/bpe.js.map +1 -0
- package/dist/training/autograd.d.ts +27 -0
- package/dist/training/autograd.d.ts.map +1 -0
- package/dist/training/autograd.js +120 -0
- package/dist/training/autograd.js.map +1 -0
- package/dist/training/trainer.d.ts +36 -0
- package/dist/training/trainer.d.ts.map +1 -0
- package/dist/training/trainer.js +183 -0
- package/dist/training/trainer.js.map +1 -0
- package/dist/utils/gpu_utils.d.ts +21 -0
- package/dist/utils/gpu_utils.d.ts.map +1 -0
- package/dist/utils/gpu_utils.js +111 -0
- package/dist/utils/gpu_utils.js.map +1 -0
- package/dist/utils/quantization.d.ts +26 -0
- package/dist/utils/quantization.d.ts.map +1 -0
- package/dist/utils/quantization.js +116 -0
- package/dist/utils/quantization.js.map +1 -0
- package/dist/utils/rng.d.ts +36 -0
- package/dist/utils/rng.d.ts.map +1 -0
- package/dist/utils/rng.js +61 -0
- package/dist/utils/rng.js.map +1 -0
- package/package.json +99 -0
- package/src/index.ts +114 -0
- package/src/kernels/activations.ts +174 -0
- package/src/kernels/attention.ts +268 -0
- package/src/kernels/complex_ssd.ts +307 -0
- package/src/kernels/conv1d.ts +159 -0
- package/src/kernels/linear_projection.ts +220 -0
- package/src/kernels/selective_scan.ts +350 -0
- package/src/kernels/ssd.ts +278 -0
- package/src/kernels/weight_update.ts +120 -0
- package/src/model/attention_block.ts +344 -0
- package/src/model/mamba1_block.ts +437 -0
- package/src/model/mamba2_block.ts +319 -0
- package/src/model/mamba3_block.ts +335 -0
- package/src/model/mamba_block.ts +401 -0
- package/src/model/mamba_model.ts +678 -0
- package/src/model/sequence_layer.ts +29 -0
- package/src/tokenizer/bpe.ts +186 -0
- package/src/training/autograd.ts +135 -0
- package/src/training/trainer.ts +309 -0
- package/src/utils/gpu_utils.ts +147 -0
- package/src/utils/quantization.ts +154 -0
- package/src/utils/rng.ts +65 -0
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mamba_model.ts – HybridMambaModel: Mamba-1/2/3 and Attention layer scheduling.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the fixed MambaBlock[] array with a SequenceLayer[] built from a
|
|
5
|
+
* per-layer type schedule. MambaModel is kept as a backward-compatible alias
|
|
6
|
+
* (all-mamba1 schedule).
|
|
7
|
+
*
|
|
8
|
+
* MBJS binary format:
|
|
9
|
+
* Version 1 (legacy): [magic][v=1][nParams][numel[]][ f32 data ]
|
|
10
|
+
* Version 2 (new): [magic][v=2][nLayers][layerType[]][padding][nParams][numel[]][ f32 data ]
|
|
11
|
+
* layerType: 0=mamba1, 1=mamba2, 2=mamba3, 3=attention
|
|
12
|
+
*/
|
|
13
|
+
import { Mamba1Block } from './mamba1_block.js';
|
|
14
|
+
import { Mamba2Block } from './mamba2_block.js';
|
|
15
|
+
import { Mamba3Block } from './mamba3_block.js';
|
|
16
|
+
import { AttentionBlock } from './attention_block.js';
|
|
17
|
+
import { createStorageBuffer, createEmptyStorageBuffer, createUniformBuffer, createComputePipeline, createBindGroup, dispatchKernel, readBuffer, uploadBuffer, cdiv, } from '../utils/gpu_utils.js';
|
|
18
|
+
import { LINEAR_FORWARD_WGSL } from '../kernels/linear_projection.js';
|
|
19
|
+
import { ACTIVATIONS_WGSL } from '../kernels/activations.js';
|
|
20
|
+
import { gaussianArray, setInitSeed } from '../utils/rng.js';
|
|
21
|
+
import { quantizeFp16, dequantizeFp16 } from '../utils/quantization.js';
|
|
22
|
+
// ── MBJS format constants ─────────────────────────────────────────────────────
|
|
23
|
+
const MBJS_MAGIC = 0x4D424A53; // 'MBJS'
|
|
24
|
+
const LAYER_TYPE_ID = {
|
|
25
|
+
mamba1: 0,
|
|
26
|
+
mamba2: 1,
|
|
27
|
+
mamba3: 2,
|
|
28
|
+
attention: 3,
|
|
29
|
+
};
|
|
30
|
+
const ID_TO_LAYER_TYPE = ['mamba1', 'mamba2', 'mamba3', 'attention'];
|
|
31
|
+
// ── HybridMambaModel ──────────────────────────────────────────────────────────
|
|
32
|
+
export class HybridMambaModel {
|
|
33
|
+
device;
|
|
34
|
+
config;
|
|
35
|
+
gpuEmbedding;
|
|
36
|
+
layers;
|
|
37
|
+
layerSpecs;
|
|
38
|
+
gpuFinalNorm;
|
|
39
|
+
tiedEmbedding;
|
|
40
|
+
gpuLMHeadBias;
|
|
41
|
+
_lmHeadPipeline;
|
|
42
|
+
_rmsnormPipeline;
|
|
43
|
+
_embedPipeline;
|
|
44
|
+
_wslaMode = false;
|
|
45
|
+
constructor(device, config) {
|
|
46
|
+
this.device = device;
|
|
47
|
+
this.config = {
|
|
48
|
+
dState: 16,
|
|
49
|
+
dConv: 4,
|
|
50
|
+
expand: 2,
|
|
51
|
+
nHeads: 4,
|
|
52
|
+
nGroups: 1,
|
|
53
|
+
chunkLen: 256,
|
|
54
|
+
mimoGroup: 1,
|
|
55
|
+
eosId: -1,
|
|
56
|
+
defaultMamba1: {},
|
|
57
|
+
defaultMamba2: {},
|
|
58
|
+
defaultMamba3: {},
|
|
59
|
+
defaultAttention: {},
|
|
60
|
+
layers: undefined,
|
|
61
|
+
seed: undefined,
|
|
62
|
+
...config,
|
|
63
|
+
};
|
|
64
|
+
// Install the deterministic init seed (if any) for the duration of
|
|
65
|
+
// construction, so the embedding table and every block initialise
|
|
66
|
+
// reproducibly. Restored to Math.random once all weights are built.
|
|
67
|
+
setInitSeed(this.config.seed);
|
|
68
|
+
// Resolve layer schedule
|
|
69
|
+
const layerSchedule = config.layers
|
|
70
|
+
?? Array.from({ length: config.numLayers }, () => ({ type: 'mamba1' }));
|
|
71
|
+
if (layerSchedule.length !== config.numLayers) {
|
|
72
|
+
throw new Error(`HybridMambaModel: layers schedule length (${layerSchedule.length}) must equal numLayers (${config.numLayers}).`);
|
|
73
|
+
}
|
|
74
|
+
this.layerSpecs = layerSchedule;
|
|
75
|
+
// Embedding table
|
|
76
|
+
const { vocabSize, dModel } = this.config;
|
|
77
|
+
const embedData = gaussianArray(vocabSize * dModel, 1.0 / Math.sqrt(dModel));
|
|
78
|
+
this.gpuEmbedding = createStorageBuffer(device, embedData, true);
|
|
79
|
+
// Build layers (block constructors also draw from the seeded source)
|
|
80
|
+
this.layers = layerSchedule.map(spec => this._buildLayer(spec));
|
|
81
|
+
// Restore the default Math.random source now that all weights are built.
|
|
82
|
+
setInitSeed(undefined);
|
|
83
|
+
// Final RMSNorm
|
|
84
|
+
this.gpuFinalNorm = createStorageBuffer(device, new Float32Array(dModel).fill(1.0), true);
|
|
85
|
+
this.tiedEmbedding = true;
|
|
86
|
+
this.gpuLMHeadBias = createStorageBuffer(device, new Float32Array(vocabSize), true);
|
|
87
|
+
this._lmHeadPipeline = createComputePipeline(device, LINEAR_FORWARD_WGSL, 'linear_forward');
|
|
88
|
+
this._rmsnormPipeline = createComputePipeline(device, ACTIVATIONS_WGSL, 'rmsnorm_forward');
|
|
89
|
+
this._embedPipeline = createComputePipeline(device, EMBED_LOOKUP_WGSL, 'embed_lookup');
|
|
90
|
+
}
|
|
91
|
+
_buildLayer(spec) {
|
|
92
|
+
const c = this.config;
|
|
93
|
+
switch (spec.type) {
|
|
94
|
+
case 'mamba1': {
|
|
95
|
+
const base = {
|
|
96
|
+
dModel: c.dModel,
|
|
97
|
+
dState: c.dState,
|
|
98
|
+
dConv: c.dConv,
|
|
99
|
+
expand: c.expand,
|
|
100
|
+
...c.defaultMamba1,
|
|
101
|
+
};
|
|
102
|
+
return new Mamba1Block(this.device, { ...base, ...(spec.config ?? {}) });
|
|
103
|
+
}
|
|
104
|
+
case 'mamba2': {
|
|
105
|
+
const base = {
|
|
106
|
+
dModel: c.dModel,
|
|
107
|
+
dState: c.dState,
|
|
108
|
+
dConv: c.dConv,
|
|
109
|
+
expand: c.expand,
|
|
110
|
+
nHeads: c.nHeads,
|
|
111
|
+
nGroups: c.nGroups,
|
|
112
|
+
chunkLen: c.chunkLen,
|
|
113
|
+
...c.defaultMamba2,
|
|
114
|
+
};
|
|
115
|
+
return new Mamba2Block(this.device, { ...base, ...(spec.config ?? {}) });
|
|
116
|
+
}
|
|
117
|
+
case 'mamba3': {
|
|
118
|
+
const base = {
|
|
119
|
+
dModel: c.dModel,
|
|
120
|
+
dState: c.dState,
|
|
121
|
+
dConv: c.dConv,
|
|
122
|
+
expand: c.expand,
|
|
123
|
+
nHeads: c.nHeads,
|
|
124
|
+
nGroups: c.nGroups,
|
|
125
|
+
chunkLen: c.chunkLen,
|
|
126
|
+
mimoGroup: c.mimoGroup,
|
|
127
|
+
...c.defaultMamba3,
|
|
128
|
+
};
|
|
129
|
+
return new Mamba3Block(this.device, { ...base, ...(spec.config ?? {}) });
|
|
130
|
+
}
|
|
131
|
+
case 'attention': {
|
|
132
|
+
const base = {
|
|
133
|
+
dModel: c.dModel,
|
|
134
|
+
nHeads: c.nHeads,
|
|
135
|
+
...c.defaultAttention,
|
|
136
|
+
};
|
|
137
|
+
return new AttentionBlock(this.device, { ...base, ...(spec.config ?? {}) });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
embedTokens(tokenIds, batch, seqLen) {
|
|
142
|
+
const { dModel } = this.config;
|
|
143
|
+
const M = batch * seqLen;
|
|
144
|
+
const idsBuf = createStorageBuffer(this.device, tokenIds instanceof Uint32Array ? tokenIds : new Uint32Array(tokenIds), false);
|
|
145
|
+
const outBuf = createEmptyStorageBuffer(this.device, M * dModel * 4, true);
|
|
146
|
+
const pBuf = createUniformBuffer(this.device, new Uint32Array([M, dModel]).buffer);
|
|
147
|
+
const bg = createBindGroup(this.device, this._embedPipeline, [pBuf, idsBuf, this.gpuEmbedding, outBuf]);
|
|
148
|
+
dispatchKernel(this.device, this._embedPipeline, bg, [cdiv(M, 64), 1, 1]);
|
|
149
|
+
idsBuf.destroy();
|
|
150
|
+
pBuf.destroy();
|
|
151
|
+
return outBuf;
|
|
152
|
+
}
|
|
153
|
+
async forward(tokenIds, batch, seqLen) {
|
|
154
|
+
const { dModel, vocabSize } = this.config;
|
|
155
|
+
const M = batch * seqLen;
|
|
156
|
+
let hidden = this.embedTokens(tokenIds, batch, seqLen);
|
|
157
|
+
const caches = [];
|
|
158
|
+
for (const layer of this.layers) {
|
|
159
|
+
const { output, cache } = layer.forward(hidden, batch, seqLen);
|
|
160
|
+
caches.push(cache);
|
|
161
|
+
hidden.destroy();
|
|
162
|
+
hidden = output;
|
|
163
|
+
}
|
|
164
|
+
// Final RMSNorm
|
|
165
|
+
const normOut = createEmptyStorageBuffer(this.device, M * dModel * 4, true);
|
|
166
|
+
const normInv = createEmptyStorageBuffer(this.device, M * 4, false);
|
|
167
|
+
{
|
|
168
|
+
const params = new ArrayBuffer(16);
|
|
169
|
+
new Uint32Array(params, 0, 2).set([M, dModel]);
|
|
170
|
+
new Float32Array(params, 8, 1).set([1e-6]);
|
|
171
|
+
const pBuf = createUniformBuffer(this.device, params);
|
|
172
|
+
const bg = createBindGroup(this.device, this._rmsnormPipeline, [pBuf, hidden, this.gpuFinalNorm, normOut, normInv]);
|
|
173
|
+
dispatchKernel(this.device, this._rmsnormPipeline, bg, [cdiv(M, 64), 1, 1]);
|
|
174
|
+
}
|
|
175
|
+
hidden.destroy();
|
|
176
|
+
// LM head (tied embedding)
|
|
177
|
+
const gpuLogits = createEmptyStorageBuffer(this.device, M * vocabSize * 4, true);
|
|
178
|
+
{
|
|
179
|
+
const params = new Uint32Array([M, dModel, vocabSize]).buffer;
|
|
180
|
+
const pBuf = createUniformBuffer(this.device, params);
|
|
181
|
+
const bg = createBindGroup(this.device, this._lmHeadPipeline, [pBuf, normOut, this.gpuEmbedding, this.gpuLMHeadBias, gpuLogits]);
|
|
182
|
+
dispatchKernel(this.device, this._lmHeadPipeline, bg, [cdiv(M, 16), cdiv(vocabSize, 16), 1]);
|
|
183
|
+
}
|
|
184
|
+
normOut.destroy();
|
|
185
|
+
normInv.destroy();
|
|
186
|
+
const logits = await readBuffer(this.device, gpuLogits, M * vocabSize * 4);
|
|
187
|
+
return { logits, gpuLogits, caches };
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Produces a single fixed-length embedding vector for a token sequence.
|
|
191
|
+
*
|
|
192
|
+
* Runs the full layer stack plus the final RMSNorm — i.e. the same hidden
|
|
193
|
+
* state the LM head consumes — then mean-pools across sequence positions and
|
|
194
|
+
* L2-normalises the result. The returned vector has length `dModel` and is
|
|
195
|
+
* suitable for cosine-similarity semantic search.
|
|
196
|
+
*
|
|
197
|
+
* Unlike `forward()`, this skips the (expensive) LM-head projection: it only
|
|
198
|
+
* needs the `dModel`-wide hidden state, not `vocabSize` logits.
|
|
199
|
+
*
|
|
200
|
+
* The embedding reflects whatever the model currently knows — an untrained
|
|
201
|
+
* model behaves like a random projection of the token embeddings (still
|
|
202
|
+
* lexically discriminative), and the representation sharpens automatically as
|
|
203
|
+
* the model is adapted/distilled.
|
|
204
|
+
*/
|
|
205
|
+
async embed(tokenIds) {
|
|
206
|
+
const { dModel } = this.config;
|
|
207
|
+
const seqLen = tokenIds.length;
|
|
208
|
+
const batch = 1;
|
|
209
|
+
const M = batch * seqLen;
|
|
210
|
+
if (M === 0)
|
|
211
|
+
return new Float32Array(dModel);
|
|
212
|
+
let hidden = this.embedTokens(tokenIds, batch, seqLen);
|
|
213
|
+
for (const layer of this.layers) {
|
|
214
|
+
const { output } = layer.forward(hidden, batch, seqLen);
|
|
215
|
+
hidden.destroy();
|
|
216
|
+
hidden = output;
|
|
217
|
+
}
|
|
218
|
+
// Final RMSNorm — mirrors forward(), but we stop here (no LM head).
|
|
219
|
+
const normOut = createEmptyStorageBuffer(this.device, M * dModel * 4, true);
|
|
220
|
+
const normInv = createEmptyStorageBuffer(this.device, M * 4, false);
|
|
221
|
+
{
|
|
222
|
+
const params = new ArrayBuffer(16);
|
|
223
|
+
new Uint32Array(params, 0, 2).set([M, dModel]);
|
|
224
|
+
new Float32Array(params, 8, 1).set([1e-6]);
|
|
225
|
+
const pBuf = createUniformBuffer(this.device, params);
|
|
226
|
+
const bg = createBindGroup(this.device, this._rmsnormPipeline, [pBuf, hidden, this.gpuFinalNorm, normOut, normInv]);
|
|
227
|
+
dispatchKernel(this.device, this._rmsnormPipeline, bg, [cdiv(M, 64), 1, 1]);
|
|
228
|
+
}
|
|
229
|
+
hidden.destroy();
|
|
230
|
+
const normed = await readBuffer(this.device, normOut, M * dModel * 4);
|
|
231
|
+
normOut.destroy();
|
|
232
|
+
normInv.destroy();
|
|
233
|
+
// Mean-pool across sequence positions → dModel vector.
|
|
234
|
+
const out = new Float32Array(dModel);
|
|
235
|
+
for (let t = 0; t < seqLen; t++) {
|
|
236
|
+
const base = t * dModel;
|
|
237
|
+
for (let d = 0; d < dModel; d++)
|
|
238
|
+
out[d] += normed[base + d];
|
|
239
|
+
}
|
|
240
|
+
for (let d = 0; d < dModel; d++)
|
|
241
|
+
out[d] /= seqLen;
|
|
242
|
+
// L2-normalise so cosine similarity reduces to a dot product.
|
|
243
|
+
let norm = 0;
|
|
244
|
+
for (let d = 0; d < dModel; d++)
|
|
245
|
+
norm += out[d] * out[d];
|
|
246
|
+
norm = Math.sqrt(norm) || 1;
|
|
247
|
+
for (let d = 0; d < dModel; d++)
|
|
248
|
+
out[d] /= norm;
|
|
249
|
+
return out;
|
|
250
|
+
}
|
|
251
|
+
async generate(promptIds, maxNewTokens = 200, samplingOpts = {}) {
|
|
252
|
+
const { temperature = 1.0, topK = 50, topP = 0.9 } = samplingOpts;
|
|
253
|
+
const { vocabSize } = this.config;
|
|
254
|
+
let ids = [...promptIds];
|
|
255
|
+
for (let step = 0; step < maxNewTokens; step++) {
|
|
256
|
+
const { logits } = await this.forward(new Uint32Array(ids), 1, ids.length);
|
|
257
|
+
const lastLogits = logits.slice((ids.length - 1) * vocabSize, ids.length * vocabSize);
|
|
258
|
+
const nextId = sampleToken(lastLogits, { temperature, topK, topP });
|
|
259
|
+
ids.push(nextId);
|
|
260
|
+
if (nextId === this.config.eosId)
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
return ids;
|
|
264
|
+
}
|
|
265
|
+
parameters() {
|
|
266
|
+
const params = [];
|
|
267
|
+
params.push({
|
|
268
|
+
buf: this.gpuEmbedding,
|
|
269
|
+
numel: this.config.vocabSize * this.config.dModel,
|
|
270
|
+
name: 'embedding',
|
|
271
|
+
});
|
|
272
|
+
for (let i = 0; i < this.layers.length; i++) {
|
|
273
|
+
for (const p of this.layers[i].parameters()) {
|
|
274
|
+
params.push({ ...p, name: `layer${i}.${p.name}` });
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
params.push({
|
|
278
|
+
buf: this.gpuFinalNorm,
|
|
279
|
+
numel: this.config.dModel,
|
|
280
|
+
name: 'final_norm',
|
|
281
|
+
});
|
|
282
|
+
return params;
|
|
283
|
+
}
|
|
284
|
+
setWSLAMode(enabled) {
|
|
285
|
+
for (const layer of this.layers)
|
|
286
|
+
layer.setWSLAMode(enabled);
|
|
287
|
+
this._wslaMode = enabled;
|
|
288
|
+
}
|
|
289
|
+
// ── Serialisation (MBJS v2 / v3) ──────────────────────────────────────────
|
|
290
|
+
/**
|
|
291
|
+
* Export all parameters to an ArrayBuffer.
|
|
292
|
+
*
|
|
293
|
+
* MBJS v2/v3 format (identical header; only the data encoding differs):
|
|
294
|
+
* [0..3] magic : uint32 = 0x4D424A53
|
|
295
|
+
* [4..7] version : uint32 = 2 (fp32 data) | 3 (fp16 data)
|
|
296
|
+
* [8..11] nLayers : uint32
|
|
297
|
+
* [12 .. 12+nLayers-1] layerType[i]: uint8 (0=m1, 1=m2, 2=m3, 3=attn)
|
|
298
|
+
* aligned to 4 bytes: padding
|
|
299
|
+
* [next 4] nParams : uint32
|
|
300
|
+
* [next 4*nParams] numel[i]: uint32
|
|
301
|
+
* [data] float32 values (v2) | float16 values (v3, half the size)
|
|
302
|
+
*
|
|
303
|
+
* Pass `{ fp16: true }` to emit a v3 checkpoint — roughly half the bytes,
|
|
304
|
+
* with a small precision loss that is negligible for SSM weights.
|
|
305
|
+
*/
|
|
306
|
+
async exportWeights(opts = {}) {
|
|
307
|
+
const fp16 = opts.fp16 ?? false;
|
|
308
|
+
const params = this.parameters();
|
|
309
|
+
const nParams = params.length;
|
|
310
|
+
const nLayers = this.layers.length;
|
|
311
|
+
const arrays = await Promise.all(params.map(p => readBuffer(this.device, p.buf, p.numel * 4)));
|
|
312
|
+
// Header: magic(4) + version(4) + nLayers(4) + layerTypes(nLayers, padded to 4) + nParams(4) + numels(4*nParams)
|
|
313
|
+
const layerTypeBytes = Math.ceil(nLayers / 4) * 4; // align to 4
|
|
314
|
+
const headerBytes = 4 + 4 + 4 + layerTypeBytes + 4 + nParams * 4;
|
|
315
|
+
const bytesPerEl = fp16 ? 2 : 4;
|
|
316
|
+
const totalEls = arrays.reduce((a, arr) => a + arr.length, 0);
|
|
317
|
+
const dataBytes = totalEls * bytesPerEl;
|
|
318
|
+
const out = new ArrayBuffer(headerBytes + dataBytes);
|
|
319
|
+
const view = new DataView(out);
|
|
320
|
+
let off = 0;
|
|
321
|
+
view.setUint32(off, MBJS_MAGIC, true);
|
|
322
|
+
off += 4;
|
|
323
|
+
view.setUint32(off, fp16 ? 3 : 2, true);
|
|
324
|
+
off += 4; // version 2 (fp32) | 3 (fp16)
|
|
325
|
+
view.setUint32(off, nLayers, true);
|
|
326
|
+
off += 4;
|
|
327
|
+
for (let i = 0; i < nLayers; i++) {
|
|
328
|
+
const lt = this.layers[i].layerType;
|
|
329
|
+
view.setUint8(off + i, LAYER_TYPE_ID[lt]);
|
|
330
|
+
}
|
|
331
|
+
off += layerTypeBytes;
|
|
332
|
+
view.setUint32(off, nParams, true);
|
|
333
|
+
off += 4;
|
|
334
|
+
for (const p of params) {
|
|
335
|
+
view.setUint32(off, p.numel, true);
|
|
336
|
+
off += 4;
|
|
337
|
+
}
|
|
338
|
+
// Header bytes are a multiple of 4, so both Float32Array and Uint16Array
|
|
339
|
+
// views below are correctly aligned at `off`.
|
|
340
|
+
if (fp16) {
|
|
341
|
+
for (const arr of arrays) {
|
|
342
|
+
const half = quantizeFp16(arr);
|
|
343
|
+
new Uint16Array(out, off, half.length).set(half);
|
|
344
|
+
off += half.length * 2;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
for (const arr of arrays) {
|
|
349
|
+
new Float32Array(out, off, arr.length).set(arr);
|
|
350
|
+
off += arr.byteLength;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return out;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Load parameters from an MBJS v1, v2, or v3 ArrayBuffer.
|
|
357
|
+
*
|
|
358
|
+
* v1: assumes all layers are mamba1 (backward compatible).
|
|
359
|
+
* v2: reads layer type array and validates per-layer parameter counts (fp32 data).
|
|
360
|
+
* v3: identical layout to v2 but the data section is fp16 (dequantised on load).
|
|
361
|
+
*/
|
|
362
|
+
async loadWeights(buffer) {
|
|
363
|
+
const view = new DataView(buffer);
|
|
364
|
+
let off = 0;
|
|
365
|
+
const magic = view.getUint32(off, true);
|
|
366
|
+
off += 4;
|
|
367
|
+
if (magic !== MBJS_MAGIC) {
|
|
368
|
+
throw new Error('Invalid weight file: bad magic number. Expected MBJS file.');
|
|
369
|
+
}
|
|
370
|
+
const version = view.getUint32(off, true);
|
|
371
|
+
off += 4;
|
|
372
|
+
if (version === 1) {
|
|
373
|
+
// Legacy path: all-mamba1, no layer metadata
|
|
374
|
+
const nParams = view.getUint32(off, true);
|
|
375
|
+
off += 4;
|
|
376
|
+
const params = this.parameters();
|
|
377
|
+
if (nParams !== params.length) {
|
|
378
|
+
throw new Error(`Weight file has ${nParams} parameters but this model has ${params.length}.`);
|
|
379
|
+
}
|
|
380
|
+
const numels = [];
|
|
381
|
+
for (let i = 0; i < nParams; i++) {
|
|
382
|
+
numels.push(view.getUint32(off, true));
|
|
383
|
+
off += 4;
|
|
384
|
+
}
|
|
385
|
+
for (let i = 0; i < nParams; i++) {
|
|
386
|
+
const p = params[i];
|
|
387
|
+
const numel = numels[i];
|
|
388
|
+
if (numel !== p.numel) {
|
|
389
|
+
throw new Error(`Parameter ${i} ("${p.name}") size mismatch: file=${numel}, model=${p.numel}.`);
|
|
390
|
+
}
|
|
391
|
+
uploadBuffer(this.device, p.buf, new Float32Array(buffer, off, p.numel));
|
|
392
|
+
off += p.numel * 4;
|
|
393
|
+
}
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
if (version === 2 || version === 3) {
|
|
397
|
+
const fp16 = version === 3;
|
|
398
|
+
const nLayers = view.getUint32(off, true);
|
|
399
|
+
off += 4;
|
|
400
|
+
if (nLayers !== this.layers.length) {
|
|
401
|
+
throw new Error(`Weight file has ${nLayers} layers but this model has ${this.layers.length}.`);
|
|
402
|
+
}
|
|
403
|
+
// Read layer types and validate
|
|
404
|
+
for (let i = 0; i < nLayers; i++) {
|
|
405
|
+
const typeId = view.getUint8(off + i);
|
|
406
|
+
const expectedType = this.layers[i].layerType;
|
|
407
|
+
const fileType = ID_TO_LAYER_TYPE[typeId] ?? 'mamba1';
|
|
408
|
+
if (fileType !== expectedType) {
|
|
409
|
+
throw new Error(`Layer ${i} type mismatch: file="${fileType}", model="${expectedType}".`);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
const layerTypeBytes = Math.ceil(nLayers / 4) * 4;
|
|
413
|
+
off += layerTypeBytes;
|
|
414
|
+
const nParams = view.getUint32(off, true);
|
|
415
|
+
off += 4;
|
|
416
|
+
const params = this.parameters();
|
|
417
|
+
if (nParams !== params.length) {
|
|
418
|
+
throw new Error(`Weight file has ${nParams} parameters but this model has ${params.length}.`);
|
|
419
|
+
}
|
|
420
|
+
const numels = [];
|
|
421
|
+
for (let i = 0; i < nParams; i++) {
|
|
422
|
+
numels.push(view.getUint32(off, true));
|
|
423
|
+
off += 4;
|
|
424
|
+
}
|
|
425
|
+
for (let i = 0; i < nParams; i++) {
|
|
426
|
+
const p = params[i];
|
|
427
|
+
const numel = numels[i];
|
|
428
|
+
if (numel !== p.numel) {
|
|
429
|
+
throw new Error(`Parameter ${i} ("${p.name}") size mismatch: file=${numel}, model=${p.numel}.`);
|
|
430
|
+
}
|
|
431
|
+
if (fp16) {
|
|
432
|
+
const half = new Uint16Array(buffer, off, numel);
|
|
433
|
+
uploadBuffer(this.device, p.buf, dequantizeFp16(half));
|
|
434
|
+
off += numel * 2;
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
uploadBuffer(this.device, p.buf, new Float32Array(buffer, off, p.numel));
|
|
438
|
+
off += numel * 4;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
throw new Error(`Unsupported MBJS version: ${version}. Expected 1, 2, or 3.`);
|
|
444
|
+
}
|
|
445
|
+
destroy() {
|
|
446
|
+
this.gpuEmbedding.destroy();
|
|
447
|
+
for (const layer of this.layers)
|
|
448
|
+
layer.destroy();
|
|
449
|
+
this.gpuFinalNorm.destroy();
|
|
450
|
+
this.gpuLMHeadBias.destroy();
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// ── MambaModel – backward-compatible alias ────────────────────────────────────
|
|
454
|
+
export class MambaModel extends HybridMambaModel {
|
|
455
|
+
constructor(device, config) {
|
|
456
|
+
super(device, {
|
|
457
|
+
...config,
|
|
458
|
+
layers: Array.from({ length: config.numLayers }, () => ({ type: 'mamba1' })),
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
// ── Embed lookup WGSL ─────────────────────────────────────────────────────────
|
|
463
|
+
const EMBED_LOOKUP_WGSL = /* wgsl */ `
|
|
464
|
+
struct EmbedParams {
|
|
465
|
+
num_tokens : u32,
|
|
466
|
+
d_model : u32,
|
|
467
|
+
};
|
|
468
|
+
|
|
469
|
+
@group(0) @binding(0) var<uniform> params : EmbedParams;
|
|
470
|
+
@group(0) @binding(1) var<storage, read> ids : array<u32>;
|
|
471
|
+
@group(0) @binding(2) var<storage, read> table : array<f32>;
|
|
472
|
+
@group(0) @binding(3) var<storage, read_write> out : array<f32>;
|
|
473
|
+
|
|
474
|
+
@compute @workgroup_size(64, 1, 1)
|
|
475
|
+
fn embed_lookup(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
476
|
+
let token_idx = gid.x;
|
|
477
|
+
if (token_idx >= params.num_tokens) { return; }
|
|
478
|
+
|
|
479
|
+
let D = params.d_model;
|
|
480
|
+
let tok = ids[token_idx];
|
|
481
|
+
let src = tok * D;
|
|
482
|
+
let dst = token_idx * D;
|
|
483
|
+
|
|
484
|
+
for (var i: u32 = 0u; i < D; i = i + 1u) {
|
|
485
|
+
out[dst + i] = table[src + i];
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
`;
|
|
489
|
+
// ── Token sampling ────────────────────────────────────────────────────────────
|
|
490
|
+
function sampleToken(logits, { temperature = 1.0, topK = 50, topP = 0.9 } = {}) {
|
|
491
|
+
const n = logits.length;
|
|
492
|
+
const scaled = new Float32Array(n);
|
|
493
|
+
for (let i = 0; i < n; i++)
|
|
494
|
+
scaled[i] = logits[i] / Math.max(temperature, 1e-7);
|
|
495
|
+
let maxL = -Infinity;
|
|
496
|
+
for (let i = 0; i < n; i++)
|
|
497
|
+
if (scaled[i] > maxL)
|
|
498
|
+
maxL = scaled[i];
|
|
499
|
+
let sumE = 0;
|
|
500
|
+
const exps = new Float32Array(n);
|
|
501
|
+
for (let i = 0; i < n; i++) {
|
|
502
|
+
exps[i] = Math.exp(scaled[i] - maxL);
|
|
503
|
+
sumE += exps[i];
|
|
504
|
+
}
|
|
505
|
+
const indices = Array.from({ length: n }, (_, i) => i).sort((a, b) => exps[b] - exps[a]);
|
|
506
|
+
const topKIdx = indices.slice(0, topK);
|
|
507
|
+
let cumSum = 0;
|
|
508
|
+
const nucleus = [];
|
|
509
|
+
for (const idx of topKIdx) {
|
|
510
|
+
cumSum += exps[idx] / sumE;
|
|
511
|
+
nucleus.push(idx);
|
|
512
|
+
if (cumSum >= topP)
|
|
513
|
+
break;
|
|
514
|
+
}
|
|
515
|
+
let nucleusSum = 0;
|
|
516
|
+
for (const idx of nucleus)
|
|
517
|
+
nucleusSum += exps[idx];
|
|
518
|
+
const threshold = Math.random() * nucleusSum;
|
|
519
|
+
let acc = 0;
|
|
520
|
+
for (const idx of nucleus) {
|
|
521
|
+
acc += exps[idx];
|
|
522
|
+
if (acc >= threshold)
|
|
523
|
+
return idx;
|
|
524
|
+
}
|
|
525
|
+
return nucleus[nucleus.length - 1];
|
|
526
|
+
}
|
|
527
|
+
//# sourceMappingURL=mamba_model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mamba_model.js","sourceRoot":"","sources":["../../src/model/mamba_model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sequence_layer.ts – Common interface implemented by all block types.
|
|
3
|
+
*
|
|
4
|
+
* Mamba1Block, Mamba2Block, Mamba3Block, and AttentionBlock all implement
|
|
5
|
+
* SequenceLayer so that HybridMambaModel can iterate layers generically.
|
|
6
|
+
*/
|
|
7
|
+
export interface LayerForwardResult {
|
|
8
|
+
output: GPUBuffer;
|
|
9
|
+
cache: unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface LayerParam {
|
|
12
|
+
buf: GPUBuffer;
|
|
13
|
+
numel: number;
|
|
14
|
+
name: string;
|
|
15
|
+
}
|
|
16
|
+
export type LayerType = 'mamba1' | 'mamba2' | 'mamba3' | 'attention';
|
|
17
|
+
export interface SequenceLayer {
|
|
18
|
+
readonly layerType: LayerType;
|
|
19
|
+
forward(xBuf: GPUBuffer, batch: number, seqLen: number): LayerForwardResult;
|
|
20
|
+
parameters(): LayerParam[];
|
|
21
|
+
getTrainableParams(): LayerParam[];
|
|
22
|
+
setWSLAMode(enabled: boolean): void;
|
|
23
|
+
destroy(): void;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=sequence_layer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence_layer.d.ts","sourceRoot":"","sources":["../../src/model/sequence_layer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,kBAAkB;IAC/B,MAAM,EAAG,SAAS,CAAC;IACnB,KAAK,EAAI,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACvB,GAAG,EAAK,SAAS,CAAC;IAClB,KAAK,EAAG,MAAM,CAAC;IACf,IAAI,EAAI,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAErE,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAE9B,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAAC;IAC5E,UAAU,IAAI,UAAU,EAAE,CAAC;IAC3B,kBAAkB,IAAI,UAAU,EAAE,CAAC;IACnC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,OAAO,IAAI,IAAI,CAAC;CACnB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sequence_layer.ts – Common interface implemented by all block types.
|
|
3
|
+
*
|
|
4
|
+
* Mamba1Block, Mamba2Block, Mamba3Block, and AttentionBlock all implement
|
|
5
|
+
* SequenceLayer so that HybridMambaModel can iterate layers generically.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=sequence_layer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence_layer.js","sourceRoot":"","sources":["../../src/model/sequence_layer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bpe.ts – Browser-side Byte Pair Encoding (BPE) tokenizer.
|
|
3
|
+
*/
|
|
4
|
+
export interface BPEEncodeOptions {
|
|
5
|
+
addBos?: boolean;
|
|
6
|
+
addEos?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export type PadSide = 'right' | 'left';
|
|
9
|
+
export declare class BPETokenizer {
|
|
10
|
+
vocab: Map<string, number>;
|
|
11
|
+
idToToken: Map<number, string>;
|
|
12
|
+
merges: Map<string, number>;
|
|
13
|
+
bosToken: string;
|
|
14
|
+
eosToken: string;
|
|
15
|
+
padToken: string;
|
|
16
|
+
unkToken: string;
|
|
17
|
+
bosId: number | null;
|
|
18
|
+
eosId: number | null;
|
|
19
|
+
padId: number | null;
|
|
20
|
+
constructor();
|
|
21
|
+
load(vocab: string | Record<string, number>, merges: string | string[]): Promise<void>;
|
|
22
|
+
loadFromObjects(vocabObj: Record<string, number>, mergeArr: string[]): void;
|
|
23
|
+
encode(text: string, opts?: BPEEncodeOptions): number[];
|
|
24
|
+
decode(ids: number[]): string;
|
|
25
|
+
_bpe(word: string): string[];
|
|
26
|
+
padOrTruncate(ids: number[], maxLen: number, side?: PadSide): number[];
|
|
27
|
+
get vocabSize(): number;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=bpe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bpe.d.ts","sourceRoot":"","sources":["../../src/tokenizer/bpe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AA8BvC,qBAAa,YAAY;IACrB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;;IAef,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B5F,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAS3E,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,MAAM,EAAE;IA4B3D,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM;IAgB7B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IA+B5B,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,OAAiB,GAAG,MAAM,EAAE;IAO/E,IAAI,SAAS,IAAI,MAAM,CAA4B;CACtD"}
|