edgeflowjs 0.1.0
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 +473 -0
- package/dist/backends/index.d.ts +13 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +32 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/onnx.d.ts +46 -0
- package/dist/backends/onnx.d.ts.map +1 -0
- package/dist/backends/onnx.js +249 -0
- package/dist/backends/onnx.js.map +1 -0
- package/dist/backends/wasm.d.ts +78 -0
- package/dist/backends/wasm.d.ts.map +1 -0
- package/dist/backends/wasm.js +358 -0
- package/dist/backends/wasm.js.map +1 -0
- package/dist/backends/webgpu.d.ts +143 -0
- package/dist/backends/webgpu.d.ts.map +1 -0
- package/dist/backends/webgpu.js +326 -0
- package/dist/backends/webgpu.js.map +1 -0
- package/dist/backends/webnn.d.ts +115 -0
- package/dist/backends/webnn.d.ts.map +1 -0
- package/dist/backends/webnn.js +202 -0
- package/dist/backends/webnn.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +14 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/memory.d.ts +234 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +554 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/runtime.d.ts +129 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +352 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/scheduler.d.ts +118 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +600 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/tensor.d.ts +149 -0
- package/dist/core/tensor.d.ts.map +1 -0
- package/dist/core/tensor.js +719 -0
- package/dist/core/tensor.js.map +1 -0
- package/dist/core/types.d.ts +367 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +54 -0
- package/dist/core/types.js.map +1 -0
- package/dist/edgeflow.browser.js +5601 -0
- package/dist/edgeflow.browser.js.map +7 -0
- package/dist/edgeflow.browser.min.js +19 -0
- package/dist/edgeflow.browser.min.js.map +7 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +158 -0
- package/dist/index.js.map +1 -0
- package/dist/pipelines/base.d.ts +122 -0
- package/dist/pipelines/base.d.ts.map +1 -0
- package/dist/pipelines/base.js +155 -0
- package/dist/pipelines/base.js.map +1 -0
- package/dist/pipelines/feature-extraction.d.ts +68 -0
- package/dist/pipelines/feature-extraction.d.ts.map +1 -0
- package/dist/pipelines/feature-extraction.js +197 -0
- package/dist/pipelines/feature-extraction.js.map +1 -0
- package/dist/pipelines/image-classification.d.ts +61 -0
- package/dist/pipelines/image-classification.d.ts.map +1 -0
- package/dist/pipelines/image-classification.js +140 -0
- package/dist/pipelines/image-classification.js.map +1 -0
- package/dist/pipelines/index.d.ts +58 -0
- package/dist/pipelines/index.d.ts.map +1 -0
- package/dist/pipelines/index.js +72 -0
- package/dist/pipelines/index.js.map +1 -0
- package/dist/pipelines/text-classification.d.ts +71 -0
- package/dist/pipelines/text-classification.d.ts.map +1 -0
- package/dist/pipelines/text-classification.js +175 -0
- package/dist/pipelines/text-classification.js.map +1 -0
- package/dist/tools/index.d.ts +143 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +294 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/utils/cache.d.ts +162 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +443 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/model-loader.d.ts +107 -0
- package/dist/utils/model-loader.d.ts.map +1 -0
- package/dist/utils/model-loader.js +694 -0
- package/dist/utils/model-loader.js.map +1 -0
- package/dist/utils/preprocessor.d.ts +147 -0
- package/dist/utils/preprocessor.d.ts.map +1 -0
- package/dist/utils/preprocessor.js +423 -0
- package/dist/utils/preprocessor.js.map +1 -0
- package/dist/utils/tokenizer.d.ts +140 -0
- package/dist/utils/tokenizer.d.ts.map +1 -0
- package/dist/utils/tokenizer.js +397 -0
- package/dist/utils/tokenizer.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* edgeFlow.js - Memory Management
|
|
3
|
+
*
|
|
4
|
+
* Efficient memory management for tensors and models.
|
|
5
|
+
* Features:
|
|
6
|
+
* - Memory pooling
|
|
7
|
+
* - Automatic garbage collection
|
|
8
|
+
* - Memory tracking and statistics
|
|
9
|
+
* - Leak detection
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Default memory pool configuration
|
|
13
|
+
*/
|
|
14
|
+
const DEFAULT_POOL_CONFIG = {
|
|
15
|
+
initialSize: 64 * 1024 * 1024, // 64MB
|
|
16
|
+
maxSize: 512 * 1024 * 1024, // 512MB
|
|
17
|
+
growthFactor: 1.5,
|
|
18
|
+
autoGC: true,
|
|
19
|
+
gcThreshold: 0.8, // 80%
|
|
20
|
+
};
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// Memory Manager
|
|
23
|
+
// ============================================================================
|
|
24
|
+
/**
|
|
25
|
+
* MemoryManager - Central memory management
|
|
26
|
+
*
|
|
27
|
+
* Provides:
|
|
28
|
+
* - Resource tracking
|
|
29
|
+
* - Memory statistics
|
|
30
|
+
* - Garbage collection coordination
|
|
31
|
+
* - Memory warning events
|
|
32
|
+
*/
|
|
33
|
+
export class MemoryManager {
|
|
34
|
+
static instance = null;
|
|
35
|
+
config;
|
|
36
|
+
resources = new Map();
|
|
37
|
+
disposers = new Map();
|
|
38
|
+
listeners = new Map();
|
|
39
|
+
allocated = 0;
|
|
40
|
+
peak = 0;
|
|
41
|
+
gcScheduled = false;
|
|
42
|
+
disposed = false;
|
|
43
|
+
constructor(config = {}) {
|
|
44
|
+
this.config = { ...DEFAULT_POOL_CONFIG, ...config };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get singleton instance
|
|
48
|
+
*/
|
|
49
|
+
static getInstance() {
|
|
50
|
+
if (!MemoryManager.instance) {
|
|
51
|
+
MemoryManager.instance = new MemoryManager();
|
|
52
|
+
}
|
|
53
|
+
return MemoryManager.instance;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Configure the memory manager
|
|
57
|
+
*/
|
|
58
|
+
static configure(config) {
|
|
59
|
+
if (MemoryManager.instance) {
|
|
60
|
+
console.warn('MemoryManager already initialized, configuration may not apply');
|
|
61
|
+
}
|
|
62
|
+
MemoryManager.instance = new MemoryManager(config);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Track a tensor
|
|
66
|
+
*/
|
|
67
|
+
track(tensor, disposer) {
|
|
68
|
+
if (this.disposed)
|
|
69
|
+
return;
|
|
70
|
+
const size = this.estimateTensorSize(tensor);
|
|
71
|
+
this.resources.set(tensor.id, {
|
|
72
|
+
id: tensor.id,
|
|
73
|
+
type: 'tensor',
|
|
74
|
+
size,
|
|
75
|
+
createdAt: Date.now(),
|
|
76
|
+
stackTrace: this.captureStackTrace(),
|
|
77
|
+
});
|
|
78
|
+
if (disposer) {
|
|
79
|
+
this.disposers.set(tensor.id, disposer);
|
|
80
|
+
}
|
|
81
|
+
this.allocated += size;
|
|
82
|
+
this.peak = Math.max(this.peak, this.allocated);
|
|
83
|
+
this.checkMemoryThreshold();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Track a model
|
|
87
|
+
*/
|
|
88
|
+
trackModel(model, disposer) {
|
|
89
|
+
if (this.disposed)
|
|
90
|
+
return;
|
|
91
|
+
const size = model.metadata.sizeBytes;
|
|
92
|
+
this.resources.set(model.id, {
|
|
93
|
+
id: model.id,
|
|
94
|
+
type: 'model',
|
|
95
|
+
size,
|
|
96
|
+
createdAt: Date.now(),
|
|
97
|
+
stackTrace: this.captureStackTrace(),
|
|
98
|
+
});
|
|
99
|
+
if (disposer) {
|
|
100
|
+
this.disposers.set(model.id, disposer);
|
|
101
|
+
}
|
|
102
|
+
this.allocated += size;
|
|
103
|
+
this.peak = Math.max(this.peak, this.allocated);
|
|
104
|
+
this.checkMemoryThreshold();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Untrack a resource
|
|
108
|
+
*/
|
|
109
|
+
untrack(id) {
|
|
110
|
+
const resource = this.resources.get(id);
|
|
111
|
+
if (resource) {
|
|
112
|
+
this.allocated -= resource.size;
|
|
113
|
+
this.resources.delete(id);
|
|
114
|
+
this.disposers.delete(id);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Release a resource
|
|
119
|
+
*/
|
|
120
|
+
release(resourceOrId) {
|
|
121
|
+
const id = typeof resourceOrId === 'string' ? resourceOrId : resourceOrId.id;
|
|
122
|
+
const disposer = this.disposers.get(id);
|
|
123
|
+
if (disposer) {
|
|
124
|
+
try {
|
|
125
|
+
disposer();
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.error('Error disposing resource:', error);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
this.untrack(id);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Estimate tensor memory size
|
|
135
|
+
*/
|
|
136
|
+
estimateTensorSize(tensor) {
|
|
137
|
+
const bytesPerElement = this.getBytesPerElement(tensor.dtype);
|
|
138
|
+
return tensor.size * bytesPerElement;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get bytes per element for a data type
|
|
142
|
+
*/
|
|
143
|
+
getBytesPerElement(dtype) {
|
|
144
|
+
switch (dtype) {
|
|
145
|
+
case 'float32':
|
|
146
|
+
return 4;
|
|
147
|
+
case 'float16':
|
|
148
|
+
return 2;
|
|
149
|
+
case 'int32':
|
|
150
|
+
return 4;
|
|
151
|
+
case 'int64':
|
|
152
|
+
return 8;
|
|
153
|
+
case 'uint8':
|
|
154
|
+
case 'int8':
|
|
155
|
+
case 'bool':
|
|
156
|
+
return 1;
|
|
157
|
+
default:
|
|
158
|
+
return 4;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Capture stack trace for debugging
|
|
163
|
+
*/
|
|
164
|
+
captureStackTrace() {
|
|
165
|
+
if (typeof Error.captureStackTrace === 'function') {
|
|
166
|
+
const obj = {};
|
|
167
|
+
Error.captureStackTrace(obj, this.captureStackTrace);
|
|
168
|
+
return obj.stack;
|
|
169
|
+
}
|
|
170
|
+
return new Error().stack;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Check if memory threshold is exceeded
|
|
174
|
+
*/
|
|
175
|
+
checkMemoryThreshold() {
|
|
176
|
+
if (!this.config.autoGC)
|
|
177
|
+
return;
|
|
178
|
+
const usage = this.allocated / this.config.maxSize;
|
|
179
|
+
if (usage >= this.config.gcThreshold && !this.gcScheduled) {
|
|
180
|
+
this.gcScheduled = true;
|
|
181
|
+
this.emit('memory:warning', {
|
|
182
|
+
allocated: this.allocated,
|
|
183
|
+
maxSize: this.config.maxSize,
|
|
184
|
+
usage,
|
|
185
|
+
});
|
|
186
|
+
// Schedule GC on next tick
|
|
187
|
+
setTimeout(() => {
|
|
188
|
+
this.gc();
|
|
189
|
+
this.gcScheduled = false;
|
|
190
|
+
}, 0);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Garbage collection helper
|
|
195
|
+
*/
|
|
196
|
+
gc() {
|
|
197
|
+
this.emit('memory:gc', { before: this.allocated });
|
|
198
|
+
// In browser environment, we can only suggest GC
|
|
199
|
+
// by releasing unused resources
|
|
200
|
+
// Find old resources that might be unused
|
|
201
|
+
const now = Date.now();
|
|
202
|
+
const oldResources = [];
|
|
203
|
+
for (const [id, resource] of this.resources) {
|
|
204
|
+
// Resources older than 5 minutes might be candidates for cleanup
|
|
205
|
+
if (now - resource.createdAt > 5 * 60 * 1000) {
|
|
206
|
+
oldResources.push(id);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Note: We don't automatically release old resources
|
|
210
|
+
// This is just for reporting purposes
|
|
211
|
+
// Actual cleanup should be done by the user
|
|
212
|
+
this.emit('memory:gc', {
|
|
213
|
+
after: this.allocated,
|
|
214
|
+
potentialCleanup: oldResources.length,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get memory statistics
|
|
219
|
+
*/
|
|
220
|
+
getStats() {
|
|
221
|
+
let tensorCount = 0;
|
|
222
|
+
let modelCount = 0;
|
|
223
|
+
for (const resource of this.resources.values()) {
|
|
224
|
+
if (resource.type === 'tensor') {
|
|
225
|
+
tensorCount++;
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
modelCount++;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
allocated: this.allocated,
|
|
233
|
+
used: this.allocated, // In JS, allocated = used
|
|
234
|
+
peak: this.peak,
|
|
235
|
+
tensorCount,
|
|
236
|
+
modelCount,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Get detailed resource list (for debugging)
|
|
241
|
+
*/
|
|
242
|
+
getResourceDetails() {
|
|
243
|
+
return Array.from(this.resources.values());
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Check for potential memory leaks
|
|
247
|
+
*/
|
|
248
|
+
detectLeaks(maxAge = 10 * 60 * 1000) {
|
|
249
|
+
const now = Date.now();
|
|
250
|
+
const potentialLeaks = [];
|
|
251
|
+
for (const resource of this.resources.values()) {
|
|
252
|
+
if (now - resource.createdAt > maxAge) {
|
|
253
|
+
potentialLeaks.push(resource);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return potentialLeaks;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Add event listener
|
|
260
|
+
*/
|
|
261
|
+
on(event, listener) {
|
|
262
|
+
let listeners = this.listeners.get(event);
|
|
263
|
+
if (!listeners) {
|
|
264
|
+
listeners = new Set();
|
|
265
|
+
this.listeners.set(event, listeners);
|
|
266
|
+
}
|
|
267
|
+
listeners.add(listener);
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Remove event listener
|
|
271
|
+
*/
|
|
272
|
+
off(event, listener) {
|
|
273
|
+
const listeners = this.listeners.get(event);
|
|
274
|
+
if (listeners) {
|
|
275
|
+
listeners.delete(listener);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Emit event
|
|
280
|
+
*/
|
|
281
|
+
emit(type, data) {
|
|
282
|
+
const event = {
|
|
283
|
+
type,
|
|
284
|
+
timestamp: Date.now(),
|
|
285
|
+
data,
|
|
286
|
+
};
|
|
287
|
+
const listeners = this.listeners.get(type);
|
|
288
|
+
if (listeners) {
|
|
289
|
+
for (const listener of listeners) {
|
|
290
|
+
try {
|
|
291
|
+
listener(event);
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
console.error('Error in event listener:', error);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Reset statistics
|
|
301
|
+
*/
|
|
302
|
+
resetStats() {
|
|
303
|
+
this.peak = this.allocated;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Dispose all resources
|
|
307
|
+
*/
|
|
308
|
+
disposeAll() {
|
|
309
|
+
for (const id of this.resources.keys()) {
|
|
310
|
+
this.release(id);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Dispose the manager
|
|
315
|
+
*/
|
|
316
|
+
dispose() {
|
|
317
|
+
this.disposeAll();
|
|
318
|
+
this.disposed = true;
|
|
319
|
+
this.listeners.clear();
|
|
320
|
+
MemoryManager.instance = null;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// ============================================================================
|
|
324
|
+
// Memory Scope (RAII-like pattern)
|
|
325
|
+
// ============================================================================
|
|
326
|
+
/**
|
|
327
|
+
* Memory scope for automatic resource cleanup
|
|
328
|
+
*
|
|
329
|
+
* Usage:
|
|
330
|
+
* ```typescript
|
|
331
|
+
* const result = await withMemoryScope(async (scope) => {
|
|
332
|
+
* const tensor1 = scope.track(createTensor(...));
|
|
333
|
+
* const tensor2 = scope.track(createTensor(...));
|
|
334
|
+
* // Process tensors
|
|
335
|
+
* return computeResult(tensor1, tensor2);
|
|
336
|
+
* });
|
|
337
|
+
* // tensor1 and tensor2 are automatically disposed
|
|
338
|
+
* ```
|
|
339
|
+
*/
|
|
340
|
+
export class MemoryScope {
|
|
341
|
+
resources = [];
|
|
342
|
+
children = [];
|
|
343
|
+
parent = null;
|
|
344
|
+
constructor(parent) {
|
|
345
|
+
if (parent) {
|
|
346
|
+
this.parent = parent;
|
|
347
|
+
parent.children.push(this);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Track a resource in this scope
|
|
352
|
+
*/
|
|
353
|
+
track(resource) {
|
|
354
|
+
this.resources.push(resource);
|
|
355
|
+
return resource;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Create a child scope
|
|
359
|
+
*/
|
|
360
|
+
createChild() {
|
|
361
|
+
return new MemoryScope(this);
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Keep a resource (don't dispose it when scope ends)
|
|
365
|
+
*/
|
|
366
|
+
keep(resource) {
|
|
367
|
+
const index = this.resources.indexOf(resource);
|
|
368
|
+
if (index !== -1) {
|
|
369
|
+
this.resources.splice(index, 1);
|
|
370
|
+
}
|
|
371
|
+
return resource;
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Dispose all resources in this scope
|
|
375
|
+
*/
|
|
376
|
+
dispose() {
|
|
377
|
+
// Dispose children first
|
|
378
|
+
for (const child of this.children) {
|
|
379
|
+
child.dispose();
|
|
380
|
+
}
|
|
381
|
+
this.children = [];
|
|
382
|
+
// Dispose resources in reverse order
|
|
383
|
+
for (let i = this.resources.length - 1; i >= 0; i--) {
|
|
384
|
+
try {
|
|
385
|
+
this.resources[i]?.dispose();
|
|
386
|
+
}
|
|
387
|
+
catch (error) {
|
|
388
|
+
console.error('Error disposing resource in scope:', error);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
this.resources = [];
|
|
392
|
+
// Remove from parent
|
|
393
|
+
if (this.parent) {
|
|
394
|
+
const index = this.parent.children.indexOf(this);
|
|
395
|
+
if (index !== -1) {
|
|
396
|
+
this.parent.children.splice(index, 1);
|
|
397
|
+
}
|
|
398
|
+
this.parent = null;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Execute a function with automatic memory cleanup
|
|
404
|
+
*/
|
|
405
|
+
export async function withMemoryScope(fn) {
|
|
406
|
+
const scope = new MemoryScope();
|
|
407
|
+
try {
|
|
408
|
+
return await fn(scope);
|
|
409
|
+
}
|
|
410
|
+
finally {
|
|
411
|
+
scope.dispose();
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Synchronous version of withMemoryScope
|
|
416
|
+
*/
|
|
417
|
+
export function withMemoryScopeSync(fn) {
|
|
418
|
+
const scope = new MemoryScope();
|
|
419
|
+
try {
|
|
420
|
+
return fn(scope);
|
|
421
|
+
}
|
|
422
|
+
finally {
|
|
423
|
+
scope.dispose();
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
// ============================================================================
|
|
427
|
+
// LRU Cache for Models
|
|
428
|
+
// ============================================================================
|
|
429
|
+
/**
|
|
430
|
+
* LRU Cache for loaded models
|
|
431
|
+
*/
|
|
432
|
+
export class ModelCache {
|
|
433
|
+
maxSize;
|
|
434
|
+
maxModels;
|
|
435
|
+
cache = new Map();
|
|
436
|
+
currentSize = 0;
|
|
437
|
+
constructor(options = {}) {
|
|
438
|
+
this.maxSize = options.maxSize ?? 256 * 1024 * 1024; // 256MB default
|
|
439
|
+
this.maxModels = options.maxModels ?? 5;
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Get a model from cache
|
|
443
|
+
*/
|
|
444
|
+
get(key) {
|
|
445
|
+
const entry = this.cache.get(key);
|
|
446
|
+
if (entry) {
|
|
447
|
+
entry.lastAccess = Date.now();
|
|
448
|
+
return entry.model;
|
|
449
|
+
}
|
|
450
|
+
return undefined;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Add a model to cache
|
|
454
|
+
*/
|
|
455
|
+
set(key, model) {
|
|
456
|
+
const size = model.metadata.sizeBytes;
|
|
457
|
+
// Check if we need to evict
|
|
458
|
+
while ((this.currentSize + size > this.maxSize || this.cache.size >= this.maxModels) &&
|
|
459
|
+
this.cache.size > 0) {
|
|
460
|
+
this.evictLRU();
|
|
461
|
+
}
|
|
462
|
+
// Add to cache
|
|
463
|
+
this.cache.set(key, {
|
|
464
|
+
model,
|
|
465
|
+
size,
|
|
466
|
+
lastAccess: Date.now(),
|
|
467
|
+
});
|
|
468
|
+
this.currentSize += size;
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Remove a model from cache
|
|
472
|
+
*/
|
|
473
|
+
delete(key) {
|
|
474
|
+
const entry = this.cache.get(key);
|
|
475
|
+
if (entry) {
|
|
476
|
+
entry.model.dispose();
|
|
477
|
+
this.currentSize -= entry.size;
|
|
478
|
+
this.cache.delete(key);
|
|
479
|
+
return true;
|
|
480
|
+
}
|
|
481
|
+
return false;
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Check if model is in cache
|
|
485
|
+
*/
|
|
486
|
+
has(key) {
|
|
487
|
+
return this.cache.has(key);
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
490
|
+
* Evict least recently used model
|
|
491
|
+
*/
|
|
492
|
+
evictLRU() {
|
|
493
|
+
let oldestKey = null;
|
|
494
|
+
let oldestTime = Infinity;
|
|
495
|
+
for (const [key, entry] of this.cache) {
|
|
496
|
+
if (entry.lastAccess < oldestTime) {
|
|
497
|
+
oldestTime = entry.lastAccess;
|
|
498
|
+
oldestKey = key;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
if (oldestKey) {
|
|
502
|
+
this.delete(oldestKey);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Clear the cache
|
|
507
|
+
*/
|
|
508
|
+
clear() {
|
|
509
|
+
for (const entry of this.cache.values()) {
|
|
510
|
+
entry.model.dispose();
|
|
511
|
+
}
|
|
512
|
+
this.cache.clear();
|
|
513
|
+
this.currentSize = 0;
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Get cache statistics
|
|
517
|
+
*/
|
|
518
|
+
getStats() {
|
|
519
|
+
return {
|
|
520
|
+
size: this.currentSize,
|
|
521
|
+
count: this.cache.size,
|
|
522
|
+
maxSize: this.maxSize,
|
|
523
|
+
maxModels: this.maxModels,
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
// ============================================================================
|
|
528
|
+
// Convenience Functions
|
|
529
|
+
// ============================================================================
|
|
530
|
+
/**
|
|
531
|
+
* Get memory manager instance
|
|
532
|
+
*/
|
|
533
|
+
export function getMemoryManager() {
|
|
534
|
+
return MemoryManager.getInstance();
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Get memory statistics
|
|
538
|
+
*/
|
|
539
|
+
export function getMemoryStats() {
|
|
540
|
+
return MemoryManager.getInstance().getStats();
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Release a resource
|
|
544
|
+
*/
|
|
545
|
+
export function release(resource) {
|
|
546
|
+
MemoryManager.getInstance().release(resource);
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Force garbage collection hint
|
|
550
|
+
*/
|
|
551
|
+
export function gc() {
|
|
552
|
+
MemoryManager.getInstance().gc();
|
|
553
|
+
}
|
|
554
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/core/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* edgeFlow.js - Runtime Management
|
|
3
|
+
*
|
|
4
|
+
* Manages runtime backends and automatic selection.
|
|
5
|
+
* Provides unified interface for different compute backends.
|
|
6
|
+
*/
|
|
7
|
+
import { Runtime, RuntimeType, RuntimeCapabilities, LoadedModel, ModelLoadOptions, ModelMetadata, Tensor, EventType, EventListener } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* RuntimeManager - Manages runtime selection and lifecycle
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - Automatic best runtime selection
|
|
13
|
+
* - Runtime registration
|
|
14
|
+
* - Capability detection
|
|
15
|
+
* - Fallback handling
|
|
16
|
+
*/
|
|
17
|
+
export declare class RuntimeManager {
|
|
18
|
+
private static instance;
|
|
19
|
+
private readonly listeners;
|
|
20
|
+
private defaultRuntime;
|
|
21
|
+
private constructor();
|
|
22
|
+
/**
|
|
23
|
+
* Get singleton instance
|
|
24
|
+
*/
|
|
25
|
+
static getInstance(): RuntimeManager;
|
|
26
|
+
/**
|
|
27
|
+
* Register a runtime factory
|
|
28
|
+
*/
|
|
29
|
+
register(type: RuntimeType, factory: () => Runtime): void;
|
|
30
|
+
/**
|
|
31
|
+
* Get a runtime instance
|
|
32
|
+
*/
|
|
33
|
+
getRuntime(type?: RuntimeType): Promise<Runtime>;
|
|
34
|
+
/**
|
|
35
|
+
* Get the best available runtime
|
|
36
|
+
*/
|
|
37
|
+
getBestRuntime(): Promise<Runtime>;
|
|
38
|
+
/**
|
|
39
|
+
* Check which runtimes are available
|
|
40
|
+
*/
|
|
41
|
+
detectAvailableRuntimes(): Promise<Map<RuntimeType, boolean>>;
|
|
42
|
+
/**
|
|
43
|
+
* Get capabilities of a runtime
|
|
44
|
+
*/
|
|
45
|
+
getCapabilities(type: RuntimeType): Promise<RuntimeCapabilities>;
|
|
46
|
+
/**
|
|
47
|
+
* Set default runtime
|
|
48
|
+
*/
|
|
49
|
+
setDefaultRuntime(type: RuntimeType): void;
|
|
50
|
+
/**
|
|
51
|
+
* Get default runtime type
|
|
52
|
+
*/
|
|
53
|
+
getDefaultRuntimeType(): RuntimeType;
|
|
54
|
+
/**
|
|
55
|
+
* Dispose a specific runtime
|
|
56
|
+
*/
|
|
57
|
+
disposeRuntime(type: RuntimeType): void;
|
|
58
|
+
/**
|
|
59
|
+
* Dispose all runtimes
|
|
60
|
+
*/
|
|
61
|
+
disposeAll(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Add event listener
|
|
64
|
+
*/
|
|
65
|
+
on<T = unknown>(event: EventType, listener: EventListener<T>): void;
|
|
66
|
+
/**
|
|
67
|
+
* Remove event listener
|
|
68
|
+
*/
|
|
69
|
+
off<T = unknown>(event: EventType, listener: EventListener<T>): void;
|
|
70
|
+
/**
|
|
71
|
+
* Emit event
|
|
72
|
+
*/
|
|
73
|
+
private emit;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* LoadedModelImpl - Implementation of LoadedModel interface
|
|
77
|
+
*/
|
|
78
|
+
export declare class LoadedModelImpl implements LoadedModel {
|
|
79
|
+
readonly id: string;
|
|
80
|
+
readonly metadata: ModelMetadata;
|
|
81
|
+
readonly runtime: RuntimeType;
|
|
82
|
+
private _isLoaded;
|
|
83
|
+
private readonly _dispose;
|
|
84
|
+
constructor(metadata: ModelMetadata, runtime: RuntimeType, dispose: () => void);
|
|
85
|
+
get isLoaded(): boolean;
|
|
86
|
+
dispose(): void;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Load model from URL with advanced loading support
|
|
90
|
+
* (caching, sharding, resume download)
|
|
91
|
+
*/
|
|
92
|
+
export declare function loadModel(url: string, options?: ModelLoadOptions & {
|
|
93
|
+
runtime?: RuntimeType;
|
|
94
|
+
cache?: boolean;
|
|
95
|
+
resumable?: boolean;
|
|
96
|
+
chunkSize?: number;
|
|
97
|
+
forceDownload?: boolean;
|
|
98
|
+
}): Promise<LoadedModel>;
|
|
99
|
+
/**
|
|
100
|
+
* Load model from ArrayBuffer
|
|
101
|
+
*/
|
|
102
|
+
export declare function loadModelFromBuffer(data: ArrayBuffer, options?: ModelLoadOptions & {
|
|
103
|
+
runtime?: RuntimeType;
|
|
104
|
+
}): Promise<LoadedModel>;
|
|
105
|
+
/**
|
|
106
|
+
* Run inference on a model
|
|
107
|
+
*/
|
|
108
|
+
export declare function runInference(model: LoadedModel, inputs: Tensor[]): Promise<Tensor[]>;
|
|
109
|
+
/**
|
|
110
|
+
* Run inference with batch processing
|
|
111
|
+
*/
|
|
112
|
+
export declare function runBatchInference(model: LoadedModel, batches: Tensor[][]): Promise<Tensor[][]>;
|
|
113
|
+
/**
|
|
114
|
+
* Get runtime manager instance
|
|
115
|
+
*/
|
|
116
|
+
export declare function getRuntimeManager(): RuntimeManager;
|
|
117
|
+
/**
|
|
118
|
+
* Register a runtime
|
|
119
|
+
*/
|
|
120
|
+
export declare function registerRuntime(type: RuntimeType, factory: () => Runtime): void;
|
|
121
|
+
/**
|
|
122
|
+
* Get the best available runtime
|
|
123
|
+
*/
|
|
124
|
+
export declare function getBestRuntime(): Promise<Runtime>;
|
|
125
|
+
/**
|
|
126
|
+
* Check available runtimes
|
|
127
|
+
*/
|
|
128
|
+
export declare function getAvailableRuntimes(): Promise<Map<RuntimeType, boolean>>;
|
|
129
|
+
//# sourceMappingURL=runtime.d.ts.map
|