mambacode.js 1.0.0 → 1.0.1
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 +198 -76
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/kernels/activations.d.ts +3 -0
- package/dist/kernels/activations.d.ts.map +1 -0
- package/dist/kernels/activations.js +87 -0
- package/dist/kernels/activations.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 +152 -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/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/mamba_block.d.ts +64 -0
- package/dist/model/mamba_block.d.ts.map +1 -0
- package/dist/model/mamba_block.js +309 -0
- package/dist/model/mamba_block.js.map +1 -0
- package/dist/model/mamba_model.d.ts +66 -0
- package/dist/model/mamba_model.d.ts.map +1 -0
- package/dist/model/mamba_model.js +289 -0
- package/dist/model/mamba_model.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 +37 -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/package.json +43 -18
- package/src/index.ts +59 -0
- package/src/kernels/{activations.js → activations.ts} +2 -2
- package/src/kernels/{linear_projection.js → linear_projection.ts} +2 -2
- package/src/kernels/{selective_scan.js → selective_scan.ts} +2 -2
- package/src/kernels/{weight_update.js → weight_update.ts} +2 -2
- package/src/model/{mamba_block.js → mamba_block.ts} +139 -175
- package/src/model/{mamba_model.js → mamba_model.ts} +168 -124
- package/src/tokenizer/bpe.ts +186 -0
- package/src/training/autograd.ts +135 -0
- package/src/training/trainer.ts +312 -0
- package/src/utils/gpu_utils.ts +147 -0
- package/src/utils/quantization.ts +154 -0
- package/src/index.js +0 -89
- package/src/tokenizer/bpe.js +0 -256
- package/src/training/autograd.js +0 -221
- package/src/training/trainer.js +0 -394
- package/src/utils/gpu_utils.js +0 -217
- package/src/utils/quantization.js +0 -215
- /package/src/kernels/{conv1d.js → conv1d.ts} +0 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mamba_model.ts – Full Mamba language model.
|
|
3
|
+
*/
|
|
4
|
+
import { MambaBlock } from './mamba_block';
|
|
5
|
+
import { createStorageBuffer, createEmptyStorageBuffer, createUniformBuffer, createComputePipeline, createBindGroup, dispatchKernel, readBuffer, uploadBuffer, cdiv, } from '../utils/gpu_utils';
|
|
6
|
+
import { LINEAR_FORWARD_WGSL } from '../kernels/linear_projection';
|
|
7
|
+
import { ACTIVATIONS_WGSL } from '../kernels/activations';
|
|
8
|
+
export class MambaModel {
|
|
9
|
+
device;
|
|
10
|
+
config;
|
|
11
|
+
gpuEmbedding;
|
|
12
|
+
blocks;
|
|
13
|
+
gpuFinalNorm;
|
|
14
|
+
tiedEmbedding;
|
|
15
|
+
gpuLMHeadBias;
|
|
16
|
+
_lmHeadPipeline;
|
|
17
|
+
_rmsnormPipeline;
|
|
18
|
+
_embedPipeline;
|
|
19
|
+
_wslaMode = false;
|
|
20
|
+
constructor(device, config) {
|
|
21
|
+
this.device = device;
|
|
22
|
+
this.config = {
|
|
23
|
+
dState: 16,
|
|
24
|
+
dConv: 4,
|
|
25
|
+
expand: 2,
|
|
26
|
+
eosId: -1,
|
|
27
|
+
...config,
|
|
28
|
+
};
|
|
29
|
+
const { vocabSize, dModel, numLayers } = this.config;
|
|
30
|
+
const embedData = new Float32Array(vocabSize * dModel);
|
|
31
|
+
const std = 1.0 / Math.sqrt(dModel);
|
|
32
|
+
for (let i = 0; i < embedData.length; i++) {
|
|
33
|
+
const u1 = Math.random(), u2 = Math.random();
|
|
34
|
+
embedData[i] = std * Math.sqrt(-2 * Math.log(u1 + 1e-12)) *
|
|
35
|
+
Math.cos(2 * Math.PI * u2);
|
|
36
|
+
}
|
|
37
|
+
this.gpuEmbedding = createStorageBuffer(device, embedData, true);
|
|
38
|
+
this.blocks = Array.from({ length: numLayers }, () => new MambaBlock(device, {
|
|
39
|
+
dModel,
|
|
40
|
+
dState: this.config.dState,
|
|
41
|
+
dConv: this.config.dConv,
|
|
42
|
+
expand: this.config.expand,
|
|
43
|
+
}));
|
|
44
|
+
const finalNormW = new Float32Array(dModel).fill(1.0);
|
|
45
|
+
this.gpuFinalNorm = createStorageBuffer(device, finalNormW, true);
|
|
46
|
+
this.tiedEmbedding = true;
|
|
47
|
+
this._lmHeadPipeline = createComputePipeline(device, LINEAR_FORWARD_WGSL, 'linear_forward');
|
|
48
|
+
this._rmsnormPipeline = createComputePipeline(device, ACTIVATIONS_WGSL, 'rmsnorm_forward');
|
|
49
|
+
this.gpuLMHeadBias = createStorageBuffer(device, new Float32Array(vocabSize), true);
|
|
50
|
+
this._embedPipeline = createComputePipeline(device, EMBED_LOOKUP_WGSL, 'embed_lookup');
|
|
51
|
+
}
|
|
52
|
+
embedTokens(tokenIds, batch, seqLen) {
|
|
53
|
+
const { dModel } = this.config;
|
|
54
|
+
const M = batch * seqLen;
|
|
55
|
+
const idsBuf = createStorageBuffer(this.device, tokenIds instanceof Uint32Array ? tokenIds : new Uint32Array(tokenIds), false);
|
|
56
|
+
const outBuf = createEmptyStorageBuffer(this.device, M * dModel * 4, true);
|
|
57
|
+
const params = new Uint32Array([M, dModel]).buffer;
|
|
58
|
+
const pBuf = createUniformBuffer(this.device, params);
|
|
59
|
+
const bg = createBindGroup(this.device, this._embedPipeline, [pBuf, idsBuf, this.gpuEmbedding, outBuf]);
|
|
60
|
+
dispatchKernel(this.device, this._embedPipeline, bg, [cdiv(M, 64), 1, 1]);
|
|
61
|
+
idsBuf.destroy();
|
|
62
|
+
pBuf.destroy();
|
|
63
|
+
return outBuf;
|
|
64
|
+
}
|
|
65
|
+
async forward(tokenIds, batch, seqLen) {
|
|
66
|
+
const { dModel, vocabSize } = this.config;
|
|
67
|
+
const M = batch * seqLen;
|
|
68
|
+
let hidden = this.embedTokens(tokenIds, batch, seqLen);
|
|
69
|
+
const caches = [];
|
|
70
|
+
for (const block of this.blocks) {
|
|
71
|
+
const { output, cache } = block.forward(hidden, batch, seqLen);
|
|
72
|
+
caches.push(cache);
|
|
73
|
+
hidden.destroy();
|
|
74
|
+
hidden = output;
|
|
75
|
+
}
|
|
76
|
+
const normOut = createEmptyStorageBuffer(this.device, M * dModel * 4, true);
|
|
77
|
+
const normInv = createEmptyStorageBuffer(this.device, M * 4, false);
|
|
78
|
+
{
|
|
79
|
+
const params = new ArrayBuffer(16);
|
|
80
|
+
new Uint32Array(params, 0, 2).set([M, dModel]);
|
|
81
|
+
new Float32Array(params, 8, 1).set([1e-6]);
|
|
82
|
+
const pBuf = createUniformBuffer(this.device, params);
|
|
83
|
+
const bg = createBindGroup(this.device, this._rmsnormPipeline, [pBuf, hidden, this.gpuFinalNorm, normOut, normInv]);
|
|
84
|
+
dispatchKernel(this.device, this._rmsnormPipeline, bg, [cdiv(M, 64), 1, 1]);
|
|
85
|
+
}
|
|
86
|
+
const gpuLogits = createEmptyStorageBuffer(this.device, M * vocabSize * 4, true);
|
|
87
|
+
{
|
|
88
|
+
const params = new Uint32Array([M, dModel, vocabSize]).buffer;
|
|
89
|
+
const pBuf = createUniformBuffer(this.device, params);
|
|
90
|
+
const weightBuf = this.tiedEmbedding ? this.gpuEmbedding : this.gpuLMHeadBias;
|
|
91
|
+
const bg = createBindGroup(this.device, this._lmHeadPipeline, [pBuf, normOut, weightBuf, this.gpuLMHeadBias, gpuLogits]);
|
|
92
|
+
dispatchKernel(this.device, this._lmHeadPipeline, bg, [cdiv(M, 16), cdiv(vocabSize, 16), 1]);
|
|
93
|
+
}
|
|
94
|
+
normOut.destroy();
|
|
95
|
+
normInv.destroy();
|
|
96
|
+
const logits = await readBuffer(this.device, gpuLogits, M * vocabSize * 4);
|
|
97
|
+
return { logits, gpuLogits, caches };
|
|
98
|
+
}
|
|
99
|
+
async generate(promptIds, maxNewTokens = 200, samplingOpts = {}) {
|
|
100
|
+
const { temperature = 1.0, topK = 50, topP = 0.9 } = samplingOpts;
|
|
101
|
+
const { vocabSize } = this.config;
|
|
102
|
+
let ids = [...promptIds];
|
|
103
|
+
for (let step = 0; step < maxNewTokens; step++) {
|
|
104
|
+
const { logits } = await this.forward(new Uint32Array(ids), 1, ids.length);
|
|
105
|
+
const lastLogits = logits.slice((ids.length - 1) * vocabSize, ids.length * vocabSize);
|
|
106
|
+
const nextId = sampleToken(lastLogits, { temperature, topK, topP });
|
|
107
|
+
ids.push(nextId);
|
|
108
|
+
if (nextId === this.config.eosId)
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
return ids;
|
|
112
|
+
}
|
|
113
|
+
parameters() {
|
|
114
|
+
const params = [];
|
|
115
|
+
params.push({
|
|
116
|
+
buf: this.gpuEmbedding,
|
|
117
|
+
numel: this.config.vocabSize * this.config.dModel,
|
|
118
|
+
name: 'embedding',
|
|
119
|
+
});
|
|
120
|
+
for (let i = 0; i < this.blocks.length; i++) {
|
|
121
|
+
for (const p of this.blocks[i].parameters()) {
|
|
122
|
+
params.push({ ...p, name: `block${i}.${p.name}` });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
params.push({
|
|
126
|
+
buf: this.gpuFinalNorm,
|
|
127
|
+
numel: this.config.dModel,
|
|
128
|
+
name: 'final_norm',
|
|
129
|
+
});
|
|
130
|
+
return params;
|
|
131
|
+
}
|
|
132
|
+
setWSLAMode(enabled) {
|
|
133
|
+
for (const block of this.blocks)
|
|
134
|
+
block.setWSLAMode(enabled);
|
|
135
|
+
this._wslaMode = enabled;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Serialise all model parameters to an ArrayBuffer.
|
|
139
|
+
*
|
|
140
|
+
* Binary format:
|
|
141
|
+
* [0..3] magic : uint32 = 0x4D424A53 ('MBJS')
|
|
142
|
+
* [4..7] version: uint32 = 1
|
|
143
|
+
* [8..11] nParams: uint32
|
|
144
|
+
* [12 .. 12+4*nParams-1] numel[i]: uint32 for each parameter i
|
|
145
|
+
* [12+4*nParams ..] float32 data for each parameter, concatenated
|
|
146
|
+
*
|
|
147
|
+
* Save the returned buffer to a file or IndexedDB and reload it with
|
|
148
|
+
* `loadWeights()` to resume from a checkpoint.
|
|
149
|
+
*/
|
|
150
|
+
async exportWeights() {
|
|
151
|
+
const params = this.parameters();
|
|
152
|
+
const nParams = params.length;
|
|
153
|
+
// Read all GPU buffers into CPU Float32Arrays
|
|
154
|
+
const arrays = await Promise.all(params.map(p => readBuffer(this.device, p.buf, p.numel * 4)));
|
|
155
|
+
// Calculate total byte size: header + numel table + all float data
|
|
156
|
+
const headerBytes = 4 + 4 + 4 + nParams * 4; // magic + version + nParams + numel[]
|
|
157
|
+
const dataBytes = arrays.reduce((acc, a) => acc + a.byteLength, 0);
|
|
158
|
+
const out = new ArrayBuffer(headerBytes + dataBytes);
|
|
159
|
+
const view = new DataView(out);
|
|
160
|
+
let offset = 0;
|
|
161
|
+
view.setUint32(offset, 0x4D424A53, true);
|
|
162
|
+
offset += 4; // magic 'MBJS'
|
|
163
|
+
view.setUint32(offset, 1, true);
|
|
164
|
+
offset += 4; // version
|
|
165
|
+
view.setUint32(offset, nParams, true);
|
|
166
|
+
offset += 4; // nParams
|
|
167
|
+
for (const p of params) {
|
|
168
|
+
view.setUint32(offset, p.numel, true);
|
|
169
|
+
offset += 4;
|
|
170
|
+
}
|
|
171
|
+
for (const arr of arrays) {
|
|
172
|
+
new Float32Array(out, offset, arr.length).set(arr);
|
|
173
|
+
offset += arr.byteLength;
|
|
174
|
+
}
|
|
175
|
+
return out;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Load model parameters from an ArrayBuffer previously produced by
|
|
179
|
+
* `exportWeights()`. The parameter count and element counts must match
|
|
180
|
+
* the current model configuration exactly.
|
|
181
|
+
*
|
|
182
|
+
* @throws {Error} if the magic number, version, or parameter layout do
|
|
183
|
+
* not match the current model.
|
|
184
|
+
*/
|
|
185
|
+
async loadWeights(buffer) {
|
|
186
|
+
const view = new DataView(buffer);
|
|
187
|
+
let offset = 0;
|
|
188
|
+
const magic = view.getUint32(offset, true);
|
|
189
|
+
offset += 4;
|
|
190
|
+
if (magic !== 0x4D424A53) {
|
|
191
|
+
throw new Error('Invalid weight file: bad magic number. ' +
|
|
192
|
+
'Ensure the file was exported by MambaModel.exportWeights().');
|
|
193
|
+
}
|
|
194
|
+
const version = view.getUint32(offset, true);
|
|
195
|
+
offset += 4;
|
|
196
|
+
if (version !== 1) {
|
|
197
|
+
throw new Error(`Unsupported weight file version: ${version}. Expected version 1.`);
|
|
198
|
+
}
|
|
199
|
+
const nParams = view.getUint32(offset, true);
|
|
200
|
+
offset += 4;
|
|
201
|
+
const params = this.parameters();
|
|
202
|
+
if (nParams !== params.length) {
|
|
203
|
+
throw new Error(`Weight file has ${nParams} parameters but this model has ${params.length}. ` +
|
|
204
|
+
'Ensure the model configuration matches the one used when exporting.');
|
|
205
|
+
}
|
|
206
|
+
const numels = [];
|
|
207
|
+
for (let i = 0; i < nParams; i++) {
|
|
208
|
+
numels.push(view.getUint32(offset, true));
|
|
209
|
+
offset += 4;
|
|
210
|
+
}
|
|
211
|
+
for (let i = 0; i < nParams; i++) {
|
|
212
|
+
// i is guaranteed in-bounds: nParams === params.length was verified above
|
|
213
|
+
const p = params[i];
|
|
214
|
+
const numel = numels[i];
|
|
215
|
+
if (numel !== p.numel) {
|
|
216
|
+
throw new Error(`Parameter ${i} ("${p.name}") size mismatch: ` +
|
|
217
|
+
`file has ${numel} elements, model expects ${p.numel}.`);
|
|
218
|
+
}
|
|
219
|
+
const slice = new Float32Array(buffer, offset, p.numel);
|
|
220
|
+
uploadBuffer(this.device, p.buf, slice);
|
|
221
|
+
offset += p.numel * 4;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const EMBED_LOOKUP_WGSL = /* wgsl */ `
|
|
226
|
+
struct EmbedParams {
|
|
227
|
+
num_tokens : u32,
|
|
228
|
+
d_model : u32,
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
@group(0) @binding(0) var<uniform> params : EmbedParams;
|
|
232
|
+
@group(0) @binding(1) var<storage, read> ids : array<u32>;
|
|
233
|
+
@group(0) @binding(2) var<storage, read> table : array<f32>;
|
|
234
|
+
@group(0) @binding(3) var<storage, read_write> out : array<f32>;
|
|
235
|
+
|
|
236
|
+
@compute @workgroup_size(64, 1, 1)
|
|
237
|
+
fn embed_lookup(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
238
|
+
let token_idx = gid.x;
|
|
239
|
+
if (token_idx >= params.num_tokens) { return; }
|
|
240
|
+
|
|
241
|
+
let D = params.d_model;
|
|
242
|
+
let tok = ids[token_idx];
|
|
243
|
+
let src = tok * D;
|
|
244
|
+
let dst = token_idx * D;
|
|
245
|
+
|
|
246
|
+
for (var i: u32 = 0u; i < D; i = i + 1u) {
|
|
247
|
+
out[dst + i] = table[src + i];
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
`;
|
|
251
|
+
function sampleToken(logits, { temperature = 1.0, topK = 50, topP = 0.9 } = {}) {
|
|
252
|
+
const n = logits.length;
|
|
253
|
+
const scaled = new Float32Array(n);
|
|
254
|
+
for (let i = 0; i < n; i++)
|
|
255
|
+
scaled[i] = logits[i] / Math.max(temperature, 1e-7);
|
|
256
|
+
let maxL = -Infinity;
|
|
257
|
+
for (let i = 0; i < n; i++)
|
|
258
|
+
if (scaled[i] > maxL)
|
|
259
|
+
maxL = scaled[i];
|
|
260
|
+
let sumE = 0;
|
|
261
|
+
const exps = new Float32Array(n);
|
|
262
|
+
for (let i = 0; i < n; i++) {
|
|
263
|
+
exps[i] = Math.exp(scaled[i] - maxL);
|
|
264
|
+
sumE += exps[i];
|
|
265
|
+
}
|
|
266
|
+
const indices = Array.from({ length: n }, (_, i) => i)
|
|
267
|
+
.sort((a, b) => exps[b] - exps[a]);
|
|
268
|
+
const topKIndices = indices.slice(0, topK);
|
|
269
|
+
let cumSum = 0;
|
|
270
|
+
const nucleus = [];
|
|
271
|
+
for (const idx of topKIndices) {
|
|
272
|
+
cumSum += exps[idx] / sumE;
|
|
273
|
+
nucleus.push(idx);
|
|
274
|
+
if (cumSum >= topP)
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
let nucleusSum = 0;
|
|
278
|
+
for (const idx of nucleus)
|
|
279
|
+
nucleusSum += exps[idx];
|
|
280
|
+
const threshold = Math.random() * nucleusSum;
|
|
281
|
+
let acc = 0;
|
|
282
|
+
for (const idx of nucleus) {
|
|
283
|
+
acc += exps[idx];
|
|
284
|
+
if (acc >= threshold)
|
|
285
|
+
return idx;
|
|
286
|
+
}
|
|
287
|
+
return nucleus[nucleus.length - 1];
|
|
288
|
+
}
|
|
289
|
+
//# 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,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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bpe.ts – Browser-side Byte Pair Encoding (BPE) tokenizer.
|
|
3
|
+
*/
|
|
4
|
+
function buildByteEncoder() {
|
|
5
|
+
const enc = new Map();
|
|
6
|
+
const ranges = [
|
|
7
|
+
[0x21, 0x7E],
|
|
8
|
+
[0xA1, 0xAC],
|
|
9
|
+
[0xAE, 0xFF],
|
|
10
|
+
];
|
|
11
|
+
let n = 0;
|
|
12
|
+
for (const [lo, hi] of ranges) {
|
|
13
|
+
for (let b = lo; b <= hi; b++) {
|
|
14
|
+
enc.set(b, String.fromCodePoint(b));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
for (let b = 0; b < 256; b++) {
|
|
18
|
+
if (!enc.has(b)) {
|
|
19
|
+
enc.set(b, String.fromCodePoint(256 + n));
|
|
20
|
+
n++;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return enc;
|
|
24
|
+
}
|
|
25
|
+
const BYTE_ENCODER = buildByteEncoder();
|
|
26
|
+
const BYTE_DECODER = new Map([...BYTE_ENCODER].map(([k, v]) => [v, k]));
|
|
27
|
+
const PRE_TOKENIZE_RE = /(?:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|\s+(?!\S)|\s+/gu;
|
|
28
|
+
export class BPETokenizer {
|
|
29
|
+
vocab;
|
|
30
|
+
idToToken;
|
|
31
|
+
merges;
|
|
32
|
+
bosToken;
|
|
33
|
+
eosToken;
|
|
34
|
+
padToken;
|
|
35
|
+
unkToken;
|
|
36
|
+
bosId;
|
|
37
|
+
eosId;
|
|
38
|
+
padId;
|
|
39
|
+
constructor() {
|
|
40
|
+
this.vocab = new Map();
|
|
41
|
+
this.idToToken = new Map();
|
|
42
|
+
this.merges = new Map();
|
|
43
|
+
this.bosToken = '<|im_start|>';
|
|
44
|
+
this.eosToken = '<|im_end|>';
|
|
45
|
+
this.padToken = '<|endoftext|>';
|
|
46
|
+
this.unkToken = '<unk>';
|
|
47
|
+
this.bosId = null;
|
|
48
|
+
this.eosId = null;
|
|
49
|
+
this.padId = null;
|
|
50
|
+
}
|
|
51
|
+
async load(vocab, merges) {
|
|
52
|
+
let vocabObj;
|
|
53
|
+
if (typeof vocab === 'string') {
|
|
54
|
+
const res = await fetch(vocab);
|
|
55
|
+
vocabObj = await res.json();
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
vocabObj = vocab;
|
|
59
|
+
}
|
|
60
|
+
this.vocab = new Map(Object.entries(vocabObj).map(([k, v]) => [k, Number(v)]));
|
|
61
|
+
this.idToToken = new Map([...this.vocab].map(([k, v]) => [v, k]));
|
|
62
|
+
let mergeLines;
|
|
63
|
+
if (typeof merges === 'string') {
|
|
64
|
+
const res = await fetch(merges);
|
|
65
|
+
const txt = await res.text();
|
|
66
|
+
mergeLines = txt.split('\n').filter(l => l && !l.startsWith('#'));
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
mergeLines = merges;
|
|
70
|
+
}
|
|
71
|
+
this.merges = new Map();
|
|
72
|
+
mergeLines.forEach((line, rank) => {
|
|
73
|
+
this.merges.set(line.trim(), rank);
|
|
74
|
+
});
|
|
75
|
+
this.bosId = this.vocab.get(this.bosToken) ?? null;
|
|
76
|
+
this.eosId = this.vocab.get(this.eosToken) ?? null;
|
|
77
|
+
this.padId = this.vocab.get(this.padToken) ?? null;
|
|
78
|
+
}
|
|
79
|
+
loadFromObjects(vocabObj, mergeArr) {
|
|
80
|
+
this.vocab = new Map(Object.entries(vocabObj).map(([k, v]) => [k, Number(v)]));
|
|
81
|
+
this.idToToken = new Map([...this.vocab].map(([k, v]) => [v, k]));
|
|
82
|
+
this.merges = new Map(mergeArr.map((m, i) => [m, i]));
|
|
83
|
+
this.bosId = this.vocab.get(this.bosToken) ?? null;
|
|
84
|
+
this.eosId = this.vocab.get(this.eosToken) ?? null;
|
|
85
|
+
this.padId = this.vocab.get(this.padToken) ?? null;
|
|
86
|
+
}
|
|
87
|
+
encode(text, opts = {}) {
|
|
88
|
+
const words = text.match(PRE_TOKENIZE_RE) ?? [];
|
|
89
|
+
const ids = [];
|
|
90
|
+
if (opts.addBos && this.bosId !== null)
|
|
91
|
+
ids.push(this.bosId);
|
|
92
|
+
for (const word of words) {
|
|
93
|
+
const bytes = new TextEncoder().encode(word);
|
|
94
|
+
const byteStr = Array.from(bytes).map(b => BYTE_ENCODER.get(b) ?? '?').join('');
|
|
95
|
+
const bpeTokens = this._bpe(byteStr);
|
|
96
|
+
for (const tok of bpeTokens) {
|
|
97
|
+
const id = this.vocab.get(tok);
|
|
98
|
+
if (id !== undefined) {
|
|
99
|
+
ids.push(id);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
for (const ch of tok) {
|
|
103
|
+
const cid = this.vocab.get(ch);
|
|
104
|
+
if (cid !== undefined)
|
|
105
|
+
ids.push(cid);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (opts.addEos && this.eosId !== null)
|
|
111
|
+
ids.push(this.eosId);
|
|
112
|
+
return ids;
|
|
113
|
+
}
|
|
114
|
+
decode(ids) {
|
|
115
|
+
let byteStr = '';
|
|
116
|
+
for (const id of ids) {
|
|
117
|
+
const tok = this.idToToken.get(id);
|
|
118
|
+
if (tok !== undefined)
|
|
119
|
+
byteStr += tok;
|
|
120
|
+
}
|
|
121
|
+
const bytes = new Uint8Array([...byteStr].map(ch => BYTE_DECODER.get(ch) ?? ch.codePointAt(0) ?? 0));
|
|
122
|
+
try {
|
|
123
|
+
return new TextDecoder('utf-8').decode(bytes);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return byteStr;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
_bpe(word) {
|
|
130
|
+
if (this.vocab.has(word))
|
|
131
|
+
return [word];
|
|
132
|
+
let symbols = [...word];
|
|
133
|
+
while (symbols.length > 1) {
|
|
134
|
+
let bestRank = Infinity;
|
|
135
|
+
let bestIdx = -1;
|
|
136
|
+
for (let i = 0; i < symbols.length - 1; i++) {
|
|
137
|
+
const pair = symbols[i] + ' ' + symbols[i + 1];
|
|
138
|
+
const rank = this.merges.get(pair);
|
|
139
|
+
if (rank !== undefined && rank < bestRank) {
|
|
140
|
+
bestRank = rank;
|
|
141
|
+
bestIdx = i;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (bestIdx === -1)
|
|
145
|
+
break;
|
|
146
|
+
const merged = symbols[bestIdx] + symbols[bestIdx + 1];
|
|
147
|
+
symbols = [
|
|
148
|
+
...symbols.slice(0, bestIdx),
|
|
149
|
+
merged,
|
|
150
|
+
...symbols.slice(bestIdx + 2),
|
|
151
|
+
];
|
|
152
|
+
}
|
|
153
|
+
return symbols;
|
|
154
|
+
}
|
|
155
|
+
padOrTruncate(ids, maxLen, side = 'right') {
|
|
156
|
+
if (ids.length >= maxLen)
|
|
157
|
+
return ids.slice(0, maxLen);
|
|
158
|
+
const padId = this.padId ?? 0;
|
|
159
|
+
const pad = new Array(maxLen - ids.length).fill(padId);
|
|
160
|
+
return side === 'right' ? [...ids, ...pad] : [...pad, ...ids];
|
|
161
|
+
}
|
|
162
|
+
get vocabSize() { return this.vocab.size; }
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=bpe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bpe.js","sourceRoot":"","sources":["../../src/tokenizer/bpe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* autograd.ts – Lightweight tape-based automatic differentiation engine.
|
|
3
|
+
*/
|
|
4
|
+
export declare class Tensor {
|
|
5
|
+
data: GPUBuffer | null;
|
|
6
|
+
shape: number[];
|
|
7
|
+
numel: number;
|
|
8
|
+
requiresGrad: boolean;
|
|
9
|
+
grad: GPUBuffer | null;
|
|
10
|
+
_gradFn: number | null;
|
|
11
|
+
constructor(data: GPUBuffer | null, shape: number[], requiresGrad?: boolean);
|
|
12
|
+
get byteSize(): number;
|
|
13
|
+
zeroGrad(device: GPUDevice): void;
|
|
14
|
+
destroy(): void;
|
|
15
|
+
}
|
|
16
|
+
export declare function enableGrad(): void;
|
|
17
|
+
export declare function noGrad(): void;
|
|
18
|
+
export declare function clearTape(): void;
|
|
19
|
+
export declare function recordOperation(backwardFn: () => void | Promise<void>): number;
|
|
20
|
+
export declare function backward(): Promise<void>;
|
|
21
|
+
export declare function ensureGradBuffer(device: GPUDevice, tensor: Tensor): void;
|
|
22
|
+
export declare function allocateGradients(device: GPUDevice, tensors: Tensor[]): void;
|
|
23
|
+
export declare function zeroGradients(device: GPUDevice, tensors: Tensor[]): void;
|
|
24
|
+
export declare function onesLikeScalar(device: GPUDevice): GPUBuffer;
|
|
25
|
+
export declare function crossEntropyLoss(logits: Float32Array, targetId: number): number;
|
|
26
|
+
export declare function crossEntropyGrad(logits: Float32Array, targetId: number): Float32Array;
|
|
27
|
+
//# sourceMappingURL=autograd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autograd.d.ts","sourceRoot":"","sources":["../../src/training/autograd.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,qBAAa,MAAM;IACf,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEX,IAAI,EAAE,SAAS,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,UAAQ;IASzE,IAAI,QAAQ,IAAI,MAAM,CAA2B;IAEjD,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAMjC,OAAO,IAAI,IAAI;CAMlB;AAED,wBAAgB,UAAU,IAAI,IAAI,CAA2B;AAC7D,wBAAgB,MAAM,IAAI,IAAI,CAA+B;AAC7D,wBAAgB,SAAS,IAAI,IAAI,CAAkB;AAEnD,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAI9E;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAK9C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAWxE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAI5E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAMxE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAW3D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAW/E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAiBrF"}
|