@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.
- package/README.md +14 -0
- package/dist/bench/adaptation.d.ts +57 -0
- package/dist/bench/adaptation.d.ts.map +1 -0
- package/dist/bench/adaptation.js +167 -0
- package/dist/bench/adaptation.js.map +1 -0
- package/dist/bench/harness.d.ts +2 -0
- package/dist/bench/harness.d.ts.map +1 -1
- package/dist/bench/harness.js +1 -1
- package/dist/bench/harness.js.map +1 -1
- package/dist/bench/index.d.ts +5 -3
- package/dist/bench/index.d.ts.map +1 -1
- package/dist/bench/index.js +4 -2
- package/dist/bench/index.js.map +1 -1
- package/dist/bench/types.d.ts +88 -0
- package/dist/bench/types.d.ts.map +1 -1
- package/dist/evermind/adapt.d.ts +40 -0
- package/dist/evermind/adapt.d.ts.map +1 -0
- package/dist/evermind/adapt.js +25 -0
- package/dist/evermind/adapt.js.map +1 -0
- package/dist/evermind/delta_wire.d.ts +43 -0
- package/dist/evermind/delta_wire.d.ts.map +1 -0
- package/dist/evermind/delta_wire.js +94 -0
- package/dist/evermind/delta_wire.js.map +1 -0
- package/dist/evermind/eval.d.ts +31 -0
- package/dist/evermind/eval.d.ts.map +1 -0
- package/dist/evermind/eval.js +36 -0
- package/dist/evermind/eval.js.map +1 -0
- package/dist/evermind/index.d.ts +16 -0
- package/dist/evermind/index.d.ts.map +1 -0
- package/dist/evermind/index.js +11 -0
- package/dist/evermind/index.js.map +1 -0
- package/dist/evermind/merge.d.ts +21 -0
- package/dist/evermind/merge.d.ts.map +1 -0
- package/dist/evermind/merge.js +79 -0
- package/dist/evermind/merge.js.map +1 -0
- package/dist/{moe/moe_package.d.ts → evermind/package.d.ts} +55 -5
- package/dist/evermind/package.d.ts.map +1 -0
- package/dist/{moe/moe_package.js → evermind/package.js} +118 -19
- package/dist/evermind/package.js.map +1 -0
- package/dist/import/foreign/adapter.d.ts +59 -0
- package/dist/import/foreign/adapter.d.ts.map +1 -0
- package/dist/import/foreign/adapter.js +76 -0
- package/dist/import/foreign/adapter.js.map +1 -0
- package/dist/import/foreign/apply.d.ts +23 -0
- package/dist/import/foreign/apply.d.ts.map +1 -0
- package/dist/import/foreign/apply.js +43 -0
- package/dist/import/foreign/apply.js.map +1 -0
- package/dist/import/foreign/codestral_mamba.d.ts +57 -0
- package/dist/import/foreign/codestral_mamba.d.ts.map +1 -0
- package/dist/import/foreign/codestral_mamba.js +174 -0
- package/dist/import/foreign/codestral_mamba.js.map +1 -0
- package/dist/import/foreign/falcon_mamba.d.ts +51 -0
- package/dist/import/foreign/falcon_mamba.d.ts.map +1 -0
- package/dist/import/foreign/falcon_mamba.js +131 -0
- package/dist/import/foreign/falcon_mamba.js.map +1 -0
- package/dist/import/foreign/index.d.ts +21 -0
- package/dist/import/foreign/index.d.ts.map +1 -0
- package/dist/import/foreign/index.js +18 -0
- package/dist/import/foreign/index.js.map +1 -0
- package/dist/import/foreign/plan.d.ts +122 -0
- package/dist/import/foreign/plan.d.ts.map +1 -0
- package/dist/import/foreign/plan.js +171 -0
- package/dist/import/foreign/plan.js.map +1 -0
- package/dist/import/foreign/registry.d.ts +35 -0
- package/dist/import/foreign/registry.d.ts.map +1 -0
- package/dist/import/foreign/registry.js +89 -0
- package/dist/import/foreign/registry.js.map +1 -0
- package/dist/import/index.d.ts +7 -0
- package/dist/import/index.d.ts.map +1 -1
- package/dist/import/index.js +7 -0
- package/dist/import/index.js.map +1 -1
- package/dist/index.d.ts +25 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -9
- package/dist/index.js.map +1 -1
- package/dist/kernels/selective_scan.d.ts.map +1 -1
- package/dist/kernels/selective_scan.js +15 -9
- package/dist/kernels/selective_scan.js.map +1 -1
- package/dist/kernels/slice.d.ts +26 -0
- package/dist/kernels/slice.d.ts.map +1 -0
- package/dist/kernels/slice.js +52 -0
- package/dist/kernels/slice.js.map +1 -0
- package/dist/kernels/weight_update.d.ts.map +1 -1
- package/dist/kernels/weight_update.js +30 -4
- package/dist/kernels/weight_update.js.map +1 -1
- package/dist/lm/evermind_lm.d.ts +110 -1
- package/dist/lm/evermind_lm.d.ts.map +1 -1
- package/dist/lm/evermind_lm.js +220 -35
- package/dist/lm/evermind_lm.js.map +1 -1
- package/dist/lm/index.d.ts +4 -2
- package/dist/lm/index.d.ts.map +1 -1
- package/dist/lm/index.js +3 -1
- package/dist/lm/index.js.map +1 -1
- package/dist/lm/text_embedder.d.ts +55 -0
- package/dist/lm/text_embedder.d.ts.map +1 -0
- package/dist/lm/text_embedder.js +62 -0
- package/dist/lm/text_embedder.js.map +1 -0
- package/dist/model/attention_block.d.ts.map +1 -1
- package/dist/model/attention_block.js +9 -5
- package/dist/model/attention_block.js.map +1 -1
- package/dist/model/mamba1_block.d.ts.map +1 -1
- package/dist/model/mamba1_block.js +28 -12
- package/dist/model/mamba1_block.js.map +1 -1
- package/dist/model/mamba2_block.d.ts.map +1 -1
- package/dist/model/mamba2_block.js +14 -9
- package/dist/model/mamba2_block.js.map +1 -1
- package/dist/model/mamba3_block.d.ts.map +1 -1
- package/dist/model/mamba3_block.js +14 -9
- package/dist/model/mamba3_block.js.map +1 -1
- package/dist/moe/index.d.ts +0 -2
- package/dist/moe/index.d.ts.map +1 -1
- package/dist/moe/index.js +0 -1
- package/dist/moe/index.js.map +1 -1
- package/dist/optim/adamw.d.ts +32 -0
- package/dist/optim/adamw.d.ts.map +1 -1
- package/dist/optim/adamw.js +34 -0
- package/dist/optim/adamw.js.map +1 -1
- package/dist/tokenizer/bpe.d.ts +28 -0
- package/dist/tokenizer/bpe.d.ts.map +1 -1
- package/dist/tokenizer/bpe.js +47 -0
- package/dist/tokenizer/bpe.js.map +1 -1
- package/dist/training/cpu_ops.d.ts +44 -0
- package/dist/training/cpu_ops.d.ts.map +1 -0
- package/dist/training/cpu_ops.js +111 -0
- package/dist/training/cpu_ops.js.map +1 -0
- package/dist/training/mamba1_cpu.d.ts +109 -0
- package/dist/training/mamba1_cpu.d.ts.map +1 -0
- package/dist/training/mamba1_cpu.js +316 -0
- package/dist/training/mamba1_cpu.js.map +1 -0
- package/dist/training/model_cpu.d.ts +100 -0
- package/dist/training/model_cpu.d.ts.map +1 -0
- package/dist/training/model_cpu.js +252 -0
- package/dist/training/model_cpu.js.map +1 -0
- package/dist/training/trainer.d.ts +156 -16
- package/dist/training/trainer.d.ts.map +1 -1
- package/dist/training/trainer.js +327 -101
- package/dist/training/trainer.js.map +1 -1
- package/dist/utils/base64.d.ts +12 -0
- package/dist/utils/base64.d.ts.map +1 -0
- package/dist/utils/base64.js +27 -0
- package/dist/utils/base64.js.map +1 -0
- package/package.json +3 -1
- package/src/bench/adaptation.ts +180 -0
- package/src/bench/harness.ts +1 -1
- package/src/bench/index.ts +13 -2
- package/src/bench/types.ts +93 -0
- package/src/evermind/adapt.ts +61 -0
- package/src/evermind/delta_wire.ts +114 -0
- package/src/evermind/eval.ts +62 -0
- package/src/evermind/index.ts +33 -0
- package/src/evermind/merge.ts +106 -0
- package/src/{moe/moe_package.ts → evermind/package.ts} +148 -17
- package/src/import/foreign/adapter.ts +106 -0
- package/src/import/foreign/apply.ts +54 -0
- package/src/import/foreign/codestral_mamba.ts +224 -0
- package/src/import/foreign/falcon_mamba.ts +173 -0
- package/src/import/foreign/index.ts +37 -0
- package/src/import/foreign/plan.ts +294 -0
- package/src/import/foreign/registry.ts +126 -0
- package/src/import/index.ts +30 -0
- package/src/index.ts +98 -13
- package/src/kernels/selective_scan.ts +15 -9
- package/src/kernels/slice.ts +64 -0
- package/src/kernels/weight_update.ts +30 -4
- package/src/lm/evermind_lm.ts +244 -34
- package/src/lm/index.ts +6 -2
- package/src/lm/text_embedder.ts +84 -0
- package/src/model/attention_block.ts +9 -5
- package/src/model/mamba1_block.ts +28 -12
- package/src/model/mamba2_block.ts +14 -9
- package/src/model/mamba3_block.ts +14 -9
- package/src/moe/index.ts +0 -9
- package/src/optim/adamw.ts +60 -0
- package/src/tokenizer/bpe.ts +55 -0
- package/src/training/cpu_ops.ts +127 -0
- package/src/training/mamba1_cpu.ts +421 -0
- package/src/training/model_cpu.ts +360 -0
- package/src/training/trainer.ts +397 -154
- package/src/utils/base64.ts +28 -0
- package/dist/model/mamba_block.d.ts +0 -64
- package/dist/model/mamba_block.d.ts.map +0 -1
- package/dist/model/mamba_block.js +0 -303
- package/dist/model/mamba_block.js.map +0 -1
- package/dist/moe/moe_package.d.ts.map +0 -1
- package/dist/moe/moe_package.js.map +0 -1
- package/src/model/mamba_block.ts +0 -401
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* evermind/package.ts — EvermindModelPackage: the portable, publishable AI artifact.
|
|
3
3
|
*
|
|
4
4
|
* This is the unit a creator publishes to the marketplace and a buyer downloads
|
|
5
5
|
* and runs: a self-describing manifest (name, version, config, model card,
|
|
@@ -10,9 +10,10 @@
|
|
|
10
10
|
* Zero-dep and isomorphic: serialises via TextEncoder/TextDecoder, runs in the
|
|
11
11
|
* browser (where models are trained) and in Node/Workers (where they execute).
|
|
12
12
|
*/
|
|
13
|
-
import { SharedExpertMoE } from "
|
|
13
|
+
import { SharedExpertMoE } from "../moe/moe_model.js";
|
|
14
14
|
import { EvermindLM } from "../lm/evermind_lm.js";
|
|
15
15
|
import { VideoRVQCodec } from "../codec/video_rvq.js";
|
|
16
|
+
import { BPETokenizer } from "../tokenizer/bpe.js";
|
|
16
17
|
/** First 4 bytes of a serialised package: "EVM1". */
|
|
17
18
|
const PKG_MAGIC = 0x45564d31;
|
|
18
19
|
const PKG_VERSION = 1;
|
|
@@ -34,17 +35,47 @@ export class EvermindModelPackage {
|
|
|
34
35
|
manifest;
|
|
35
36
|
checkpoint;
|
|
36
37
|
codec;
|
|
38
|
+
tokenizer;
|
|
37
39
|
constructor(manifest, checkpoint,
|
|
38
40
|
/** Serialized media codec ("VRQ0" blob), present for video/image packages. */
|
|
39
|
-
codec
|
|
41
|
+
codec,
|
|
42
|
+
/** Serialized BPE tokenizer ("BPE0" blob) — present when the package embeds one. */
|
|
43
|
+
tokenizer) {
|
|
40
44
|
this.manifest = manifest;
|
|
41
45
|
this.checkpoint = checkpoint;
|
|
42
46
|
this.codec = codec;
|
|
47
|
+
this.tokenizer = tokenizer;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Serialise `meta.tokenizer` and the manifest fields describing it, or `{}` when
|
|
51
|
+
* no tokenizer was supplied. Shared by every `from*` factory so the vocab-size
|
|
52
|
+
* cross-check exists in exactly one place.
|
|
53
|
+
*/
|
|
54
|
+
static _tokenizerSection(meta, modelVocabSize) {
|
|
55
|
+
if (!meta.tokenizer)
|
|
56
|
+
return { fields: {} };
|
|
57
|
+
const vocabSize = meta.tokenizer.vocabSize;
|
|
58
|
+
if (modelVocabSize != null && vocabSize !== modelVocabSize) {
|
|
59
|
+
throw new Error(`EvermindModelPackage: tokenizer vocabSize (${vocabSize}) must equal the model's (${modelVocabSize}) — ` +
|
|
60
|
+
"a mismatched pair decodes to nonsense.");
|
|
61
|
+
}
|
|
62
|
+
const blob = meta.tokenizer.serialize();
|
|
63
|
+
return {
|
|
64
|
+
blob,
|
|
65
|
+
fields: {
|
|
66
|
+
tokenizerFormat: "BPE0",
|
|
67
|
+
tokenizerBytes: blob.byteLength,
|
|
68
|
+
tokenizerChecksum: fnv1a(new Uint8Array(blob)),
|
|
69
|
+
tokenizerVocabSize: vocabSize,
|
|
70
|
+
},
|
|
71
|
+
};
|
|
43
72
|
}
|
|
44
73
|
/** Package a trained model with its publishing metadata. */
|
|
45
74
|
static fromModel(model, meta) {
|
|
46
75
|
const fp16 = meta.fp16 ?? false;
|
|
47
76
|
const checkpoint = model.exportWeights({ fp16 });
|
|
77
|
+
// A bare MoE layer has no vocabulary of its own, so there is nothing to cross-check.
|
|
78
|
+
const tokenizer = EvermindModelPackage._tokenizerSection(meta, undefined);
|
|
48
79
|
const manifest = {
|
|
49
80
|
schema: "evermind.model/1",
|
|
50
81
|
name: meta.name,
|
|
@@ -54,16 +85,19 @@ export class EvermindModelPackage {
|
|
|
54
85
|
paramCount: model.parameters().reduce((n, p) => n + p.numel, 0),
|
|
55
86
|
checkpointFormat: "MoE0",
|
|
56
87
|
checkpointFp16: fp16,
|
|
88
|
+
...(tokenizer.blob ? { checkpointBytes: checkpoint.byteLength } : {}),
|
|
57
89
|
checksum: fnv1a(new Uint8Array(checkpoint)),
|
|
90
|
+
...tokenizer.fields,
|
|
58
91
|
card: meta.card,
|
|
59
92
|
...(meta.createdAt ? { createdAt: meta.createdAt } : {}),
|
|
60
93
|
};
|
|
61
|
-
return new EvermindModelPackage(manifest, checkpoint);
|
|
94
|
+
return new EvermindModelPackage(manifest, checkpoint, undefined, tokenizer.blob);
|
|
62
95
|
}
|
|
63
96
|
/** Package a trained generative {@link EvermindLM} — the runnable marketplace AI. */
|
|
64
97
|
static fromLM(lm, meta) {
|
|
65
98
|
const fp16 = meta.fp16 ?? false;
|
|
66
99
|
const checkpoint = lm.exportWeights({ fp16 });
|
|
100
|
+
const tokenizer = EvermindModelPackage._tokenizerSection(meta, lm.config.vocabSize);
|
|
67
101
|
const manifest = {
|
|
68
102
|
schema: "evermind.model/1",
|
|
69
103
|
name: meta.name,
|
|
@@ -73,11 +107,13 @@ export class EvermindModelPackage {
|
|
|
73
107
|
paramCount: lm.parameters().reduce((n, p) => n + p.data.length, 0),
|
|
74
108
|
checkpointFormat: "EVL0",
|
|
75
109
|
checkpointFp16: fp16,
|
|
110
|
+
...(tokenizer.blob ? { checkpointBytes: checkpoint.byteLength } : {}),
|
|
76
111
|
checksum: fnv1a(new Uint8Array(checkpoint)),
|
|
112
|
+
...tokenizer.fields,
|
|
77
113
|
card: meta.card,
|
|
78
114
|
...(meta.createdAt ? { createdAt: meta.createdAt } : {}),
|
|
79
115
|
};
|
|
80
|
-
return new EvermindModelPackage(manifest, checkpoint);
|
|
116
|
+
return new EvermindModelPackage(manifest, checkpoint, undefined, tokenizer.blob);
|
|
81
117
|
}
|
|
82
118
|
/**
|
|
83
119
|
* Package a video/image generative model: its {@link EvermindLM} weights AND the
|
|
@@ -92,6 +128,7 @@ export class EvermindModelPackage {
|
|
|
92
128
|
const fp16 = meta.fp16 ?? false;
|
|
93
129
|
const checkpoint = lm.exportWeights({ fp16 });
|
|
94
130
|
const codecBlob = codec.serialize();
|
|
131
|
+
const tokenizer = EvermindModelPackage._tokenizerSection(meta, lm.config.vocabSize);
|
|
95
132
|
const manifest = {
|
|
96
133
|
schema: "evermind.model/1",
|
|
97
134
|
name: meta.name,
|
|
@@ -105,18 +142,25 @@ export class EvermindModelPackage {
|
|
|
105
142
|
checkpointBytes: checkpoint.byteLength,
|
|
106
143
|
checksum: fnv1a(new Uint8Array(checkpoint)),
|
|
107
144
|
codecFormat: "VRQ0",
|
|
145
|
+
...(tokenizer.blob ? { codecBytes: codecBlob.byteLength } : {}),
|
|
108
146
|
codecChecksum: fnv1a(new Uint8Array(codecBlob)),
|
|
147
|
+
...tokenizer.fields,
|
|
109
148
|
card: meta.card,
|
|
110
149
|
...(meta.createdAt ? { createdAt: meta.createdAt } : {}),
|
|
111
150
|
};
|
|
112
|
-
return new EvermindModelPackage(manifest, checkpoint, codecBlob);
|
|
151
|
+
return new EvermindModelPackage(manifest, checkpoint, codecBlob, tokenizer.blob);
|
|
113
152
|
}
|
|
114
|
-
/**
|
|
153
|
+
/**
|
|
154
|
+
* Serialise to a single `.evermind` blob: magic, version, manifest, checkpoint
|
|
155
|
+
* [, codec][, tokenizer]. Each section's length is fixed in the manifest whenever
|
|
156
|
+
* another section follows it, so the reader never has to guess where one ends.
|
|
157
|
+
*/
|
|
115
158
|
toBlob() {
|
|
116
159
|
const manifestBytes = new TextEncoder().encode(JSON.stringify(this.manifest));
|
|
117
160
|
const headerBytes = 12; // magic, version, manifestLen
|
|
118
161
|
const codecBytes = this.codec?.byteLength ?? 0;
|
|
119
|
-
const
|
|
162
|
+
const tokBytes = this.tokenizer?.byteLength ?? 0;
|
|
163
|
+
const out = new ArrayBuffer(headerBytes + manifestBytes.byteLength + this.checkpoint.byteLength + codecBytes + tokBytes);
|
|
120
164
|
const head = new Uint32Array(out, 0, 3);
|
|
121
165
|
head[0] = PKG_MAGIC;
|
|
122
166
|
head[1] = PKG_VERSION;
|
|
@@ -126,8 +170,12 @@ export class EvermindModelPackage {
|
|
|
126
170
|
o += manifestBytes.byteLength;
|
|
127
171
|
new Uint8Array(out, o, this.checkpoint.byteLength).set(new Uint8Array(this.checkpoint));
|
|
128
172
|
o += this.checkpoint.byteLength;
|
|
129
|
-
if (this.codec)
|
|
173
|
+
if (this.codec) {
|
|
130
174
|
new Uint8Array(out, o, codecBytes).set(new Uint8Array(this.codec));
|
|
175
|
+
o += codecBytes;
|
|
176
|
+
}
|
|
177
|
+
if (this.tokenizer)
|
|
178
|
+
new Uint8Array(out, o, tokBytes).set(new Uint8Array(this.tokenizer));
|
|
131
179
|
return out;
|
|
132
180
|
}
|
|
133
181
|
/** Parse a `.evermind` blob. Throws on bad magic / truncation. */
|
|
@@ -145,18 +193,34 @@ export class EvermindModelPackage {
|
|
|
145
193
|
const manifestBytes = new Uint8Array(buffer, headerBytes, manifestLen);
|
|
146
194
|
const manifest = JSON.parse(new TextDecoder().decode(manifestBytes));
|
|
147
195
|
const bodyStart = headerBytes + manifestLen;
|
|
148
|
-
//
|
|
149
|
-
//
|
|
196
|
+
// Sections run checkpoint -> codec -> tokenizer, each present only when the
|
|
197
|
+
// manifest says so. A section's length is explicit whenever another follows it;
|
|
198
|
+
// the last section runs to end-of-blob. That keeps every package written before
|
|
199
|
+
// the codec and tokenizer sections existed readable byte for byte.
|
|
150
200
|
const cpBytes = manifest.checkpointBytes;
|
|
151
|
-
if (cpBytes
|
|
152
|
-
|
|
153
|
-
|
|
201
|
+
if (cpBytes == null)
|
|
202
|
+
return new EvermindModelPackage(manifest, buffer.slice(bodyStart));
|
|
203
|
+
if (bodyStart + cpBytes > buffer.byteLength) {
|
|
204
|
+
throw new Error("EvermindModelPackage.fromBlob: truncated (checkpointBytes exceeds blob)");
|
|
205
|
+
}
|
|
206
|
+
const checkpoint = buffer.slice(bodyStart, bodyStart + cpBytes);
|
|
207
|
+
let o = bodyStart + cpBytes;
|
|
208
|
+
const tokBytes = manifest.tokenizerBytes ?? 0;
|
|
209
|
+
if (o + tokBytes > buffer.byteLength) {
|
|
210
|
+
throw new Error("EvermindModelPackage.fromBlob: truncated (tokenizerBytes exceeds blob)");
|
|
211
|
+
}
|
|
212
|
+
const tokStart = buffer.byteLength - tokBytes;
|
|
213
|
+
let codec;
|
|
214
|
+
if (o < tokStart) {
|
|
215
|
+
const codecEnd = manifest.codecBytes != null ? o + manifest.codecBytes : tokStart;
|
|
216
|
+
if (codecEnd > tokStart) {
|
|
217
|
+
throw new Error("EvermindModelPackage.fromBlob: truncated (codecBytes overruns the tokenizer section)");
|
|
154
218
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
return new EvermindModelPackage(manifest, checkpoint, codec);
|
|
219
|
+
codec = buffer.slice(o, codecEnd);
|
|
220
|
+
o = codecEnd;
|
|
158
221
|
}
|
|
159
|
-
|
|
222
|
+
const tokenizer = tokBytes > 0 ? buffer.slice(tokStart) : undefined;
|
|
223
|
+
return new EvermindModelPackage(manifest, checkpoint, codec, tokenizer);
|
|
160
224
|
}
|
|
161
225
|
/** Verify integrity + structural sanity before trusting a downloaded package. */
|
|
162
226
|
validate() {
|
|
@@ -195,8 +259,43 @@ export class EvermindModelPackage {
|
|
|
195
259
|
}
|
|
196
260
|
}
|
|
197
261
|
}
|
|
262
|
+
// An embedded tokenizer must be intact AND agree with the model's vocabulary —
|
|
263
|
+
// a corrupt or mismatched one decodes confidently into nonsense.
|
|
264
|
+
if (this.manifest.tokenizerFormat) {
|
|
265
|
+
if (!this.tokenizer) {
|
|
266
|
+
errors.push("manifest declares an embedded tokenizer but the package has no tokenizer section");
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
const tokActual = fnv1a(new Uint8Array(this.tokenizer));
|
|
270
|
+
if (tokActual !== this.manifest.tokenizerChecksum) {
|
|
271
|
+
errors.push(`tokenizer checksum mismatch (manifest ${this.manifest.tokenizerChecksum}, actual ${tokActual}) - corrupt tokenizer`);
|
|
272
|
+
}
|
|
273
|
+
const modelVocab = this.manifest.config?.['vocabSize'];
|
|
274
|
+
const tokVocab = this.manifest.tokenizerVocabSize;
|
|
275
|
+
if (modelVocab != null && tokVocab != null && modelVocab !== tokVocab) {
|
|
276
|
+
errors.push(`tokenizer vocabSize (${tokVocab}) does not match the model's (${modelVocab})`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
198
280
|
return { ok: errors.length === 0, errors };
|
|
199
281
|
}
|
|
282
|
+
/**
|
|
283
|
+
* The tokenizer embedded in this package, or `null` when it carries none.
|
|
284
|
+
*
|
|
285
|
+
* A package WITH one is self-contained: a consumer runs `loadLM()` +
|
|
286
|
+
* `loadTokenizer()` and can turn text into tokens and back with the exact
|
|
287
|
+
* vocabulary the model was trained on. A package without one still loads — every
|
|
288
|
+
* artifact published before this section existed is in that shape — but the
|
|
289
|
+
* consumer must supply the matching vocabulary itself.
|
|
290
|
+
*/
|
|
291
|
+
loadTokenizer() {
|
|
292
|
+
if (!this.manifest.tokenizerFormat || !this.tokenizer)
|
|
293
|
+
return null;
|
|
294
|
+
const v = this.validate();
|
|
295
|
+
if (!v.ok)
|
|
296
|
+
throw new Error(`EvermindModelPackage.loadTokenizer: ${v.errors.join("; ")}`);
|
|
297
|
+
return BPETokenizer.deserialize(this.tokenizer);
|
|
298
|
+
}
|
|
200
299
|
/** Reconstruct the bare MoE layer. Validates first; throws if invalid / wrong type. */
|
|
201
300
|
loadModel() {
|
|
202
301
|
const v = this.validate();
|
|
@@ -237,4 +336,4 @@ export class EvermindModelPackage {
|
|
|
237
336
|
return { lm: this.loadLM(), codec: VideoRVQCodec.deserialize(this.codec), modality };
|
|
238
337
|
}
|
|
239
338
|
}
|
|
240
|
-
//# sourceMappingURL=
|
|
339
|
+
//# sourceMappingURL=package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/evermind/package.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,eAAe,EAAkB,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAyB,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,qDAAqD;AACrD,MAAM,SAAS,GAAG,UAAU,CAAC;AAC7B,MAAM,WAAW,GAAG,CAAC,CAAC;AAyFtB,gFAAgF;AAChF,SAAS,KAAK,CAAC,KAAiB;IAC9B,IAAI,CAAC,GAAG,UAAU,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC;QACf,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IAEpB;IACA;IAEA;IAEA;IANX,YACW,QAA+B,EAC/B,UAAuB;IAChC,8EAA8E;IACrE,KAAmB;IAC5B,oFAAoF;IAC3E,SAAuB;QALvB,aAAQ,GAAR,QAAQ,CAAuB;QAC/B,eAAU,GAAV,UAAU,CAAa;QAEvB,UAAK,GAAL,KAAK,CAAc;QAEnB,cAAS,GAAT,SAAS,CAAc;IAC/B,CAAC;IAEJ;;;;OAIG;IACK,MAAM,CAAC,iBAAiB,CAC9B,IAAiB,EACjB,cAAkC;QAElC,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QAC3C,IAAI,cAAc,IAAI,IAAI,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CACb,8CAA8C,SAAS,6BAA6B,cAAc,MAAM;gBACxG,wCAAwC,CACzC,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QACxC,OAAO;YACL,IAAI;YACJ,MAAM,EAAE;gBACN,eAAe,EAAE,MAAM;gBACvB,cAAc,EAAE,IAAI,CAAC,UAAU;gBAC/B,iBAAiB,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC9C,kBAAkB,EAAE,SAAS;aAC9B;SACF,CAAC;IACJ,CAAC;IAED,4DAA4D;IAC5D,MAAM,CAAC,SAAS,CAAC,KAAsB,EAAE,IAAiB;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;QAChC,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,qFAAqF;QACrF,MAAM,SAAS,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAA0B;YACtC,MAAM,EAAE,kBAAkB;YAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,mBAAmB;YAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/D,gBAAgB,EAAE,MAAM;YACxB,cAAc,EAAE,IAAI;YACpB,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,QAAQ,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;YAC3C,GAAG,SAAS,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC;QACF,OAAO,IAAI,oBAAoB,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC;IAED,qFAAqF;IACrF,MAAM,CAAC,MAAM,CAAC,EAAc,EAAE,IAAiB;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;QAChC,MAAM,UAAU,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACpF,MAAM,QAAQ,GAA0B;YACtC,MAAM,EAAE,kBAAkB;YAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,aAAa;YACxB,MAAM,EAAE,EAAE,CAAC,MAA2C;YACtD,UAAU,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAClE,gBAAgB,EAAE,MAAM;YACxB,cAAc,EAAE,IAAI;YACpB,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,QAAQ,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;YAC3C,GAAG,SAAS,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC;QACF,OAAO,IAAI,oBAAoB,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAChB,EAAc,EACd,KAAoB,EACpB,IAAmD;QAEnD,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACb,8BAA8B,EAAE,CAAC,MAAM,CAAC,SAAS,iCAAiC,KAAK,CAAC,SAAS,GAAG,CACrG,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;QAChC,MAAM,UAAU,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACpF,MAAM,QAAQ,GAA0B;YACtC,MAAM,EAAE,kBAAkB;YAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,aAAa;YACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,EAAE,CAAC,MAA2C;YACtD,UAAU,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAClE,gBAAgB,EAAE,MAAM;YACxB,cAAc,EAAE,IAAI;YACpB,eAAe,EAAE,UAAU,CAAC,UAAU;YACtC,QAAQ,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;YAC3C,WAAW,EAAE,MAAM;YACnB,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,aAAa,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;YAC/C,GAAG,SAAS,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC;QACF,OAAO,IAAI,oBAAoB,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC;IAED;;;;OAIG;IACH,MAAM;QACJ,MAAM,aAAa,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9E,MAAM,WAAW,GAAG,EAAE,CAAC,CAAC,8BAA8B;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,IAAI,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,WAAW,CACzB,WAAW,GAAG,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,UAAU,GAAG,QAAQ,CAC5F,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACpB,IAAI,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;QACtB,IAAI,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,GAAG,WAAW,CAAC;QACpB,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACpE,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC;QAC9B,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACxF,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAChC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACnE,CAAC,IAAI,UAAU,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,CAAC,SAAS;YAAE,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACzF,OAAO,GAAG,CAAC;IACb,CAAC;IAGD,kEAAkE;IAClE,MAAM,CAAC,QAAQ,CAAC,MAAmB;QACjC,IAAI,MAAM,CAAC,UAAU,GAAG,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACpG,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QAClH,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,IAAI,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAA0B,CAAC;QAC9F,MAAM,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;QAC5C,4EAA4E;QAC5E,gFAAgF;QAChF,gFAAgF;QAChF,mEAAmE;QACnE,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC;QACzC,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,IAAI,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QACxF,IAAI,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC;QAE5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC;QAE9C,IAAI,KAA8B,CAAC;QACnC,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;YAClF,IAAI,QAAQ,GAAG,QAAQ,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;YAC1G,CAAC;YACD,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAClC,CAAC,GAAG,QAAQ,CAAC;QACf,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,OAAO,IAAI,oBAAoB,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC1E,CAAC;IAED,iFAAiF;IACjF,QAAQ;QACN,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,kBAAkB;YAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACxG,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC/B,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,mBAAmB,EAAE,CAAC;YACpD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAS,IAAI,CAAC,IAAI,CAAC,CAAC,SAAU,IAAI,CAAC,IAAI,CAAC,CAAC,UAAW,IAAI,CAAC,IAAI,CAAC,CAAC,IAAK,GAAG,CAAC,IAAI,CAAC,CAAC,IAAK,GAAG,CAAC,CAAC,UAAW,EAAE,CAAC;gBAChH,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,aAAa,EAAE,CAAC;YACrD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAU,IAAI,CAAC,IAAI,CAAC,CAAC,MAAO,IAAI,CAAC,IAAI,CAAC,CAAC,SAAU,IAAI,CAAC,IAAI,CAAC,CAAC,UAAW,IAAI,CAAC,IAAI,CAAC,CAAC,IAAK,GAAG,CAAC,IAAI,CAAC,CAAC,IAAK,GAAG,CAAC,CAAC,UAAW,EAAE,CAAC;gBACnI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACtD,IAAI,MAAM,KAAK,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,+BAA+B,IAAI,CAAC,QAAQ,CAAC,QAAQ,YAAY,MAAM,oCAAoC,CAAC,CAAC;QAC3H,CAAC;QACD,2EAA2E;QAC3E,qCAAqC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,MAAM,CAAC;QAClD,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,aAAa,QAAQ,wCAAwC,CAAC,CAAC;YAC7E,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtD,IAAI,WAAW,KAAK,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;oBAChD,MAAM,CAAC,IAAI,CAAC,qCAAqC,IAAI,CAAC,QAAQ,CAAC,aAAa,YAAY,WAAW,mBAAmB,CAAC,CAAC;gBAC1H,CAAC;YACH,CAAC;QACH,CAAC;QACD,+EAA+E;QAC/E,iEAAiE;QACjE,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;YAClG,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;gBACxD,IAAI,SAAS,KAAK,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;oBAClD,MAAM,CAAC,IAAI,CACT,yCAAyC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,YAAY,SAAS,uBAAuB,CACrH,CAAC;gBACJ,CAAC;gBACD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC;gBACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;gBAClD,IAAI,UAAU,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;oBACtE,MAAM,CAAC,IAAI,CAAC,wBAAwB,QAAQ,iCAAiC,UAAU,GAAG,CAAC,CAAC;gBAC9F,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7C,CAAC;IAED;;;;;;;;OAQG;IACH,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QACnE,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzF,OAAO,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;IAED,uFAAuF;IACvF,SAAS;QACP,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrF,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,mBAAmB,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,QAAQ,CAAC,SAAS,iBAAiB,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,MAA4B,CAAC,CAAC;QAC9E,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iFAAiF;IACjF,MAAM;QACJ,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClF,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,aAAa,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,QAAQ,CAAC,SAAS,oBAAoB,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAqC,CAAC,CAAC;QAC/E,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;;OAIG;IACH,WAAW;QACT,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,MAAM,CAAC;QAClD,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,iBAAiB,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,KAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxF,CAAC;CACF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* import/foreign/adapter.ts — what every foreign-architecture adapter provides,
|
|
3
|
+
* plus the shared `config.json` readers so no adapter re-implements them.
|
|
4
|
+
*
|
|
5
|
+
* An adapter answers two questions about a published checkpoint:
|
|
6
|
+
* 1. what {@link HybridMambaModelConfig} do these weights fit? and
|
|
7
|
+
* 2. which {@link PortPlan} moves them onto this engine's parameters?
|
|
8
|
+
* Everything downstream (detection, execution, upload) is architecture-agnostic.
|
|
9
|
+
*/
|
|
10
|
+
import type { HybridMambaModelConfig } from "../../model/mamba_model.js";
|
|
11
|
+
import type { PortPlan } from "./plan.js";
|
|
12
|
+
/** A checkpoint's parsed `config.json` (HF) or `params.json` (Mistral-native). */
|
|
13
|
+
export type ForeignConfig = Record<string, unknown>;
|
|
14
|
+
/** Everything a port needs to know about one checkpoint. */
|
|
15
|
+
export interface PortTarget {
|
|
16
|
+
/** Construct a `HybridMambaModel` with this to receive the ported weights. */
|
|
17
|
+
modelConfig: HybridMambaModelConfig;
|
|
18
|
+
plan: PortPlan;
|
|
19
|
+
}
|
|
20
|
+
export interface ForeignMambaAdapter {
|
|
21
|
+
/** Stable id, e.g. `falcon_mamba`. */
|
|
22
|
+
readonly id: string;
|
|
23
|
+
/** Human-readable label for errors and reports. */
|
|
24
|
+
readonly label: string;
|
|
25
|
+
/** `config.model_type` values this adapter claims. */
|
|
26
|
+
readonly modelTypes: readonly string[];
|
|
27
|
+
/** `config.architectures[]` entries this adapter claims. */
|
|
28
|
+
readonly architectures: readonly string[];
|
|
29
|
+
/** Read the checkpoint's geometry and build its port plan. */
|
|
30
|
+
describe(config: ForeignConfig): PortTarget;
|
|
31
|
+
}
|
|
32
|
+
/** A positive integer field, required. */
|
|
33
|
+
export declare function requireInt(config: ForeignConfig, key: string): number;
|
|
34
|
+
/** The first of `keys` present as a positive integer, else `undefined`. */
|
|
35
|
+
export declare function firstInt(config: ForeignConfig, keys: readonly string[]): number | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* The mixer's inner width.
|
|
38
|
+
*
|
|
39
|
+
* `intermediate_size` is authoritative and `expand` is NOT trustworthy:
|
|
40
|
+
* `tiiuae/falcon-mamba-7b` ships `expand: 16` against `hidden_size: 4096` while
|
|
41
|
+
* its weights are `d_inner = 8192`. Transformers only tolerates it because the
|
|
42
|
+
* JSON's `intermediate_size` is re-applied over the derived value, so a port
|
|
43
|
+
* that trusted `expand` would build a model 8× too wide. Fall back to
|
|
44
|
+
* `expand * hidden_size` only when `intermediate_size` is absent.
|
|
45
|
+
*/
|
|
46
|
+
export declare function readInnerSize(config: ForeignConfig, dModel: number): number;
|
|
47
|
+
/**
|
|
48
|
+
* `d_inner / d_model` as this engine's integer `expand` factor — the blocks size
|
|
49
|
+
* themselves from it, so a non-integer ratio cannot be represented and must fail
|
|
50
|
+
* loudly rather than silently truncate.
|
|
51
|
+
*/
|
|
52
|
+
export declare function expandFactor(dInner: number, dModel: number, label: string): number;
|
|
53
|
+
/**
|
|
54
|
+
* `time_step_rank`, resolving HF's `"auto"` to `ceil(hidden_size / 16)` — the
|
|
55
|
+
* same default `Mamba1Block` applies, so an `"auto"` checkpoint and this engine
|
|
56
|
+
* agree without the caller doing anything.
|
|
57
|
+
*/
|
|
58
|
+
export declare function readTimeStepRank(config: ForeignConfig, dModel: number): number;
|
|
59
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/import/foreign/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,kFAAkF;AAClF,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD,4DAA4D;AAC5D,MAAM,WAAW,UAAU;IACzB,8EAA8E;IAC9E,WAAW,EAAE,sBAAsB,CAAC;IACpC,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,4DAA4D;IAC5D,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC;CAC7C;AAQD,0CAA0C;AAC1C,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAMrE;AAED,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAM3F;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ3E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQlF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAK9E"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* import/foreign/adapter.ts — what every foreign-architecture adapter provides,
|
|
3
|
+
* plus the shared `config.json` readers so no adapter re-implements them.
|
|
4
|
+
*
|
|
5
|
+
* An adapter answers two questions about a published checkpoint:
|
|
6
|
+
* 1. what {@link HybridMambaModelConfig} do these weights fit? and
|
|
7
|
+
* 2. which {@link PortPlan} moves them onto this engine's parameters?
|
|
8
|
+
* Everything downstream (detection, execution, upload) is architecture-agnostic.
|
|
9
|
+
*/
|
|
10
|
+
// ── config.json readers ──────────────────────────────────────────────────────
|
|
11
|
+
function fail(key, detail) {
|
|
12
|
+
throw new Error(`import/foreign: config field "${key}" ${detail}`);
|
|
13
|
+
}
|
|
14
|
+
/** A positive integer field, required. */
|
|
15
|
+
export function requireInt(config, key) {
|
|
16
|
+
const v = config[key];
|
|
17
|
+
if (typeof v !== "number" || !Number.isInteger(v) || v <= 0) {
|
|
18
|
+
fail(key, `must be a positive integer, got ${JSON.stringify(v)}`);
|
|
19
|
+
}
|
|
20
|
+
return v;
|
|
21
|
+
}
|
|
22
|
+
/** The first of `keys` present as a positive integer, else `undefined`. */
|
|
23
|
+
export function firstInt(config, keys) {
|
|
24
|
+
for (const key of keys) {
|
|
25
|
+
const v = config[key];
|
|
26
|
+
if (typeof v === "number" && Number.isInteger(v) && v > 0)
|
|
27
|
+
return v;
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The mixer's inner width.
|
|
33
|
+
*
|
|
34
|
+
* `intermediate_size` is authoritative and `expand` is NOT trustworthy:
|
|
35
|
+
* `tiiuae/falcon-mamba-7b` ships `expand: 16` against `hidden_size: 4096` while
|
|
36
|
+
* its weights are `d_inner = 8192`. Transformers only tolerates it because the
|
|
37
|
+
* JSON's `intermediate_size` is re-applied over the derived value, so a port
|
|
38
|
+
* that trusted `expand` would build a model 8× too wide. Fall back to
|
|
39
|
+
* `expand * hidden_size` only when `intermediate_size` is absent.
|
|
40
|
+
*/
|
|
41
|
+
export function readInnerSize(config, dModel) {
|
|
42
|
+
const stated = firstInt(config, ["intermediate_size"]);
|
|
43
|
+
if (stated !== undefined)
|
|
44
|
+
return stated;
|
|
45
|
+
const expand = firstInt(config, ["expand"]);
|
|
46
|
+
if (expand === undefined) {
|
|
47
|
+
fail("intermediate_size", "is absent and no usable \"expand\" was found");
|
|
48
|
+
}
|
|
49
|
+
return expand * dModel;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* `d_inner / d_model` as this engine's integer `expand` factor — the blocks size
|
|
53
|
+
* themselves from it, so a non-integer ratio cannot be represented and must fail
|
|
54
|
+
* loudly rather than silently truncate.
|
|
55
|
+
*/
|
|
56
|
+
export function expandFactor(dInner, dModel, label) {
|
|
57
|
+
if (dInner % dModel !== 0) {
|
|
58
|
+
throw new Error(`import/foreign: ${label} has d_inner ${dInner} which is not a whole multiple of ` +
|
|
59
|
+
`d_model ${dModel} — this engine's blocks are sized by an integer expand factor`);
|
|
60
|
+
}
|
|
61
|
+
return dInner / dModel;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* `time_step_rank`, resolving HF's `"auto"` to `ceil(hidden_size / 16)` — the
|
|
65
|
+
* same default `Mamba1Block` applies, so an `"auto"` checkpoint and this engine
|
|
66
|
+
* agree without the caller doing anything.
|
|
67
|
+
*/
|
|
68
|
+
export function readTimeStepRank(config, dModel) {
|
|
69
|
+
const v = config["time_step_rank"];
|
|
70
|
+
if (typeof v === "number" && Number.isInteger(v) && v > 0)
|
|
71
|
+
return v;
|
|
72
|
+
if (v === undefined || v === "auto")
|
|
73
|
+
return Math.ceil(dModel / 16);
|
|
74
|
+
fail("time_step_rank", `must be a positive integer or "auto", got ${JSON.stringify(v)}`);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/import/foreign/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA4BH,gFAAgF;AAEhF,SAAS,IAAI,CAAC,GAAW,EAAE,MAAc;IACvC,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,KAAK,MAAM,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,UAAU,CAAC,MAAqB,EAAE,GAAW;IAC3D,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,GAAG,EAAE,mCAAmC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,QAAQ,CAAC,MAAqB,EAAE,IAAuB;IACrE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,MAAqB,EAAE,MAAc;IACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACvD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC,mBAAmB,EAAE,8CAA8C,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,MAAM,GAAG,MAAM,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,MAAc,EAAE,KAAa;IACxE,IAAI,MAAM,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,mBAAmB,KAAK,gBAAgB,MAAM,oCAAoC;YAChF,WAAW,MAAM,+DAA+D,CACnF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,GAAG,MAAM,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAqB,EAAE,MAAc;IACpE,MAAM,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACnC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACpE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,gBAAgB,EAAE,6CAA6C,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* import/foreign/apply.ts — write ported weights into a live model.
|
|
3
|
+
*
|
|
4
|
+
* Kept separate from the port itself so the mapping stays device-free and
|
|
5
|
+
* testable: {@link portForeignMamba} produces plain `Float32Array`s, this is the
|
|
6
|
+
* only piece that needs a `GPUDevice`.
|
|
7
|
+
*
|
|
8
|
+
* Matching is by parameter NAME, never by position, so a change to
|
|
9
|
+
* `HybridMambaModel.parameters()` ordering can never silently mis-assign a
|
|
10
|
+
* buffer — an unexpected or missing name throws instead.
|
|
11
|
+
*/
|
|
12
|
+
import type { HybridMambaModel } from "../../model/mamba_model.js";
|
|
13
|
+
import type { PortedTensors } from "./plan.js";
|
|
14
|
+
/**
|
|
15
|
+
* Upload every ported tensor into `model`'s parameter buffers.
|
|
16
|
+
*
|
|
17
|
+
* Throws when the model expects a parameter the port did not produce, when an
|
|
18
|
+
* element count disagrees, or when the port produced a name the model does not
|
|
19
|
+
* have — all three mean the model was built from a different config than
|
|
20
|
+
* {@link PortedCheckpoint.modelConfig}.
|
|
21
|
+
*/
|
|
22
|
+
export declare function applyPortedWeights(model: HybridMambaModel, ported: PortedTensors): void;
|
|
23
|
+
//# sourceMappingURL=apply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/import/foreign/apply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CA6BvF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* import/foreign/apply.ts — write ported weights into a live model.
|
|
3
|
+
*
|
|
4
|
+
* Kept separate from the port itself so the mapping stays device-free and
|
|
5
|
+
* testable: {@link portForeignMamba} produces plain `Float32Array`s, this is the
|
|
6
|
+
* only piece that needs a `GPUDevice`.
|
|
7
|
+
*
|
|
8
|
+
* Matching is by parameter NAME, never by position, so a change to
|
|
9
|
+
* `HybridMambaModel.parameters()` ordering can never silently mis-assign a
|
|
10
|
+
* buffer — an unexpected or missing name throws instead.
|
|
11
|
+
*/
|
|
12
|
+
import { uploadBuffer } from "../../utils/gpu_utils.js";
|
|
13
|
+
/**
|
|
14
|
+
* Upload every ported tensor into `model`'s parameter buffers.
|
|
15
|
+
*
|
|
16
|
+
* Throws when the model expects a parameter the port did not produce, when an
|
|
17
|
+
* element count disagrees, or when the port produced a name the model does not
|
|
18
|
+
* have — all three mean the model was built from a different config than
|
|
19
|
+
* {@link PortedCheckpoint.modelConfig}.
|
|
20
|
+
*/
|
|
21
|
+
export function applyPortedWeights(model, ported) {
|
|
22
|
+
const params = model.parameters();
|
|
23
|
+
const expected = new Set(params.map((p) => p.name));
|
|
24
|
+
const extra = [...ported.weights.keys()].filter((name) => !expected.has(name));
|
|
25
|
+
if (extra.length > 0) {
|
|
26
|
+
throw new Error(`import/foreign: ported tensors ${extra.slice(0, 5).map((n) => `"${n}"`).join(", ")}` +
|
|
27
|
+
`${extra.length > 5 ? ` (+${extra.length - 5} more)` : ""} have no parameter on this model — ` +
|
|
28
|
+
`build it from the port's modelConfig`);
|
|
29
|
+
}
|
|
30
|
+
for (const param of params) {
|
|
31
|
+
const data = ported.weights.get(param.name);
|
|
32
|
+
if (!data) {
|
|
33
|
+
throw new Error(`import/foreign: no ported tensor for parameter "${param.name}" — ` +
|
|
34
|
+
`the model was built from a different config than the port's modelConfig`);
|
|
35
|
+
}
|
|
36
|
+
if (data.length !== param.numel) {
|
|
37
|
+
throw new Error(`import/foreign: parameter "${param.name}" expects ${param.numel} elements, ` +
|
|
38
|
+
`the port produced ${data.length}`);
|
|
39
|
+
}
|
|
40
|
+
uploadBuffer(model.device, param.buf, data);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/import/foreign/apply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAuB,EAAE,MAAqB;IAC/E,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEpD,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/E,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,kCAAkC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACnF,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,qCAAqC;YAC9F,sCAAsC,CACzC,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACb,mDAAmD,KAAK,CAAC,IAAI,MAAM;gBACjE,yEAAyE,CAC5E,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,8BAA8B,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,KAAK,aAAa;gBAC3E,qBAAqB,IAAI,CAAC,MAAM,EAAE,CACrC,CAAC;QACJ,CAAC;QACD,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* import/foreign/codestral_mamba.ts — weight port for Codestral-Mamba
|
|
3
|
+
* (`mistralai/Mamba-Codestral-7B-v0.1`, `Mamba2ForCausalLM`,
|
|
4
|
+
* `model_type: "mamba2"`, Mamba-2 / SSD).
|
|
5
|
+
*
|
|
6
|
+
* Source layout confirmed against the repo's published HF `config.json`, its
|
|
7
|
+
* `model.safetensors.index.json` (579 tensors = 9 per layer × 64 + 3 globals),
|
|
8
|
+
* the header of `consolidated.safetensors`, and
|
|
9
|
+
* `transformers/models/mamba2/modeling_mamba2.py`:
|
|
10
|
+
*
|
|
11
|
+
* backbone.embeddings.weight [vocab, d_model]
|
|
12
|
+
* backbone.layers.{N}.norm.weight [d_model]
|
|
13
|
+
* backbone.layers.{N}.mixer.in_proj.weight [2*d_inner + 2*n_groups*d_state + n_heads, d_model]
|
|
14
|
+
* backbone.layers.{N}.mixer.conv1d.weight [conv_dim, 1, d_conv]
|
|
15
|
+
* backbone.layers.{N}.mixer.conv1d.bias [conv_dim]
|
|
16
|
+
* backbone.layers.{N}.mixer.dt_bias [n_heads]
|
|
17
|
+
* backbone.layers.{N}.mixer.A_log [n_heads]
|
|
18
|
+
* backbone.layers.{N}.mixer.D [n_heads]
|
|
19
|
+
* backbone.layers.{N}.mixer.norm.weight [d_inner]
|
|
20
|
+
* backbone.layers.{N}.mixer.out_proj.weight [d_model, d_inner]
|
|
21
|
+
* backbone.norm_f.weight [d_model]
|
|
22
|
+
* lm_head.weight [vocab, d_model]
|
|
23
|
+
*
|
|
24
|
+
* where `conv_dim = d_inner + 2 * n_groups * d_state`. Mamba-2 has no `x_proj`
|
|
25
|
+
* and no `dt_proj`: B, C and dt all come out of the fused `in_proj`.
|
|
26
|
+
*
|
|
27
|
+
* Three reconciliations against `Mamba2Block`:
|
|
28
|
+
*
|
|
29
|
+
* 1. **`in_proj` row order.** Upstream splits
|
|
30
|
+
* `[gate (d_inner), x|B|C (conv_dim), dt (n_heads)]`; this engine's fused
|
|
31
|
+
* projection is `[x (d_inner), B (n_groups*d_state), C (n_groups*d_state),
|
|
32
|
+
* dt (n_heads)]` — the SAME tail, minus the leading gate rows. So the port
|
|
33
|
+
* is one contiguous row slice starting at `d_inner`, and the gate rows are
|
|
34
|
+
* declared as a discard (see 3).
|
|
35
|
+
* 2. **`A_log` convention.** Upstream uses `A = -exp(A_log)`; `ssd.ts` uses
|
|
36
|
+
* `A = -softplus(A_log)`. The port re-expresses the same `A` as
|
|
37
|
+
* `softplus⁻¹(exp(A_log))` so decay rates are preserved exactly, rather than
|
|
38
|
+
* copying the raw value and silently changing every head's decay.
|
|
39
|
+
* 3. **The gate branch.** `Mamba2Block` has no `z` gate: it RMS-norms the scan
|
|
40
|
+
* output and projects out, where upstream computes
|
|
41
|
+
* `norm(y * silu(z))`. The `d_inner × d_model` gate rows therefore have no
|
|
42
|
+
* target. That is a REAL loss of capability, not a formatting detail, and it
|
|
43
|
+
* is reported as a `PortDiscard` on every layer so a caller sees it.
|
|
44
|
+
*
|
|
45
|
+
* Also mapped without transform: `mixer.norm.weight` → the block's inner
|
|
46
|
+
* `normWeight` (applied ungated here, per 3), `backbone.layers.N.norm.weight` →
|
|
47
|
+
* `preNormWeight`, `conv1d.{weight,bias}` (depthwise, taps reversed) → the fused
|
|
48
|
+
* `[x, B, C]` conv, and `D` / `dt_bias` per head. Linear weights are
|
|
49
|
+
* `[out, in]` row-major on both sides, so no transposes.
|
|
50
|
+
*
|
|
51
|
+
* `tie_word_embeddings: false`, so `lm_head.weight` is a real stored tensor with
|
|
52
|
+
* no target here (`HybridMambaModel` ties its head to the embedding) — it is
|
|
53
|
+
* reported as unmapped.
|
|
54
|
+
*/
|
|
55
|
+
import { type ForeignMambaAdapter } from "./adapter.js";
|
|
56
|
+
export declare const codestralMambaAdapter: ForeignMambaAdapter;
|
|
57
|
+
//# sourceMappingURL=codestral_mamba.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codestral_mamba.d.ts","sourceRoot":"","sources":["../../../src/import/foreign/codestral_mamba.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AAIH,OAAO,EAML,KAAK,mBAAmB,EAEzB,MAAM,cAAc,CAAC;AA6FtB,eAAO,MAAM,qBAAqB,EAAE,mBAiEnC,CAAC"}
|