aifastdb 3.10.5 → 3.10.7
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/aifastdb.node +0 -0
- package/aifastdb.win32-x64-msvc.node +0 -0
- package/dist/concurrent-document-store.d.ts +4 -0
- package/dist/concurrent-document-store.d.ts.map +1 -1
- package/dist/concurrent-document-store.js +6 -0
- package/dist/concurrent-document-store.js.map +1 -1
- package/dist/find-async-baseline.d.ts +33 -0
- package/dist/find-async-baseline.d.ts.map +1 -0
- package/dist/find-async-baseline.js +424 -0
- package/dist/find-async-baseline.js.map +1 -0
- package/dist/find-async-bench.d.ts +22 -0
- package/dist/find-async-bench.d.ts.map +1 -0
- package/dist/find-async-bench.js +322 -0
- package/dist/find-async-bench.js.map +1 -0
- package/dist/find-async-verify.d.ts +23 -0
- package/dist/find-async-verify.d.ts.map +1 -0
- package/dist/find-async-verify.js +286 -0
- package/dist/find-async-verify.js.map +1 -0
- package/dist/hnsw-insert-profile-verify.d.ts +35 -0
- package/dist/hnsw-insert-profile-verify.d.ts.map +1 -0
- package/dist/hnsw-insert-profile-verify.js +250 -0
- package/dist/hnsw-insert-profile-verify.js.map +1 -0
- package/dist/micro-batcher-benchmark.d.ts +3 -0
- package/dist/micro-batcher-benchmark.d.ts.map +1 -0
- package/dist/micro-batcher-benchmark.js +296 -0
- package/dist/micro-batcher-benchmark.js.map +1 -0
- package/dist/micro-batcher.d.ts +97 -0
- package/dist/micro-batcher.d.ts.map +1 -0
- package/dist/micro-batcher.js +77 -0
- package/dist/micro-batcher.js.map +1 -0
- package/dist/native.d.ts +71 -0
- package/dist/native.d.ts.map +1 -1
- package/dist/native.js +6 -1
- package/dist/native.js.map +1 -1
- package/dist/phase-387-reproducibility-audit.d.ts +3 -0
- package/dist/phase-387-reproducibility-audit.d.ts.map +1 -0
- package/dist/phase-387-reproducibility-audit.js +236 -0
- package/dist/phase-387-reproducibility-audit.js.map +1 -0
- package/dist/phase-390-baseline-multiseed.d.ts +3 -0
- package/dist/phase-390-baseline-multiseed.d.ts.map +1 -0
- package/dist/phase-390-baseline-multiseed.js +241 -0
- package/dist/phase-390-baseline-multiseed.js.map +1 -0
- package/dist/phase-390-t2-mb-grid-sweep.d.ts +3 -0
- package/dist/phase-390-t2-mb-grid-sweep.d.ts.map +1 -0
- package/dist/phase-390-t2-mb-grid-sweep.js +291 -0
- package/dist/phase-390-t2-mb-grid-sweep.js.map +1 -0
- package/dist/read-profiler-verify.js +236 -1
- package/dist/read-profiler-verify.js.map +1 -1
- package/dist/remember-many-spawn-benchmark.d.ts +3 -0
- package/dist/remember-many-spawn-benchmark.d.ts.map +1 -0
- package/dist/remember-many-spawn-benchmark.js +163 -0
- package/dist/remember-many-spawn-benchmark.js.map +1 -0
- package/dist/remember-spawn-benchmark.d.ts +3 -0
- package/dist/remember-spawn-benchmark.d.ts.map +1 -0
- package/dist/remember-spawn-benchmark.js +230 -0
- package/dist/remember-spawn-benchmark.js.map +1 -0
- package/dist/remember-spawn-receipt-benchmark.d.ts +3 -0
- package/dist/remember-spawn-receipt-benchmark.d.ts.map +1 -0
- package/dist/remember-spawn-receipt-benchmark.js +266 -0
- package/dist/remember-spawn-receipt-benchmark.js.map +1 -0
- package/dist/sgv2-async-verify.d.ts +17 -0
- package/dist/sgv2-async-verify.d.ts.map +1 -0
- package/dist/sgv2-async-verify.js +217 -0
- package/dist/sgv2-async-verify.js.map +1 -0
- package/dist/social-graph-v2-read-benchmark.d.ts +11 -2
- package/dist/social-graph-v2-read-benchmark.d.ts.map +1 -1
- package/dist/social-graph-v2-read-benchmark.js +145 -3
- package/dist/social-graph-v2-read-benchmark.js.map +1 -1
- package/dist/social-graph-v2.d.ts +65 -4
- package/dist/social-graph-v2.d.ts.map +1 -1
- package/dist/social-graph-v2.js +72 -6
- package/dist/social-graph-v2.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-async-verify.js","sourceRoot":"","sources":["../ts/find-async-verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* phase-382/T382.1 — HNSW insert-path profiler verification
|
|
3
|
+
*
|
|
4
|
+
* Drives the freshly-instrumented HNSW insert path through two scenarios:
|
|
5
|
+
*
|
|
6
|
+
* A) sync write-through (default mode, deferred OFF):
|
|
7
|
+
* every remember() blocks on insert_node + entry_point.write()
|
|
8
|
+
* → ~2,167 ops/s baseline (T382.0)
|
|
9
|
+
* → expect insert_node_total ≈ insert_total
|
|
10
|
+
*
|
|
11
|
+
* B) deferred mode (background indexer drains a queue):
|
|
12
|
+
* remember() returns after enqueue, the bg thread eventually inserts
|
|
13
|
+
* → ~37,925 ops/s enqueue throughput, but background insert is still
|
|
14
|
+
* gated on the same insert_node + entry_point lock = ~710 ops/s
|
|
15
|
+
* → after flushDeferredIndex(), the profiler counts reflect the
|
|
16
|
+
* backlog drained by the bg thread, NOT the caller's enqueue rate
|
|
17
|
+
*
|
|
18
|
+
* The 5-segment breakdown produced for each scenario tells us where the
|
|
19
|
+
* 1.41 ms / vector wall time is actually spent. T382.0's hypothesis is
|
|
20
|
+
* that the bulk lives under `insert_node_total` (= entire body of
|
|
21
|
+
* `entry_point.write()` guard) and that `lock_wait` is non-zero only when
|
|
22
|
+
* concurrent insert callers are racing for the entry-point lock.
|
|
23
|
+
*
|
|
24
|
+
* Slot semantics (see vector/hnsw/insert_profiler.rs):
|
|
25
|
+
* insert_total wall time of pub fn insert
|
|
26
|
+
* insert_node_total wall time of insert_node (== entry_point lock holding)
|
|
27
|
+
* lock_wait time spent waiting for entry_point.write()
|
|
28
|
+
* graph_traversal sum of greedy_search_level + search_level + select
|
|
29
|
+
* neighbor_write sum of set_neighbors_fine + add_neighbor_and_prune
|
|
30
|
+
* alloc_setup nodes/neighbor_locks/id_map setup inside pub fn insert
|
|
31
|
+
*
|
|
32
|
+
* Run: npx tsx packages/node/ts/hnsw-insert-profile-verify.ts
|
|
33
|
+
*/
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=hnsw-insert-profile-verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hnsw-insert-profile-verify.d.ts","sourceRoot":"","sources":["../ts/hnsw-insert-profile-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* phase-382/T382.1 — HNSW insert-path profiler verification
|
|
4
|
+
*
|
|
5
|
+
* Drives the freshly-instrumented HNSW insert path through two scenarios:
|
|
6
|
+
*
|
|
7
|
+
* A) sync write-through (default mode, deferred OFF):
|
|
8
|
+
* every remember() blocks on insert_node + entry_point.write()
|
|
9
|
+
* → ~2,167 ops/s baseline (T382.0)
|
|
10
|
+
* → expect insert_node_total ≈ insert_total
|
|
11
|
+
*
|
|
12
|
+
* B) deferred mode (background indexer drains a queue):
|
|
13
|
+
* remember() returns after enqueue, the bg thread eventually inserts
|
|
14
|
+
* → ~37,925 ops/s enqueue throughput, but background insert is still
|
|
15
|
+
* gated on the same insert_node + entry_point lock = ~710 ops/s
|
|
16
|
+
* → after flushDeferredIndex(), the profiler counts reflect the
|
|
17
|
+
* backlog drained by the bg thread, NOT the caller's enqueue rate
|
|
18
|
+
*
|
|
19
|
+
* The 5-segment breakdown produced for each scenario tells us where the
|
|
20
|
+
* 1.41 ms / vector wall time is actually spent. T382.0's hypothesis is
|
|
21
|
+
* that the bulk lives under `insert_node_total` (= entire body of
|
|
22
|
+
* `entry_point.write()` guard) and that `lock_wait` is non-zero only when
|
|
23
|
+
* concurrent insert callers are racing for the entry-point lock.
|
|
24
|
+
*
|
|
25
|
+
* Slot semantics (see vector/hnsw/insert_profiler.rs):
|
|
26
|
+
* insert_total wall time of pub fn insert
|
|
27
|
+
* insert_node_total wall time of insert_node (== entry_point lock holding)
|
|
28
|
+
* lock_wait time spent waiting for entry_point.write()
|
|
29
|
+
* graph_traversal sum of greedy_search_level + search_level + select
|
|
30
|
+
* neighbor_write sum of set_neighbors_fine + add_neighbor_and_prune
|
|
31
|
+
* alloc_setup nodes/neighbor_locks/id_map setup inside pub fn insert
|
|
32
|
+
*
|
|
33
|
+
* Run: npx tsx packages/node/ts/hnsw-insert-profile-verify.ts
|
|
34
|
+
*/
|
|
35
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
36
|
+
if (k2 === undefined) k2 = k;
|
|
37
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
38
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
39
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
40
|
+
}
|
|
41
|
+
Object.defineProperty(o, k2, desc);
|
|
42
|
+
}) : (function(o, m, k, k2) {
|
|
43
|
+
if (k2 === undefined) k2 = k;
|
|
44
|
+
o[k2] = m[k];
|
|
45
|
+
}));
|
|
46
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
47
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
48
|
+
}) : function(o, v) {
|
|
49
|
+
o["default"] = v;
|
|
50
|
+
});
|
|
51
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
52
|
+
var ownKeys = function(o) {
|
|
53
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
54
|
+
var ar = [];
|
|
55
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
56
|
+
return ar;
|
|
57
|
+
};
|
|
58
|
+
return ownKeys(o);
|
|
59
|
+
};
|
|
60
|
+
return function (mod) {
|
|
61
|
+
if (mod && mod.__esModule) return mod;
|
|
62
|
+
var result = {};
|
|
63
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
64
|
+
__setModuleDefault(result, mod);
|
|
65
|
+
return result;
|
|
66
|
+
};
|
|
67
|
+
})();
|
|
68
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
69
|
+
const os = __importStar(require("os"));
|
|
70
|
+
const path = __importStar(require("path"));
|
|
71
|
+
const fs = __importStar(require("fs"));
|
|
72
|
+
// Direct require: phase-382/T382.1 NAPI exports (dumpHnswInsertProfile,
|
|
73
|
+
// dumpHnswInsertProfileReset) are top-level functions on the .node module
|
|
74
|
+
// and are not yet wired through native.ts (intentional — they are
|
|
75
|
+
// process-wide diagnostics, not part of the public TS surface).
|
|
76
|
+
function loadNative() {
|
|
77
|
+
const candidates = [
|
|
78
|
+
path.join(__dirname, '..', 'aifastdb.win32-x64-msvc.node'),
|
|
79
|
+
path.join(__dirname, '..', 'aifastdb.node'),
|
|
80
|
+
path.join(process.cwd(), 'packages', 'node', 'aifastdb.win32-x64-msvc.node'),
|
|
81
|
+
path.join(process.cwd(), 'packages', 'node', 'aifastdb.node'),
|
|
82
|
+
];
|
|
83
|
+
for (const p of candidates) {
|
|
84
|
+
try {
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
86
|
+
return require(p);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
/* try next */
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
throw new Error('Failed to load aifastdb native module');
|
|
93
|
+
}
|
|
94
|
+
function parseSnapshot(text) {
|
|
95
|
+
const rows = [];
|
|
96
|
+
const re = /^\s+(\S+)\s+count=\s*(\d+)\s+total_ns=\s*(\d+)\s+avg_ns=\s*(\d+)\s*$/;
|
|
97
|
+
for (const line of text.split('\n')) {
|
|
98
|
+
const m = line.match(re);
|
|
99
|
+
if (m) {
|
|
100
|
+
const total = Number(m[3]);
|
|
101
|
+
const count = Number(m[2]);
|
|
102
|
+
rows.push({
|
|
103
|
+
name: m[1],
|
|
104
|
+
count,
|
|
105
|
+
totalNs: total,
|
|
106
|
+
avgNs: count > 0 ? total / count : 0,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return rows;
|
|
111
|
+
}
|
|
112
|
+
function fmtNs(ns) {
|
|
113
|
+
if (ns >= 1000000)
|
|
114
|
+
return `${(ns / 1000000).toFixed(2)}ms`;
|
|
115
|
+
if (ns >= 1000)
|
|
116
|
+
return `${(ns / 1000).toFixed(1)}us`;
|
|
117
|
+
return `${ns}ns`;
|
|
118
|
+
}
|
|
119
|
+
function reportScenario(label, rows) {
|
|
120
|
+
// Locate the parent slot for percentage calculation. We use
|
|
121
|
+
// insert_total as the wall-time anchor; if it's zero (e.g. only the
|
|
122
|
+
// background indexer ran and pub fn insert wasn't called from the
|
|
123
|
+
// caller side), fall back to insert_node_total.
|
|
124
|
+
const total = rows.find((r) => r.name === 'insert_total');
|
|
125
|
+
const nodeTotal = rows.find((r) => r.name === 'insert_node_total');
|
|
126
|
+
const anchor = total && total.totalNs > 0 ? total : nodeTotal;
|
|
127
|
+
if (!anchor || anchor.totalNs === 0) {
|
|
128
|
+
console.log(`\n=== ${label} ===\n (no inserts recorded)`);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
console.log(`\n=== ${label} ===`);
|
|
132
|
+
console.log(` anchor=${anchor.name} count=${anchor.count} avg=${fmtNs(anchor.avgNs)}`);
|
|
133
|
+
for (const r of rows) {
|
|
134
|
+
if (r.count === 0)
|
|
135
|
+
continue;
|
|
136
|
+
const pct = ((r.totalNs / anchor.totalNs) * 100).toFixed(1);
|
|
137
|
+
console.log(` ${r.name.padEnd(20)} count=${String(r.count).padStart(8)} avg=${fmtNs(r.avgNs).padStart(10)} share=${pct}%`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function makeVec(dim) {
|
|
141
|
+
const v = new Array(dim);
|
|
142
|
+
for (let i = 0; i < dim; i++)
|
|
143
|
+
v[i] = Math.random() - 0.5;
|
|
144
|
+
return v;
|
|
145
|
+
}
|
|
146
|
+
async function main() {
|
|
147
|
+
const native = loadNative();
|
|
148
|
+
const dump = native.dumpHnswInsertProfile;
|
|
149
|
+
const dumpReset = native.dumpHnswInsertProfileReset;
|
|
150
|
+
const Aifastdb = native.AiFastDb || native.Aifastdb;
|
|
151
|
+
if (!dump || !dumpReset) {
|
|
152
|
+
throw new Error('dumpHnswInsertProfile not exposed on native module. Available: ' +
|
|
153
|
+
Object.keys(native).slice(0, 30).join(', '));
|
|
154
|
+
}
|
|
155
|
+
if (!Aifastdb)
|
|
156
|
+
throw new Error('AiFastDb class not found on native module');
|
|
157
|
+
const dim = 128;
|
|
158
|
+
const N_SYNC = 2000;
|
|
159
|
+
const N_DEFERRED = 5000;
|
|
160
|
+
console.log(`phase-382/T382.1 HNSW insert-path profiler verify (dim=${dim}, N_sync=${N_SYNC}, N_deferred=${N_DEFERRED})`);
|
|
161
|
+
// ---- Scenario A: sync write-through (deferred OFF) ----
|
|
162
|
+
const tmpA = fs.mkdtempSync(path.join(os.tmpdir(), 'hnsw-prof-sync-'));
|
|
163
|
+
const dbA = new Aifastdb({ path: path.join(tmpA, 'db'), dimension: dim });
|
|
164
|
+
dumpReset();
|
|
165
|
+
const tA0 = performance.now();
|
|
166
|
+
for (let i = 0; i < N_SYNC; i++) {
|
|
167
|
+
dbA.remember({
|
|
168
|
+
content: `sync-${i}`,
|
|
169
|
+
tags: ['prof'],
|
|
170
|
+
embedding: makeVec(dim),
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
const tA1 = performance.now();
|
|
174
|
+
const opsA = (N_SYNC * 1000) / (tA1 - tA0);
|
|
175
|
+
const snapA = parseSnapshot(dump());
|
|
176
|
+
reportScenario(`Scenario A (sync write-through, deferred OFF) ops/s=${opsA.toFixed(0)}`, snapA);
|
|
177
|
+
try {
|
|
178
|
+
dbA.close?.();
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
/* ignore */
|
|
182
|
+
}
|
|
183
|
+
// ---- Scenario B: deferred mode (background indexer drains the queue) ----
|
|
184
|
+
const tmpB = fs.mkdtempSync(path.join(os.tmpdir(), 'hnsw-prof-deferred-'));
|
|
185
|
+
const dbB = new Aifastdb({ path: path.join(tmpB, 'db'), dimension: dim });
|
|
186
|
+
dbB.enableDeferredIndexing(1000, 50, 200000);
|
|
187
|
+
dumpReset();
|
|
188
|
+
const tB0 = performance.now();
|
|
189
|
+
for (let i = 0; i < N_DEFERRED; i++) {
|
|
190
|
+
dbB.remember({
|
|
191
|
+
content: `deferred-${i}`,
|
|
192
|
+
tags: ['prof'],
|
|
193
|
+
embedding: makeVec(dim),
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
const tB1 = performance.now();
|
|
197
|
+
const enqueueOps = (N_DEFERRED * 1000) / (tB1 - tB0);
|
|
198
|
+
console.log(`\n[B] enqueue throughput (caller side, before flush) = ${enqueueOps.toFixed(0)} ops/s`);
|
|
199
|
+
// Now drain the queue and snapshot the bg-thread profile.
|
|
200
|
+
const flushT0 = performance.now();
|
|
201
|
+
dbB.flushDeferredIndex();
|
|
202
|
+
const flushSec = (performance.now() - flushT0) / 1000;
|
|
203
|
+
const drainOps = N_DEFERRED / flushSec;
|
|
204
|
+
console.log(`[B] background drain finished in ${flushSec.toFixed(1)}s (${drainOps.toFixed(0)} true HNSW inserts/s)`);
|
|
205
|
+
const snapB = parseSnapshot(dump());
|
|
206
|
+
reportScenario(`Scenario B (deferred mode, bg indexer drained) drain_ops/s=${drainOps.toFixed(0)}`, snapB);
|
|
207
|
+
try {
|
|
208
|
+
dbB.close?.();
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
/* ignore */
|
|
212
|
+
}
|
|
213
|
+
// ---- Decision summary ----
|
|
214
|
+
const findA = (n) => snapA.find((r) => r.name === n);
|
|
215
|
+
const findB = (n) => snapB.find((r) => r.name === n);
|
|
216
|
+
const totalA = findA('insert_total');
|
|
217
|
+
const nodeA = findA('insert_node_total');
|
|
218
|
+
const traversalA = findA('graph_traversal');
|
|
219
|
+
const neighborA = findA('neighbor_write');
|
|
220
|
+
const lockA = findA('lock_wait');
|
|
221
|
+
const allocA = findA('alloc_setup');
|
|
222
|
+
console.log('\n--- T382.1 decision summary (Scenario A, single-thread) ---');
|
|
223
|
+
if (totalA && nodeA && totalA.totalNs > 0) {
|
|
224
|
+
const nodeShare = (nodeA.totalNs / totalA.totalNs) * 100;
|
|
225
|
+
const traversalShare = traversalA
|
|
226
|
+
? (traversalA.totalNs / totalA.totalNs) * 100
|
|
227
|
+
: 0;
|
|
228
|
+
const neighborShare = neighborA
|
|
229
|
+
? (neighborA.totalNs / totalA.totalNs) * 100
|
|
230
|
+
: 0;
|
|
231
|
+
const lockShare = lockA ? (lockA.totalNs / totalA.totalNs) * 100 : 0;
|
|
232
|
+
const allocShare = allocA ? (allocA.totalNs / totalA.totalNs) * 100 : 0;
|
|
233
|
+
console.log(` insert_node_total share = ${nodeShare.toFixed(1)}% (entry_point.write() guard cost)`);
|
|
234
|
+
console.log(` graph_traversal share = ${traversalShare.toFixed(1)}%`);
|
|
235
|
+
console.log(` neighbor_write share = ${neighborShare.toFixed(1)}%`);
|
|
236
|
+
console.log(` lock_wait share = ${lockShare.toFixed(1)}% (single-thread, expect ~0)`);
|
|
237
|
+
console.log(` alloc_setup share = ${allocShare.toFixed(1)}%`);
|
|
238
|
+
const dominant = traversalShare > neighborShare && traversalShare > allocShare
|
|
239
|
+
? 'graph_traversal -> Phase 1 hypothesis A/D (defer/batch can amortize)'
|
|
240
|
+
: neighborShare > traversalShare
|
|
241
|
+
? 'neighbor_write -> Phase 2 partitioned HNSW (per-shard locks)'
|
|
242
|
+
: 'alloc_setup -> Phase 2 pre-allocated node pools';
|
|
243
|
+
console.log(` -> dominant phase = ${dominant}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
main().catch((e) => {
|
|
247
|
+
console.error(e);
|
|
248
|
+
process.exit(1);
|
|
249
|
+
});
|
|
250
|
+
//# sourceMappingURL=hnsw-insert-profile-verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hnsw-insert-profile-verify.js","sourceRoot":"","sources":["../ts/hnsw-insert-profile-verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"micro-batcher-benchmark.d.ts","sourceRoot":"","sources":["../ts/micro-batcher-benchmark.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
/**
|
|
38
|
+
* phase-385/T385.2 (E385.B): MicroBatcher vs raw rememberSpawn
|
|
39
|
+
* vs direct rememberManySpawn benchmark.
|
|
40
|
+
*
|
|
41
|
+
* Question being answered: can caller-side micro-batching of
|
|
42
|
+
* single-shot `rememberSpawn` calls into one `rememberManySpawn`
|
|
43
|
+
* cross-runtime spawn break the 67K NAPI dispatcher ceiling that
|
|
44
|
+
* capped phase-384's single-call path even with `ef_construction=50`?
|
|
45
|
+
*
|
|
46
|
+
* Sweeps:
|
|
47
|
+
* - windowMs ∈ {0, 1, 4, 16}
|
|
48
|
+
* - maxBatch ∈ {16, 32, 64, 128, 256}
|
|
49
|
+
* - concurrency ∈ {16, 32} (number of in-flight Promise.all callers)
|
|
50
|
+
*
|
|
51
|
+
* Baselines (phase-383 / phase-384 numbers, ef=50):
|
|
52
|
+
* raw rememberSpawn c=16: 67,300 ops/s
|
|
53
|
+
* raw rememberManySpawn bs=1000: 60,045 ops/s
|
|
54
|
+
* sync .remember() seq: 15,805 ops/s
|
|
55
|
+
*
|
|
56
|
+
* Decision gate (T385.3): keep MicroBatcher iff
|
|
57
|
+
* max micro-batched throughput >= 1.3x raw rememberSpawn c=16.
|
|
58
|
+
*
|
|
59
|
+
* Usage:
|
|
60
|
+
* npx tsx packages/node/ts/micro-batcher-benchmark.ts
|
|
61
|
+
* npx tsx packages/node/ts/micro-batcher-benchmark.ts --total 5000 --ef 50
|
|
62
|
+
*/
|
|
63
|
+
const os = __importStar(require("os"));
|
|
64
|
+
const path = __importStar(require("path"));
|
|
65
|
+
const fs = __importStar(require("fs"));
|
|
66
|
+
const micro_batcher_1 = require("./micro-batcher");
|
|
67
|
+
const args = new Map();
|
|
68
|
+
process.argv.slice(2).forEach((arg, i, arr) => {
|
|
69
|
+
if (arg.startsWith('--')) {
|
|
70
|
+
const key = arg.slice(2);
|
|
71
|
+
if (i + 1 < arr.length && !arr[i + 1].startsWith('--')) {
|
|
72
|
+
args.set(key, arr[i + 1]);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
args.set(key, 'true');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
const DIM = parseInt(args.get('dim') ?? '128', 10);
|
|
80
|
+
const TOTAL = parseInt(args.get('total') ?? '5000', 10);
|
|
81
|
+
const CONCURRENCIES = (args.get('concurrencies') ?? '16,32')
|
|
82
|
+
.split(',')
|
|
83
|
+
.map((s) => parseInt(s, 10));
|
|
84
|
+
const WINDOWS_MS = (args.get('windows') ?? '0,1,4,16')
|
|
85
|
+
.split(',')
|
|
86
|
+
.map((s) => parseInt(s, 10));
|
|
87
|
+
const MAX_BATCHES = (args.get('max-batches') ?? '16,32,64,128,256')
|
|
88
|
+
.split(',')
|
|
89
|
+
.map((s) => parseInt(s, 10));
|
|
90
|
+
const EF_CONSTRUCTION = parseInt(args.get('ef') ?? '50', 10);
|
|
91
|
+
// phase-387/T387.6: select the underlying batch flush call. 'spawn'
|
|
92
|
+
// (default) uses `rememberManySpawn` -> Vec<MemoryNode> matching the
|
|
93
|
+
// phase-385 baseline; 'receipt' uses `rememberManySpawnReceipts`
|
|
94
|
+
// shipped in phase-387/T387.3 -> Vec<WriteReceiptJS>, which collapses
|
|
95
|
+
// the JS-bound payload from a 13-field MemoryNode (incl. metadata
|
|
96
|
+
// serde_json::Value tree) to a 6-field receipt and lifts the NAPI
|
|
97
|
+
// dispatcher ceiling, especially under high caller concurrency.
|
|
98
|
+
const BACKEND = (args.get('backend') ?? 'spawn');
|
|
99
|
+
const EF_SEARCH = parseInt(args.get('ef-search') ?? '50', 10);
|
|
100
|
+
const M = parseInt(args.get('m') ?? '16', 10);
|
|
101
|
+
const ROOT = path.resolve(__dirname, '..', '..', '..');
|
|
102
|
+
const tmpRoot = path.join(os.tmpdir(), `aidb-mb-bench-${process.pid}`);
|
|
103
|
+
fs.mkdirSync(tmpRoot, { recursive: true });
|
|
104
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
105
|
+
const { AiFastDb } = require(path.join(ROOT, 'packages', 'node'));
|
|
106
|
+
function vectorOf(seed, dim) {
|
|
107
|
+
const v = new Array(dim);
|
|
108
|
+
for (let i = 0; i < dim; i++) {
|
|
109
|
+
v[i] = Math.sin(seed * 2654435761 + i * 374761393);
|
|
110
|
+
}
|
|
111
|
+
return v;
|
|
112
|
+
}
|
|
113
|
+
function makeInput(id, dim) {
|
|
114
|
+
return {
|
|
115
|
+
content: `bench doc ${id}`,
|
|
116
|
+
embedding: vectorOf(id, dim),
|
|
117
|
+
tags: ['bench'],
|
|
118
|
+
metadata: { id_num: id },
|
|
119
|
+
importance: 0.5,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function makeDb(dbPath, dim) {
|
|
123
|
+
fs.mkdirSync(dbPath, { recursive: true });
|
|
124
|
+
return new AiFastDb({
|
|
125
|
+
path: dbPath,
|
|
126
|
+
dimension: dim,
|
|
127
|
+
hnsw: {
|
|
128
|
+
m: M,
|
|
129
|
+
efConstruction: EF_CONSTRUCTION,
|
|
130
|
+
efSearch: EF_SEARCH,
|
|
131
|
+
dimension: dim,
|
|
132
|
+
maxElements: 1000000,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
async function runRawSpawn(concurrency, total, dim) {
|
|
137
|
+
const db = makeDb(path.join(tmpRoot, `raw-c${concurrency}-${Date.now()}`), dim);
|
|
138
|
+
const inputs = Array.from({ length: total }, (_, i) => makeInput(i, dim));
|
|
139
|
+
const start = process.hrtime.bigint();
|
|
140
|
+
let next = 0;
|
|
141
|
+
const workers = [];
|
|
142
|
+
for (let w = 0; w < concurrency; w++) {
|
|
143
|
+
workers.push((async () => {
|
|
144
|
+
while (true) {
|
|
145
|
+
const idx = next++;
|
|
146
|
+
if (idx >= total)
|
|
147
|
+
return;
|
|
148
|
+
await db.rememberSpawn(inputs[idx]);
|
|
149
|
+
}
|
|
150
|
+
})());
|
|
151
|
+
}
|
|
152
|
+
await Promise.all(workers);
|
|
153
|
+
const elapsed = Number(process.hrtime.bigint() - start) / 1e9;
|
|
154
|
+
return {
|
|
155
|
+
windowMs: -1,
|
|
156
|
+
maxBatch: -1,
|
|
157
|
+
concurrency,
|
|
158
|
+
total,
|
|
159
|
+
elapsedSec: elapsed,
|
|
160
|
+
opsPerSec: total / elapsed,
|
|
161
|
+
avgFlushSize: 1, // raw = 1 doc per spawn
|
|
162
|
+
flushCount: total,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
async function runMicroBatched(concurrency, total, dim, windowMs, maxBatch, pattern) {
|
|
166
|
+
const db = makeDb(path.join(tmpRoot, `mb-c${concurrency}-w${windowMs}-b${maxBatch}-${pattern}-${Date.now()}`), dim);
|
|
167
|
+
const inputs = Array.from({ length: total }, (_, i) => makeInput(i, dim));
|
|
168
|
+
let flushCount = 0;
|
|
169
|
+
let flushSizeSum = 0;
|
|
170
|
+
const flushFn = BACKEND === 'receipt'
|
|
171
|
+
? (xs) => db.rememberManySpawnReceipts(xs)
|
|
172
|
+
: (xs) => db.rememberManySpawn(xs);
|
|
173
|
+
const batcher = new micro_batcher_1.MicroBatcher(flushFn, {
|
|
174
|
+
windowMs,
|
|
175
|
+
maxBatch,
|
|
176
|
+
onFlush: (info) => {
|
|
177
|
+
flushCount++;
|
|
178
|
+
flushSizeSum += info.size;
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
const start = process.hrtime.bigint();
|
|
182
|
+
if (pattern === 'fire-and-forget') {
|
|
183
|
+
// True coalescing: every input is pushed at once into the
|
|
184
|
+
// batcher queue, then we await them all together. This is the
|
|
185
|
+
// pattern that actually gives the batcher anything to coalesce
|
|
186
|
+
// (queue length grows freely up to `maxBatch`). Mirrors the
|
|
187
|
+
// realistic case where a producer has N items ready and just
|
|
188
|
+
// wants per-item Promises to fire as soon as each item lands.
|
|
189
|
+
const promises = inputs.map((inp) => batcher.call(inp));
|
|
190
|
+
await Promise.all(promises);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
// sequential: every "caller" awaits its current call before
|
|
194
|
+
// pushing the next, with `concurrency` parallel callers. The
|
|
195
|
+
// queue length is then bounded by `concurrency` (NOT by
|
|
196
|
+
// `maxBatch`), because each caller is blocked on its own
|
|
197
|
+
// pending Promise. This is the pattern that BREAKS micro-
|
|
198
|
+
// batching on a window-driven flush — it forces every batch to
|
|
199
|
+
// wait `windowMs` because `maxBatch > concurrency` is never
|
|
200
|
+
// reached.
|
|
201
|
+
let next = 0;
|
|
202
|
+
const workers = [];
|
|
203
|
+
for (let w = 0; w < concurrency; w++) {
|
|
204
|
+
workers.push((async () => {
|
|
205
|
+
while (true) {
|
|
206
|
+
const idx = next++;
|
|
207
|
+
if (idx >= total)
|
|
208
|
+
return;
|
|
209
|
+
await batcher.call(inputs[idx]);
|
|
210
|
+
}
|
|
211
|
+
})());
|
|
212
|
+
}
|
|
213
|
+
await Promise.all(workers);
|
|
214
|
+
}
|
|
215
|
+
const elapsed = Number(process.hrtime.bigint() - start) / 1e9;
|
|
216
|
+
return {
|
|
217
|
+
windowMs,
|
|
218
|
+
maxBatch,
|
|
219
|
+
concurrency,
|
|
220
|
+
total,
|
|
221
|
+
elapsedSec: elapsed,
|
|
222
|
+
opsPerSec: total / elapsed,
|
|
223
|
+
avgFlushSize: flushCount > 0 ? flushSizeSum / flushCount : 0,
|
|
224
|
+
flushCount,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
async function main() {
|
|
228
|
+
console.log(`[bench] phase-385/T385.2 MicroBatcher vs raw rememberSpawn (phase-387 backend=${BACKEND})`);
|
|
229
|
+
console.log(`[bench] dim=${DIM} total=${TOTAL} ef=${EF_CONSTRUCTION} concurrencies=${CONCURRENCIES.join(',')}`);
|
|
230
|
+
console.log(`[bench] windows=${WINDOWS_MS.join(',')}ms max_batches=${MAX_BATCHES.join(',')}`);
|
|
231
|
+
console.log(`[bench] node=${process.version} cpus=${os.cpus().length}`);
|
|
232
|
+
console.log('');
|
|
233
|
+
// 1. raw baselines
|
|
234
|
+
console.log('Phase A: raw rememberSpawn (no batcher)');
|
|
235
|
+
const rawResults = [];
|
|
236
|
+
for (const c of CONCURRENCIES) {
|
|
237
|
+
const r = await runRawSpawn(c, TOTAL, DIM);
|
|
238
|
+
rawResults.push(r);
|
|
239
|
+
console.log(` raw c=${String(c).padStart(2)} elapsed=${r.elapsedSec.toFixed(3)}s ops/s=${r.opsPerSec.toFixed(1).padStart(10)}`);
|
|
240
|
+
}
|
|
241
|
+
const rawC16 = rawResults.find((r) => r.concurrency === 16);
|
|
242
|
+
const rawBaseline = rawC16?.opsPerSec ?? rawResults[0].opsPerSec;
|
|
243
|
+
console.log('');
|
|
244
|
+
// 2a. micro-batched sweep (fire-and-forget pattern — true coalescing)
|
|
245
|
+
console.log('Phase B1: MicroBatcher fire-and-forget (queue grows to maxBatch)');
|
|
246
|
+
const mbResults = [];
|
|
247
|
+
for (const win of WINDOWS_MS) {
|
|
248
|
+
for (const mb of MAX_BATCHES) {
|
|
249
|
+
const r = await runMicroBatched(1, TOTAL, DIM, win, mb, 'fire-and-forget');
|
|
250
|
+
mbResults.push(r);
|
|
251
|
+
const lift = r.opsPerSec / rawBaseline;
|
|
252
|
+
console.log(` mb-faf win=${String(win).padStart(2)}ms max=${String(mb).padStart(3)} ` +
|
|
253
|
+
`elapsed=${r.elapsedSec.toFixed(3)}s ops/s=${r.opsPerSec.toFixed(1).padStart(10)} ` +
|
|
254
|
+
`avg_flush=${r.avgFlushSize.toFixed(1).padStart(6)} flushes=${String(r.flushCount).padStart(5)} ` +
|
|
255
|
+
`lift_vs_raw_c16=${lift.toFixed(2)}x`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
console.log('');
|
|
259
|
+
// 2b. micro-batched sweep (sequential pattern — anti-pattern,
|
|
260
|
+
// here for diagnostic purposes)
|
|
261
|
+
console.log('Phase B2: MicroBatcher sequential callers (anti-pattern, diagnostic only)');
|
|
262
|
+
for (const c of CONCURRENCIES) {
|
|
263
|
+
for (const win of WINDOWS_MS) {
|
|
264
|
+
for (const mb of [16, 64]) {
|
|
265
|
+
const r = await runMicroBatched(c, TOTAL, DIM, win, mb, 'sequential');
|
|
266
|
+
const lift = r.opsPerSec / rawBaseline;
|
|
267
|
+
console.log(` mb-seq c=${String(c).padStart(2)} win=${String(win).padStart(2)}ms max=${String(mb).padStart(3)} ` +
|
|
268
|
+
`elapsed=${r.elapsedSec.toFixed(3)}s ops/s=${r.opsPerSec.toFixed(1).padStart(10)} ` +
|
|
269
|
+
`avg_flush=${r.avgFlushSize.toFixed(1).padStart(6)} flushes=${String(r.flushCount).padStart(5)} ` +
|
|
270
|
+
`lift_vs_raw_c16=${lift.toFixed(2)}x`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
console.log('');
|
|
275
|
+
// 3. summary
|
|
276
|
+
const best = mbResults.reduce((a, b) => (b.opsPerSec > a.opsPerSec ? b : a));
|
|
277
|
+
console.log('---');
|
|
278
|
+
console.log(`raw_rememberSpawn_c16_ops: ${rawBaseline.toFixed(1)}`);
|
|
279
|
+
console.log(`best_micro_batched_ops: ${best.opsPerSec.toFixed(1)} (c=${best.concurrency} win=${best.windowMs}ms max=${best.maxBatch}; avg_flush=${best.avgFlushSize.toFixed(1)})`);
|
|
280
|
+
console.log(`best_lift_vs_raw_c16: ${(best.opsPerSec / rawBaseline).toFixed(2)}x`);
|
|
281
|
+
console.log(`ef_construction: ${EF_CONSTRUCTION}`);
|
|
282
|
+
console.log(`platform: ${process.platform}-${process.arch}`);
|
|
283
|
+
console.log(`cpus: ${os.cpus().length}`);
|
|
284
|
+
console.log('---');
|
|
285
|
+
try {
|
|
286
|
+
fs.rmSync(tmpRoot, { recursive: true, force: true });
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
// best-effort cleanup
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
main().catch((err) => {
|
|
293
|
+
console.error('[bench] error:', err);
|
|
294
|
+
process.exit(1);
|
|
295
|
+
});
|
|
296
|
+
//# sourceMappingURL=micro-batcher-benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"micro-batcher-benchmark.js","sourceRoot":"","sources":["../ts/micro-batcher-benchmark.ts"],"names":[],"mappings":"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"}
|