@seanhogg/builderforce-memory-engine 2026.7.12 → 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 +29 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -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 +180 -4
- package/dist/lm/evermind_lm.d.ts.map +1 -1
- package/dist/lm/evermind_lm.js +433 -116
- package/dist/lm/evermind_lm.js.map +1 -1
- package/dist/lm/index.d.ts +8 -2
- package/dist/lm/index.d.ts.map +1 -1
- package/dist/lm/index.js +6 -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 +58 -1
- package/dist/optim/adamw.d.ts.map +1 -1
- package/dist/optim/adamw.js +69 -4
- 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/lora.d.ts +153 -0
- package/dist/training/lora.d.ts.map +1 -0
- package/dist/training/lora.js +324 -0
- package/dist/training/lora.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/mixed_precision.d.ts +67 -0
- package/dist/training/mixed_precision.d.ts.map +1 -0
- package/dist/training/mixed_precision.js +101 -0
- package/dist/training/mixed_precision.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 +104 -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 +470 -116
- package/src/lm/index.ts +12 -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 +115 -7
- package/src/tokenizer/bpe.ts +55 -0
- package/src/training/cpu_ops.ts +127 -0
- package/src/training/lora.ts +365 -0
- package/src/training/mamba1_cpu.ts +421 -0
- package/src/training/mixed_precision.ts +119 -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
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* slice.ts — strided COLUMN slice of a row-major (rows, stride) tensor.
|
|
3
|
+
*
|
|
4
|
+
* Every block in this engine projects into one fused tensor and then splits it:
|
|
5
|
+
* Mamba-1 into (x, z) and (Δ, B, C), Mamba-2/3 into (x, Δ) and (x, B, C),
|
|
6
|
+
* attention into (Q, K, V). `LINEAR_FORWARD_WGSL` writes its output `(M, N)`
|
|
7
|
+
* ROW-major, so each of those parts is a contiguous range of COLUMNS **within
|
|
8
|
+
* every row** — not a contiguous range of the buffer.
|
|
9
|
+
*
|
|
10
|
+
* Splitting them with `copyBufferToBuffer` therefore took whole ROWS instead: it
|
|
11
|
+
* is only the right answer when `M == 1` (batch × seq_len), and for any real
|
|
12
|
+
* sequence it silently handed the block the wrong tensor. This kernel is the one
|
|
13
|
+
* correct implementation; every block uses it.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { createBindGroup, createUniformBuffer, dispatchKernel, cdiv } from '../utils/gpu_utils.js';
|
|
17
|
+
|
|
18
|
+
export const COL_SLICE_WGSL: string = /* wgsl */`
|
|
19
|
+
struct SliceParams {
|
|
20
|
+
rows : u32,
|
|
21
|
+
stride : u32, // source row width
|
|
22
|
+
offset : u32, // first column to take
|
|
23
|
+
width : u32, // number of columns to take
|
|
24
|
+
};
|
|
25
|
+
@group(0) @binding(0) var<uniform> p : SliceParams;
|
|
26
|
+
@group(0) @binding(1) var<storage, read> src : array<f32>;
|
|
27
|
+
@group(0) @binding(2) var<storage, read_write> dst : array<f32>;
|
|
28
|
+
|
|
29
|
+
// Dispatch: (ceil(rows * width / 256), 1, 1)
|
|
30
|
+
@compute @workgroup_size(256)
|
|
31
|
+
fn col_slice(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
32
|
+
let i = gid.x;
|
|
33
|
+
if (i >= p.rows * p.width) { return; }
|
|
34
|
+
let r = i / p.width;
|
|
35
|
+
let c = i % p.width;
|
|
36
|
+
dst[i] = src[r * p.stride + p.offset + c];
|
|
37
|
+
}
|
|
38
|
+
`;
|
|
39
|
+
|
|
40
|
+
/** Entry point name of {@link COL_SLICE_WGSL}. */
|
|
41
|
+
export const COL_SLICE_ENTRY = 'col_slice';
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* `dst[r, 0..width) = src[r, offset..offset+width)` for every row.
|
|
45
|
+
*
|
|
46
|
+
* @param pipeline a pipeline built from {@link COL_SLICE_WGSL} / {@link COL_SLICE_ENTRY}
|
|
47
|
+
* @param rows batch * seqLen
|
|
48
|
+
* @param stride source row width (the fused projection's output features)
|
|
49
|
+
*/
|
|
50
|
+
export function dispatchColumnSlice(
|
|
51
|
+
device: GPUDevice,
|
|
52
|
+
pipeline: GPUComputePipeline,
|
|
53
|
+
src: GPUBuffer,
|
|
54
|
+
dst: GPUBuffer,
|
|
55
|
+
rows: number,
|
|
56
|
+
stride: number,
|
|
57
|
+
offset: number,
|
|
58
|
+
width: number,
|
|
59
|
+
): void {
|
|
60
|
+
const pBuf = createUniformBuffer(device, new Uint32Array([rows, stride, offset, width]).buffer);
|
|
61
|
+
const bg = createBindGroup(device, pipeline, [pBuf, src, dst]);
|
|
62
|
+
dispatchKernel(device, pipeline, bg, [cdiv(rows * width, 256), 1, 1]);
|
|
63
|
+
pBuf.destroy();
|
|
64
|
+
}
|
|
@@ -79,6 +79,20 @@ fn adamw_update(
|
|
|
79
79
|
|
|
80
80
|
// Gradient clipping kernel – clips global gradient norm to max_norm.
|
|
81
81
|
// Run before weight updates. Two-pass: first compute squared norm, then scale.
|
|
82
|
+
//
|
|
83
|
+
// The accumulator is a REAL atomic. It used to be a plain `array<f32>` written as
|
|
84
|
+
// `norm_sq[0] = norm_sq[0] + local_sq[0]` by the lane-0 invocation of every
|
|
85
|
+
// workgroup — a read-modify-write with no synchronisation, so with more than one
|
|
86
|
+
// workgroup (i.e. any tensor above 256 elements) concurrent workgroups lost each
|
|
87
|
+
// other's contributions and the norm came out too SMALL, under-clipping exactly
|
|
88
|
+
// when clipping matters most. WGSL has no `atomic<f32>`, so the accumulator is an
|
|
89
|
+
// `atomic<u32>` holding the f32 bit pattern and updated with a
|
|
90
|
+
// compare-exchange loop — the standard portable float-atomic-add.
|
|
91
|
+
//
|
|
92
|
+
// Summation ORDER across workgroups is not deterministic (floating-point addition
|
|
93
|
+
// is not associative), so the norm can differ in the last ulp or two between runs.
|
|
94
|
+
// That is fine for a clip threshold and is the accepted trade for correctness;
|
|
95
|
+
// nothing downstream depends on a bit-exact norm.
|
|
82
96
|
export const GRAD_CLIP_WGSL: string = /* wgsl */`
|
|
83
97
|
|
|
84
98
|
struct ClipParams {
|
|
@@ -88,10 +102,23 @@ struct ClipParams {
|
|
|
88
102
|
|
|
89
103
|
@group(0) @binding(0) var<uniform> clip_p : ClipParams;
|
|
90
104
|
@group(0) @binding(1) var<storage, read_write> grad : array<f32>;
|
|
91
|
-
|
|
105
|
+
// size 1 – the f32 bit pattern of the accumulated sum of squares, updated
|
|
106
|
+
// atomically. Zero-initialise it by writing 0.0f (bit pattern 0x00000000).
|
|
107
|
+
@group(0) @binding(2) var<storage, read_write> norm_sq : array<atomic<u32>>;
|
|
92
108
|
|
|
93
109
|
var<workgroup> local_sq : array<f32, 256>;
|
|
94
110
|
|
|
111
|
+
// Portable atomic add on an f32 stored as its u32 bit pattern.
|
|
112
|
+
fn atomic_add_f32(value: f32) {
|
|
113
|
+
var old_bits : u32 = atomicLoad(&norm_sq[0]);
|
|
114
|
+
loop {
|
|
115
|
+
let new_bits = bitcast<u32>(bitcast<f32>(old_bits) + value);
|
|
116
|
+
let res = atomicCompareExchangeWeak(&norm_sq[0], old_bits, new_bits);
|
|
117
|
+
if (res.exchanged) { break; }
|
|
118
|
+
old_bits = res.old_value;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
95
122
|
// Pass 1: reduce sum of squares into norm_sq[0]
|
|
96
123
|
@compute @workgroup_size(256, 1, 1)
|
|
97
124
|
fn grad_norm_reduce(
|
|
@@ -117,8 +144,7 @@ fn grad_norm_reduce(
|
|
|
117
144
|
}
|
|
118
145
|
|
|
119
146
|
if (lid == 0u) {
|
|
120
|
-
|
|
121
|
-
norm_sq[0] = norm_sq[0] + local_sq[0];
|
|
147
|
+
atomic_add_f32(local_sq[0]);
|
|
122
148
|
}
|
|
123
149
|
}
|
|
124
150
|
|
|
@@ -130,7 +156,7 @@ fn grad_clip_scale(
|
|
|
130
156
|
let i = gid.x;
|
|
131
157
|
if (i >= clip_p.num_elements) { return; }
|
|
132
158
|
|
|
133
|
-
let ns = norm_sq[0];
|
|
159
|
+
let ns = bitcast<f32>(atomicLoad(&norm_sq[0]));
|
|
134
160
|
if (ns > clip_p.max_norm_sq) {
|
|
135
161
|
let scale = sqrt(clip_p.max_norm_sq / ns);
|
|
136
162
|
grad[i] = grad[i] * scale;
|