edgeflowjs 0.1.0 → 0.2.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 +200 -66
- package/dist/backends/index.d.ts +9 -2
- package/dist/backends/index.d.ts.map +1 -1
- package/dist/backends/index.js +13 -13
- package/dist/backends/index.js.map +1 -1
- package/dist/backends/onnx.d.ts +11 -4
- package/dist/backends/onnx.d.ts.map +1 -1
- package/dist/backends/onnx.js +97 -78
- package/dist/backends/onnx.js.map +1 -1
- package/dist/backends/transformers-adapter.d.ts +99 -0
- package/dist/backends/transformers-adapter.d.ts.map +1 -0
- package/dist/backends/transformers-adapter.js +171 -0
- package/dist/backends/transformers-adapter.js.map +1 -0
- package/dist/backends/webgpu.d.ts +7 -5
- package/dist/backends/webgpu.d.ts.map +1 -1
- package/dist/backends/webgpu.js +7 -5
- package/dist/backends/webgpu.js.map +1 -1
- package/dist/backends/webnn.d.ts +6 -5
- package/dist/backends/webnn.d.ts.map +1 -1
- package/dist/backends/webnn.js +6 -5
- package/dist/backends/webnn.js.map +1 -1
- package/dist/core/composer.d.ts +118 -0
- package/dist/core/composer.d.ts.map +1 -0
- package/dist/core/composer.js +163 -0
- package/dist/core/composer.js.map +1 -0
- package/dist/core/device-profiler.d.ts +75 -0
- package/dist/core/device-profiler.d.ts.map +1 -0
- package/dist/core/device-profiler.js +131 -0
- package/dist/core/device-profiler.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/memory.d.ts +22 -2
- package/dist/core/memory.d.ts.map +1 -1
- package/dist/core/memory.js +49 -13
- package/dist/core/memory.js.map +1 -1
- package/dist/core/plugin.d.ts +100 -0
- package/dist/core/plugin.d.ts.map +1 -0
- package/dist/core/plugin.js +106 -0
- package/dist/core/plugin.js.map +1 -0
- package/dist/core/runtime.d.ts +4 -0
- package/dist/core/runtime.d.ts.map +1 -1
- package/dist/core/runtime.js +18 -0
- package/dist/core/runtime.js.map +1 -1
- package/dist/core/scheduler.d.ts +17 -0
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +101 -3
- package/dist/core/scheduler.js.map +1 -1
- package/dist/core/types.d.ts +14 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker.d.ts +202 -0
- package/dist/core/worker.d.ts.map +1 -0
- package/dist/core/worker.js +477 -0
- package/dist/core/worker.js.map +1 -0
- package/dist/edgeflow.browser.js +9770 -4383
- package/dist/edgeflow.browser.js.map +4 -4
- package/dist/edgeflow.browser.min.js +435 -5
- package/dist/edgeflow.browser.min.js.map +4 -4
- package/dist/index.d.ts +7 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -10
- package/dist/index.js.map +1 -1
- package/dist/pipelines/automatic-speech-recognition.d.ts +63 -0
- package/dist/pipelines/automatic-speech-recognition.d.ts.map +1 -0
- package/dist/pipelines/automatic-speech-recognition.js +269 -0
- package/dist/pipelines/automatic-speech-recognition.js.map +1 -0
- package/dist/pipelines/base.d.ts +6 -1
- package/dist/pipelines/base.d.ts.map +1 -1
- package/dist/pipelines/base.js +12 -2
- package/dist/pipelines/base.js.map +1 -1
- package/dist/pipelines/feature-extraction.d.ts +5 -40
- package/dist/pipelines/feature-extraction.d.ts.map +1 -1
- package/dist/pipelines/feature-extraction.js +44 -63
- package/dist/pipelines/feature-extraction.js.map +1 -1
- package/dist/pipelines/image-classification.d.ts +4 -36
- package/dist/pipelines/image-classification.d.ts.map +1 -1
- package/dist/pipelines/image-classification.js +22 -60
- package/dist/pipelines/image-classification.js.map +1 -1
- package/dist/pipelines/image-segmentation.d.ts +221 -0
- package/dist/pipelines/image-segmentation.d.ts.map +1 -0
- package/dist/pipelines/image-segmentation.js +535 -0
- package/dist/pipelines/image-segmentation.js.map +1 -0
- package/dist/pipelines/index.d.ts +18 -0
- package/dist/pipelines/index.d.ts.map +1 -1
- package/dist/pipelines/index.js +51 -2
- package/dist/pipelines/index.js.map +1 -1
- package/dist/pipelines/object-detection.d.ts +44 -0
- package/dist/pipelines/object-detection.d.ts.map +1 -0
- package/dist/pipelines/object-detection.js +218 -0
- package/dist/pipelines/object-detection.js.map +1 -0
- package/dist/pipelines/question-answering.d.ts +41 -0
- package/dist/pipelines/question-answering.d.ts.map +1 -0
- package/dist/pipelines/question-answering.js +164 -0
- package/dist/pipelines/question-answering.js.map +1 -0
- package/dist/pipelines/text-classification.d.ts +3 -39
- package/dist/pipelines/text-classification.d.ts.map +1 -1
- package/dist/pipelines/text-classification.js +29 -67
- package/dist/pipelines/text-classification.js.map +1 -1
- package/dist/pipelines/text-generation.d.ts +281 -0
- package/dist/pipelines/text-generation.d.ts.map +1 -0
- package/dist/pipelines/text-generation.js +766 -0
- package/dist/pipelines/text-generation.js.map +1 -0
- package/dist/pipelines/zero-shot-classification.d.ts +45 -0
- package/dist/pipelines/zero-shot-classification.d.ts.map +1 -0
- package/dist/pipelines/zero-shot-classification.js +140 -0
- package/dist/pipelines/zero-shot-classification.js.map +1 -0
- package/dist/tools/benchmark.d.ts +92 -0
- package/dist/tools/benchmark.d.ts.map +1 -0
- package/dist/tools/benchmark.js +213 -0
- package/dist/tools/benchmark.js.map +1 -0
- package/dist/tools/debugger.d.ts +258 -0
- package/dist/tools/debugger.d.ts.map +1 -0
- package/dist/tools/debugger.js +624 -0
- package/dist/tools/debugger.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +16 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/monitor.d.ts +284 -0
- package/dist/tools/monitor.d.ts.map +1 -0
- package/dist/tools/monitor.js +921 -0
- package/dist/tools/monitor.js.map +1 -0
- package/dist/tools/quantization.d.ts +235 -0
- package/dist/tools/quantization.d.ts.map +1 -0
- package/dist/tools/quantization.js +830 -0
- package/dist/tools/quantization.js.map +1 -0
- package/dist/utils/hub.d.ts +162 -0
- package/dist/utils/hub.d.ts.map +1 -0
- package/dist/utils/hub.js +311 -0
- package/dist/utils/hub.js.map +1 -0
- package/dist/utils/index.d.ts +3 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +5 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/model-loader.d.ts.map +1 -1
- package/dist/utils/model-loader.js +106 -30
- package/dist/utils/model-loader.js.map +1 -1
- package/dist/utils/offline.d.ts +147 -0
- package/dist/utils/offline.d.ts.map +1 -0
- package/dist/utils/offline.js +405 -0
- package/dist/utils/offline.js.map +1 -0
- package/dist/utils/preprocessor.d.ts +82 -6
- package/dist/utils/preprocessor.d.ts.map +1 -1
- package/dist/utils/preprocessor.js +278 -21
- package/dist/utils/preprocessor.js.map +1 -1
- package/dist/utils/tokenizer.d.ts +197 -72
- package/dist/utils/tokenizer.d.ts.map +1 -1
- package/dist/utils/tokenizer.js +558 -274
- package/dist/utils/tokenizer.js.map +1 -1
- package/package.json +26 -11
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* edgeFlow.js - Web Worker Support
|
|
3
|
+
*
|
|
4
|
+
* Run inference in a Web Worker to avoid blocking the main thread.
|
|
5
|
+
*/
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// Tensor Serialization
|
|
8
|
+
// ============================================================================
|
|
9
|
+
/**
|
|
10
|
+
* Serialize a tensor for transfer to worker
|
|
11
|
+
*/
|
|
12
|
+
export function serializeTensor(tensor) {
|
|
13
|
+
const data = tensor.toFloat32Array();
|
|
14
|
+
// Create a copy of the ArrayBuffer
|
|
15
|
+
const buffer = new ArrayBuffer(data.byteLength);
|
|
16
|
+
new Float32Array(buffer).set(data);
|
|
17
|
+
return {
|
|
18
|
+
data: buffer,
|
|
19
|
+
shape: [...tensor.shape],
|
|
20
|
+
dtype: tensor.dtype,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Deserialize a tensor from worker.
|
|
25
|
+
* Uses a lazy import to avoid circular dependency issues.
|
|
26
|
+
*/
|
|
27
|
+
export async function deserializeTensor(serialized) {
|
|
28
|
+
const { EdgeFlowTensor } = await import('./tensor.js');
|
|
29
|
+
const data = new Float32Array(serialized.data);
|
|
30
|
+
return new EdgeFlowTensor(data, serialized.shape, serialized.dtype);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Synchronous deserialisation used internally where async is not feasible.
|
|
34
|
+
* Requires EdgeFlowTensor to be passed in to avoid require().
|
|
35
|
+
*/
|
|
36
|
+
export function deserializeTensorSync(serialized, TensorClass) {
|
|
37
|
+
const data = new Float32Array(serialized.data);
|
|
38
|
+
return new TensorClass(data, serialized.shape, serialized.dtype);
|
|
39
|
+
}
|
|
40
|
+
const MAX_RESTART_ATTEMPTS = 3;
|
|
41
|
+
const RESTART_BASE_DELAY_MS = 1000;
|
|
42
|
+
/**
|
|
43
|
+
* InferenceWorker - Wrapper for a single Web Worker with auto-restart
|
|
44
|
+
*/
|
|
45
|
+
export class InferenceWorker {
|
|
46
|
+
worker = null;
|
|
47
|
+
pendingRequests = new Map();
|
|
48
|
+
isReady = false;
|
|
49
|
+
readyPromise;
|
|
50
|
+
readyResolve;
|
|
51
|
+
workerUrl;
|
|
52
|
+
_health = 'alive';
|
|
53
|
+
restartAttempts = 0;
|
|
54
|
+
constructor(workerUrl) {
|
|
55
|
+
this.workerUrl = workerUrl;
|
|
56
|
+
this.readyPromise = new Promise(resolve => {
|
|
57
|
+
this.readyResolve = resolve;
|
|
58
|
+
});
|
|
59
|
+
this.initWorker(workerUrl);
|
|
60
|
+
}
|
|
61
|
+
get health() {
|
|
62
|
+
return this._health;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Initialize the worker
|
|
66
|
+
*/
|
|
67
|
+
initWorker(workerUrl) {
|
|
68
|
+
const url = workerUrl ?? this.createWorkerBlob();
|
|
69
|
+
this.worker = new Worker(url, { type: 'module' });
|
|
70
|
+
this.worker.onmessage = (event) => {
|
|
71
|
+
this.handleMessage(event.data);
|
|
72
|
+
};
|
|
73
|
+
this.worker.onerror = (error) => {
|
|
74
|
+
console.error('Worker error:', error);
|
|
75
|
+
this.handleCrash();
|
|
76
|
+
};
|
|
77
|
+
this.worker.onmessageerror = () => {
|
|
78
|
+
this.handleCrash();
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Handle worker crash: reject pending, mark dead, attempt restart
|
|
83
|
+
*/
|
|
84
|
+
handleCrash() {
|
|
85
|
+
this._health = 'dead';
|
|
86
|
+
this.isReady = false;
|
|
87
|
+
const crashError = new Error('Worker crashed');
|
|
88
|
+
for (const [, { reject }] of this.pendingRequests) {
|
|
89
|
+
reject(crashError);
|
|
90
|
+
}
|
|
91
|
+
this.pendingRequests.clear();
|
|
92
|
+
this.attemptRestart();
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Restart the worker with exponential backoff
|
|
96
|
+
*/
|
|
97
|
+
attemptRestart() {
|
|
98
|
+
if (this.restartAttempts >= MAX_RESTART_ATTEMPTS) {
|
|
99
|
+
console.error(`Worker failed to restart after ${MAX_RESTART_ATTEMPTS} attempts`);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
this._health = 'restarting';
|
|
103
|
+
const delay = RESTART_BASE_DELAY_MS * Math.pow(2, this.restartAttempts);
|
|
104
|
+
this.restartAttempts++;
|
|
105
|
+
setTimeout(() => {
|
|
106
|
+
this.restart();
|
|
107
|
+
}, delay);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Restart: terminate old, create new
|
|
111
|
+
*/
|
|
112
|
+
restart() {
|
|
113
|
+
if (this.worker) {
|
|
114
|
+
try {
|
|
115
|
+
this.worker.terminate();
|
|
116
|
+
}
|
|
117
|
+
catch { /* already dead */ }
|
|
118
|
+
this.worker = null;
|
|
119
|
+
}
|
|
120
|
+
this.readyPromise = new Promise(resolve => {
|
|
121
|
+
this.readyResolve = resolve;
|
|
122
|
+
});
|
|
123
|
+
this.isReady = false;
|
|
124
|
+
try {
|
|
125
|
+
this.initWorker(this.workerUrl);
|
|
126
|
+
this._health = 'alive';
|
|
127
|
+
this.restartAttempts = 0;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
this._health = 'dead';
|
|
131
|
+
this.attemptRestart();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Create worker code as blob URL
|
|
136
|
+
*/
|
|
137
|
+
createWorkerBlob() {
|
|
138
|
+
const workerCode = `
|
|
139
|
+
// edgeFlow.js Worker
|
|
140
|
+
let models = new Map();
|
|
141
|
+
let ort = null;
|
|
142
|
+
|
|
143
|
+
// Load ONNX Runtime
|
|
144
|
+
async function loadOrt() {
|
|
145
|
+
if (ort) return ort;
|
|
146
|
+
ort = await import('https://cdn.jsdelivr.net/npm/onnxruntime-web@1.17.0/dist/esm/ort.min.js');
|
|
147
|
+
return ort;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Handle messages
|
|
151
|
+
self.onmessage = async (event) => {
|
|
152
|
+
const { id, type, payload } = event.data;
|
|
153
|
+
|
|
154
|
+
try {
|
|
155
|
+
switch (type) {
|
|
156
|
+
case 'init': {
|
|
157
|
+
await loadOrt();
|
|
158
|
+
self.postMessage({ id, type: 'ready' });
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
case 'load_model': {
|
|
163
|
+
await loadOrt();
|
|
164
|
+
const { url, options } = payload;
|
|
165
|
+
const response = await fetch(url);
|
|
166
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
167
|
+
const session = await ort.InferenceSession.create(
|
|
168
|
+
new Uint8Array(arrayBuffer),
|
|
169
|
+
{ executionProviders: ['wasm'] }
|
|
170
|
+
);
|
|
171
|
+
const modelId = 'model_' + Date.now();
|
|
172
|
+
models.set(modelId, session);
|
|
173
|
+
self.postMessage({
|
|
174
|
+
id,
|
|
175
|
+
type: 'result',
|
|
176
|
+
payload: { modelId }
|
|
177
|
+
});
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
case 'run_inference': {
|
|
182
|
+
const { modelId, inputs } = payload;
|
|
183
|
+
const session = models.get(modelId);
|
|
184
|
+
if (!session) {
|
|
185
|
+
throw new Error('Model not found: ' + modelId);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Prepare inputs
|
|
189
|
+
const feeds = {};
|
|
190
|
+
const inputNames = session.inputNames;
|
|
191
|
+
for (let i = 0; i < inputs.length && i < inputNames.length; i++) {
|
|
192
|
+
const input = inputs[i];
|
|
193
|
+
const data = new Float32Array(input.data);
|
|
194
|
+
feeds[inputNames[i]] = new ort.Tensor(input.dtype, data, input.shape);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Run inference
|
|
198
|
+
const results = await session.run(feeds);
|
|
199
|
+
|
|
200
|
+
// Serialize outputs
|
|
201
|
+
const outputs = [];
|
|
202
|
+
for (const name of session.outputNames) {
|
|
203
|
+
const tensor = results[name];
|
|
204
|
+
outputs.push({
|
|
205
|
+
data: tensor.data.buffer.slice(0),
|
|
206
|
+
shape: tensor.dims,
|
|
207
|
+
dtype: tensor.type
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
self.postMessage(
|
|
212
|
+
{ id, type: 'result', payload: { outputs } },
|
|
213
|
+
outputs.map(o => o.data)
|
|
214
|
+
);
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
case 'dispose': {
|
|
219
|
+
const { modelId } = payload;
|
|
220
|
+
const session = models.get(modelId);
|
|
221
|
+
if (session) {
|
|
222
|
+
// session.release(); // Not available in all versions
|
|
223
|
+
models.delete(modelId);
|
|
224
|
+
}
|
|
225
|
+
self.postMessage({ id, type: 'result', payload: { success: true } });
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
} catch (error) {
|
|
230
|
+
self.postMessage({
|
|
231
|
+
id,
|
|
232
|
+
type: 'error',
|
|
233
|
+
payload: { message: error.message }
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
`;
|
|
238
|
+
const blob = new Blob([workerCode], { type: 'application/javascript' });
|
|
239
|
+
return URL.createObjectURL(blob);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Handle worker message
|
|
243
|
+
*/
|
|
244
|
+
handleMessage(message) {
|
|
245
|
+
if (message.type === 'ready') {
|
|
246
|
+
this.isReady = true;
|
|
247
|
+
this.readyResolve();
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const request = this.pendingRequests.get(message.id);
|
|
251
|
+
if (!request)
|
|
252
|
+
return;
|
|
253
|
+
this.pendingRequests.delete(message.id);
|
|
254
|
+
if (message.type === 'error') {
|
|
255
|
+
const payload = message.payload;
|
|
256
|
+
request.reject(new Error(payload.message));
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
request.resolve(message.payload);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Send a request to the worker
|
|
264
|
+
*/
|
|
265
|
+
async sendRequest(type, payload) {
|
|
266
|
+
if (!this.worker) {
|
|
267
|
+
throw new Error('Worker not initialized');
|
|
268
|
+
}
|
|
269
|
+
const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
270
|
+
return new Promise((resolve, reject) => {
|
|
271
|
+
this.pendingRequests.set(id, { resolve: resolve, reject });
|
|
272
|
+
const message = { id, type, payload };
|
|
273
|
+
// Transfer ArrayBuffers for efficiency
|
|
274
|
+
const transfers = [];
|
|
275
|
+
if (payload && typeof payload === 'object' && 'inputs' in payload) {
|
|
276
|
+
const inputs = payload.inputs;
|
|
277
|
+
for (const input of inputs) {
|
|
278
|
+
if (input.data instanceof ArrayBuffer) {
|
|
279
|
+
transfers.push(input.data);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
this.worker.postMessage(message, transfers);
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Initialize the worker
|
|
288
|
+
*/
|
|
289
|
+
async init() {
|
|
290
|
+
if (this.isReady)
|
|
291
|
+
return;
|
|
292
|
+
await this.sendRequest('init');
|
|
293
|
+
await this.readyPromise;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Load a model
|
|
297
|
+
*/
|
|
298
|
+
async loadModel(url, options) {
|
|
299
|
+
await this.init();
|
|
300
|
+
const result = await this.sendRequest('load_model', { url, options });
|
|
301
|
+
return result.modelId;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Run inference
|
|
305
|
+
*/
|
|
306
|
+
async runInference(modelId, inputs) {
|
|
307
|
+
const serializedInputs = inputs.map(serializeTensor);
|
|
308
|
+
const result = await this.sendRequest('run_inference', { modelId, inputs: serializedInputs });
|
|
309
|
+
return Promise.all(result.outputs.map(deserializeTensor));
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Dispose a model
|
|
313
|
+
*/
|
|
314
|
+
async dispose(modelId) {
|
|
315
|
+
await this.sendRequest('dispose', { modelId });
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Terminate the worker
|
|
319
|
+
*/
|
|
320
|
+
terminate() {
|
|
321
|
+
if (this.worker) {
|
|
322
|
+
this.worker.terminate();
|
|
323
|
+
this.worker = null;
|
|
324
|
+
}
|
|
325
|
+
this.pendingRequests.clear();
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// ============================================================================
|
|
329
|
+
// Worker Pool
|
|
330
|
+
// ============================================================================
|
|
331
|
+
/**
|
|
332
|
+
* WorkerPool - Manage multiple workers for parallel inference.
|
|
333
|
+
* Automatically falls back to healthy workers when one is dead.
|
|
334
|
+
*/
|
|
335
|
+
export class WorkerPool {
|
|
336
|
+
workers = [];
|
|
337
|
+
currentIndex = 0;
|
|
338
|
+
modelAssignments = new Map();
|
|
339
|
+
poolOptions;
|
|
340
|
+
constructor(options = {}) {
|
|
341
|
+
this.poolOptions = options;
|
|
342
|
+
const numWorkers = options.numWorkers ??
|
|
343
|
+
(typeof navigator !== 'undefined' ? navigator.hardwareConcurrency : 4) ?? 4;
|
|
344
|
+
for (let i = 0; i < numWorkers; i++) {
|
|
345
|
+
this.workers.push(new InferenceWorker(options.workerUrl));
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Get next healthy worker (round-robin, skipping dead ones)
|
|
350
|
+
*/
|
|
351
|
+
getNextHealthyWorker() {
|
|
352
|
+
const len = this.workers.length;
|
|
353
|
+
for (let attempt = 0; attempt < len; attempt++) {
|
|
354
|
+
const worker = this.workers[this.currentIndex];
|
|
355
|
+
this.currentIndex = (this.currentIndex + 1) % len;
|
|
356
|
+
if (worker.health === 'alive')
|
|
357
|
+
return worker;
|
|
358
|
+
}
|
|
359
|
+
// All dead — try restarting first one and return it
|
|
360
|
+
const worker = this.workers[0];
|
|
361
|
+
if (worker.health === 'dead')
|
|
362
|
+
worker.restart();
|
|
363
|
+
return worker;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Get worker for a specific model, falling back to any healthy worker
|
|
367
|
+
*/
|
|
368
|
+
getWorkerForModel(modelId) {
|
|
369
|
+
const index = this.modelAssignments.get(modelId);
|
|
370
|
+
if (index !== undefined) {
|
|
371
|
+
const worker = this.workers[index];
|
|
372
|
+
if (worker.health === 'alive')
|
|
373
|
+
return worker;
|
|
374
|
+
// Assigned worker is dead — pick a healthy one and reassign
|
|
375
|
+
const replacement = this.getNextHealthyWorker();
|
|
376
|
+
this.modelAssignments.set(modelId, this.workers.indexOf(replacement));
|
|
377
|
+
return replacement;
|
|
378
|
+
}
|
|
379
|
+
return this.getNextHealthyWorker();
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Replace a worker at a given index with a fresh one
|
|
383
|
+
*/
|
|
384
|
+
replaceWorker(index) {
|
|
385
|
+
if (index < 0 || index >= this.workers.length)
|
|
386
|
+
return;
|
|
387
|
+
const old = this.workers[index];
|
|
388
|
+
old.terminate();
|
|
389
|
+
this.workers[index] = new InferenceWorker(this.poolOptions.workerUrl);
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Initialize all workers
|
|
393
|
+
*/
|
|
394
|
+
async init() {
|
|
395
|
+
await Promise.all(this.workers.map(w => w.init()));
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Load a model on a worker
|
|
399
|
+
*/
|
|
400
|
+
async loadModel(url, options) {
|
|
401
|
+
const worker = this.getNextHealthyWorker();
|
|
402
|
+
const modelId = await worker.loadModel(url, options);
|
|
403
|
+
this.modelAssignments.set(modelId, this.workers.indexOf(worker));
|
|
404
|
+
return modelId;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Run inference (auto-retries on a healthy worker if assigned one is dead)
|
|
408
|
+
*/
|
|
409
|
+
async runInference(modelId, inputs) {
|
|
410
|
+
const worker = this.getWorkerForModel(modelId);
|
|
411
|
+
return worker.runInference(modelId, inputs);
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Run inference on multiple inputs in parallel
|
|
415
|
+
*/
|
|
416
|
+
async runBatch(modelId, batchInputs) {
|
|
417
|
+
const results = await Promise.all(batchInputs.map((inputs, i) => {
|
|
418
|
+
const worker = this.workers[i % this.workers.length];
|
|
419
|
+
return worker.runInference(modelId, inputs);
|
|
420
|
+
}));
|
|
421
|
+
return results;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Dispose a model
|
|
425
|
+
*/
|
|
426
|
+
async dispose(modelId) {
|
|
427
|
+
const worker = this.getWorkerForModel(modelId);
|
|
428
|
+
await worker.dispose(modelId);
|
|
429
|
+
this.modelAssignments.delete(modelId);
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Terminate all workers
|
|
433
|
+
*/
|
|
434
|
+
terminate() {
|
|
435
|
+
for (const worker of this.workers) {
|
|
436
|
+
worker.terminate();
|
|
437
|
+
}
|
|
438
|
+
this.workers = [];
|
|
439
|
+
this.modelAssignments.clear();
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Get number of workers
|
|
443
|
+
*/
|
|
444
|
+
get size() {
|
|
445
|
+
return this.workers.length;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
// ============================================================================
|
|
449
|
+
// Global Instance
|
|
450
|
+
// ============================================================================
|
|
451
|
+
let globalWorkerPool = null;
|
|
452
|
+
/**
|
|
453
|
+
* Get or create global worker pool
|
|
454
|
+
*/
|
|
455
|
+
export function getWorkerPool(options) {
|
|
456
|
+
if (!globalWorkerPool) {
|
|
457
|
+
globalWorkerPool = new WorkerPool(options);
|
|
458
|
+
}
|
|
459
|
+
return globalWorkerPool;
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Run inference in a worker
|
|
463
|
+
*/
|
|
464
|
+
export async function runInWorker(modelUrl, inputs, options) {
|
|
465
|
+
const pool = getWorkerPool();
|
|
466
|
+
await pool.init();
|
|
467
|
+
const modelId = await pool.loadModel(modelUrl, options);
|
|
468
|
+
const outputs = await pool.runInference(modelId, inputs);
|
|
469
|
+
return outputs;
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Check if Web Workers are supported
|
|
473
|
+
*/
|
|
474
|
+
export function isWorkerSupported() {
|
|
475
|
+
return typeof Worker !== 'undefined';
|
|
476
|
+
}
|
|
477
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/core/worker.ts"],"names":[],"mappings":"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"}
|