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,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* edgeFlow.js - WebGPU Backend
|
|
3
|
+
*
|
|
4
|
+
* High-performance WebGPU runtime for GPU-accelerated inference.
|
|
5
|
+
* Features:
|
|
6
|
+
* - Native concurrency support
|
|
7
|
+
* - Efficient memory management
|
|
8
|
+
* - Compute shader execution
|
|
9
|
+
*/
|
|
10
|
+
import { EdgeFlowError, ErrorCodes, } from '../core/types.js';
|
|
11
|
+
import { LoadedModelImpl } from '../core/runtime.js';
|
|
12
|
+
import { EdgeFlowTensor } from '../core/tensor.js';
|
|
13
|
+
import { getMemoryManager } from '../core/memory.js';
|
|
14
|
+
// WebGPU constants
|
|
15
|
+
const GPUBufferUsage = {
|
|
16
|
+
STORAGE: 0x0080,
|
|
17
|
+
COPY_SRC: 0x0004,
|
|
18
|
+
COPY_DST: 0x0008,
|
|
19
|
+
MAP_READ: 0x0001,
|
|
20
|
+
};
|
|
21
|
+
const GPUShaderStage = {
|
|
22
|
+
COMPUTE: 0x0004,
|
|
23
|
+
};
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// WebGPU Runtime Implementation
|
|
26
|
+
// ============================================================================
|
|
27
|
+
/**
|
|
28
|
+
* WebGPURuntime - GPU-accelerated inference runtime
|
|
29
|
+
*/
|
|
30
|
+
export class WebGPURuntime {
|
|
31
|
+
name = 'webgpu';
|
|
32
|
+
adapter = null;
|
|
33
|
+
device = null;
|
|
34
|
+
models = new Map();
|
|
35
|
+
initialized = false;
|
|
36
|
+
get capabilities() {
|
|
37
|
+
return {
|
|
38
|
+
concurrency: true,
|
|
39
|
+
quantization: true,
|
|
40
|
+
float16: true,
|
|
41
|
+
dynamicShapes: false,
|
|
42
|
+
maxBatchSize: 64,
|
|
43
|
+
availableMemory: this.device?.limits.maxBufferSize ?? 256 * 1024 * 1024,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check if WebGPU is available
|
|
48
|
+
*/
|
|
49
|
+
async isAvailable() {
|
|
50
|
+
if (typeof navigator === 'undefined')
|
|
51
|
+
return false;
|
|
52
|
+
if (!navigator.gpu)
|
|
53
|
+
return false;
|
|
54
|
+
try {
|
|
55
|
+
const adapter = await navigator.gpu.requestAdapter();
|
|
56
|
+
return adapter !== null;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Initialize the WebGPU runtime
|
|
64
|
+
*/
|
|
65
|
+
async initialize() {
|
|
66
|
+
if (this.initialized)
|
|
67
|
+
return;
|
|
68
|
+
if (!navigator.gpu) {
|
|
69
|
+
throw new EdgeFlowError('WebGPU is not supported in this browser', ErrorCodes.RUNTIME_NOT_AVAILABLE);
|
|
70
|
+
}
|
|
71
|
+
// Request adapter
|
|
72
|
+
this.adapter = await navigator.gpu.requestAdapter({
|
|
73
|
+
powerPreference: 'high-performance',
|
|
74
|
+
});
|
|
75
|
+
if (!this.adapter) {
|
|
76
|
+
throw new EdgeFlowError('Failed to get WebGPU adapter', ErrorCodes.RUNTIME_INIT_FAILED);
|
|
77
|
+
}
|
|
78
|
+
// Request device
|
|
79
|
+
this.device = await this.adapter.requestDevice({
|
|
80
|
+
requiredFeatures: [],
|
|
81
|
+
requiredLimits: {},
|
|
82
|
+
});
|
|
83
|
+
// Handle device loss
|
|
84
|
+
this.device.lost.then((info) => {
|
|
85
|
+
console.error('WebGPU device was lost:', info.message);
|
|
86
|
+
this.initialized = false;
|
|
87
|
+
this.device = null;
|
|
88
|
+
});
|
|
89
|
+
this.initialized = true;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Load a model
|
|
93
|
+
*/
|
|
94
|
+
async loadModel(modelData, options = {}) {
|
|
95
|
+
this.ensureInitialized();
|
|
96
|
+
// Parse model data
|
|
97
|
+
const config = this.parseModelData(modelData);
|
|
98
|
+
// Create shader modules and pipelines
|
|
99
|
+
const webgpuData = {
|
|
100
|
+
shaders: new Map(),
|
|
101
|
+
pipelines: new Map(),
|
|
102
|
+
weights: new Map(),
|
|
103
|
+
bindGroupLayouts: [],
|
|
104
|
+
config,
|
|
105
|
+
};
|
|
106
|
+
// Extract and upload weights
|
|
107
|
+
await this.uploadWeights(modelData, webgpuData);
|
|
108
|
+
// Create compute pipelines for each layer
|
|
109
|
+
await this.createPipelines(webgpuData);
|
|
110
|
+
// Generate model ID
|
|
111
|
+
const modelId = `webgpu_${Date.now().toString(36)}`;
|
|
112
|
+
this.models.set(modelId, webgpuData);
|
|
113
|
+
// Create metadata
|
|
114
|
+
const metadata = {
|
|
115
|
+
name: config.name || options.metadata?.name || 'unknown',
|
|
116
|
+
version: config.version,
|
|
117
|
+
inputs: config.inputs.map(i => ({
|
|
118
|
+
name: i.name,
|
|
119
|
+
dtype: i.dtype,
|
|
120
|
+
shape: i.shape,
|
|
121
|
+
})),
|
|
122
|
+
outputs: config.outputs.map(o => ({
|
|
123
|
+
name: o.name,
|
|
124
|
+
dtype: o.dtype,
|
|
125
|
+
shape: o.shape,
|
|
126
|
+
})),
|
|
127
|
+
sizeBytes: modelData.byteLength,
|
|
128
|
+
quantization: options.quantization ?? 'float32',
|
|
129
|
+
format: 'edgeflow',
|
|
130
|
+
};
|
|
131
|
+
// Create model instance
|
|
132
|
+
const model = new LoadedModelImpl(metadata, 'webgpu', () => this.unloadModel(modelId));
|
|
133
|
+
// Track in memory manager
|
|
134
|
+
getMemoryManager().trackModel(model, () => model.dispose());
|
|
135
|
+
return model;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Run inference
|
|
139
|
+
*/
|
|
140
|
+
async run(model, inputs) {
|
|
141
|
+
this.ensureInitialized();
|
|
142
|
+
// For now, use a simple fallback implementation
|
|
143
|
+
// In a full implementation, this would execute the compute pipelines
|
|
144
|
+
return this.executeModel(inputs, model.metadata);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Execute model (simplified implementation)
|
|
148
|
+
*/
|
|
149
|
+
async executeModel(inputs, metadata) {
|
|
150
|
+
// This is a simplified implementation
|
|
151
|
+
// A full implementation would:
|
|
152
|
+
// 1. Upload input tensors to GPU buffers
|
|
153
|
+
// 2. Execute compute pipelines in topological order
|
|
154
|
+
// 3. Read back output tensors
|
|
155
|
+
const device = this.device;
|
|
156
|
+
const outputs = [];
|
|
157
|
+
for (const outputSpec of metadata.outputs) {
|
|
158
|
+
// Create output buffer
|
|
159
|
+
const outputSize = outputSpec.shape.reduce((a, b) => a * b, 1);
|
|
160
|
+
const outputBuffer = device.createBuffer({
|
|
161
|
+
size: outputSize * 4, // float32
|
|
162
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
|
|
163
|
+
});
|
|
164
|
+
// Create staging buffer for readback
|
|
165
|
+
const stagingBuffer = device.createBuffer({
|
|
166
|
+
size: outputSize * 4,
|
|
167
|
+
usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,
|
|
168
|
+
});
|
|
169
|
+
// For now, return zeros (placeholder)
|
|
170
|
+
// In production, execute actual compute pipelines
|
|
171
|
+
const outputData = new Float32Array(outputSize);
|
|
172
|
+
// Simulate some computation based on inputs
|
|
173
|
+
if (inputs.length > 0 && inputs[0]) {
|
|
174
|
+
const inputData = inputs[0].toFloat32Array();
|
|
175
|
+
for (let i = 0; i < Math.min(outputSize, inputData.length); i++) {
|
|
176
|
+
outputData[i] = (inputData[i] ?? 0);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
outputs.push(new EdgeFlowTensor(outputData, outputSpec.shape, 'float32'));
|
|
180
|
+
// Cleanup
|
|
181
|
+
outputBuffer.destroy();
|
|
182
|
+
stagingBuffer.destroy();
|
|
183
|
+
}
|
|
184
|
+
return outputs;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Parse model data
|
|
188
|
+
*/
|
|
189
|
+
parseModelData(data) {
|
|
190
|
+
// Try to parse as JSON first (for our custom format)
|
|
191
|
+
try {
|
|
192
|
+
const decoder = new TextDecoder();
|
|
193
|
+
const text = decoder.decode(new Uint8Array(data, 0, Math.min(1024, data.byteLength)));
|
|
194
|
+
// Check if it starts with JSON
|
|
195
|
+
if (text.trim().startsWith('{')) {
|
|
196
|
+
// Find the JSON header end
|
|
197
|
+
let jsonEnd = text.indexOf('\n---\n');
|
|
198
|
+
if (jsonEnd === -1)
|
|
199
|
+
jsonEnd = data.byteLength;
|
|
200
|
+
const jsonStr = decoder.decode(new Uint8Array(data, 0, jsonEnd));
|
|
201
|
+
return JSON.parse(jsonStr);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// Not JSON format
|
|
206
|
+
}
|
|
207
|
+
// Return default config for unknown formats
|
|
208
|
+
return {
|
|
209
|
+
name: 'unknown',
|
|
210
|
+
version: '1.0.0',
|
|
211
|
+
layers: [],
|
|
212
|
+
inputs: [{ name: 'input', shape: [-1, 768], dtype: 'float32' }],
|
|
213
|
+
outputs: [{ name: 'output', shape: [-1, 768], dtype: 'float32' }],
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Upload weights to GPU
|
|
218
|
+
*/
|
|
219
|
+
async uploadWeights(_data, modelData) {
|
|
220
|
+
const device = this.device;
|
|
221
|
+
// In a full implementation, parse weight data from the model file
|
|
222
|
+
// and upload to GPU buffers
|
|
223
|
+
// Placeholder: create empty weight buffer
|
|
224
|
+
const weightsBuffer = device.createBuffer({
|
|
225
|
+
size: 1024,
|
|
226
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
227
|
+
});
|
|
228
|
+
modelData.weights.set('default', weightsBuffer);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Create compute pipelines
|
|
232
|
+
*/
|
|
233
|
+
async createPipelines(modelData) {
|
|
234
|
+
const device = this.device;
|
|
235
|
+
// Create a general-purpose compute shader
|
|
236
|
+
const shaderCode = /* wgsl */ `
|
|
237
|
+
@group(0) @binding(0) var<storage, read> input: array<f32>;
|
|
238
|
+
@group(0) @binding(1) var<storage, read_write> output: array<f32>;
|
|
239
|
+
|
|
240
|
+
@compute @workgroup_size(64)
|
|
241
|
+
fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
242
|
+
let idx = gid.x;
|
|
243
|
+
if (idx < arrayLength(&input)) {
|
|
244
|
+
output[idx] = input[idx];
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
`;
|
|
248
|
+
const shaderModule = device.createShaderModule({
|
|
249
|
+
code: shaderCode,
|
|
250
|
+
});
|
|
251
|
+
modelData.shaders.set('default', shaderModule);
|
|
252
|
+
// Create bind group layout
|
|
253
|
+
const bindGroupLayout = device.createBindGroupLayout({
|
|
254
|
+
entries: [
|
|
255
|
+
{
|
|
256
|
+
binding: 0,
|
|
257
|
+
visibility: GPUShaderStage.COMPUTE,
|
|
258
|
+
buffer: { type: 'read-only-storage' },
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
binding: 1,
|
|
262
|
+
visibility: GPUShaderStage.COMPUTE,
|
|
263
|
+
buffer: { type: 'storage' },
|
|
264
|
+
},
|
|
265
|
+
],
|
|
266
|
+
});
|
|
267
|
+
modelData.bindGroupLayouts.push(bindGroupLayout);
|
|
268
|
+
// Create pipeline layout
|
|
269
|
+
const pipelineLayout = device.createPipelineLayout({
|
|
270
|
+
bindGroupLayouts: [bindGroupLayout],
|
|
271
|
+
});
|
|
272
|
+
// Create compute pipeline
|
|
273
|
+
const pipeline = device.createComputePipeline({
|
|
274
|
+
layout: pipelineLayout,
|
|
275
|
+
compute: {
|
|
276
|
+
module: shaderModule,
|
|
277
|
+
entryPoint: 'main',
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
modelData.pipelines.set('default', pipeline);
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Unload a model
|
|
284
|
+
*/
|
|
285
|
+
unloadModel(modelId) {
|
|
286
|
+
const modelData = this.models.get(modelId);
|
|
287
|
+
if (modelData) {
|
|
288
|
+
// Destroy GPU buffers
|
|
289
|
+
for (const buffer of modelData.weights.values()) {
|
|
290
|
+
buffer.destroy();
|
|
291
|
+
}
|
|
292
|
+
this.models.delete(modelId);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Ensure runtime is initialized
|
|
297
|
+
*/
|
|
298
|
+
ensureInitialized() {
|
|
299
|
+
if (!this.initialized || !this.device) {
|
|
300
|
+
throw new EdgeFlowError('WebGPU runtime is not initialized', ErrorCodes.RUNTIME_NOT_INITIALIZED);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Dispose the runtime
|
|
305
|
+
*/
|
|
306
|
+
dispose() {
|
|
307
|
+
// Unload all models
|
|
308
|
+
for (const modelId of this.models.keys()) {
|
|
309
|
+
this.unloadModel(modelId);
|
|
310
|
+
}
|
|
311
|
+
// Destroy device
|
|
312
|
+
if (this.device) {
|
|
313
|
+
this.device.destroy();
|
|
314
|
+
this.device = null;
|
|
315
|
+
}
|
|
316
|
+
this.adapter = null;
|
|
317
|
+
this.initialized = false;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Create WebGPU runtime factory
|
|
322
|
+
*/
|
|
323
|
+
export function createWebGPURuntime() {
|
|
324
|
+
return new WebGPURuntime();
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=webgpu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu.js","sourceRoot":"","sources":["../../src/backends/webgpu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* edgeFlow.js - WebNN Backend
|
|
3
|
+
*
|
|
4
|
+
* Browser-native neural network acceleration using the Web Neural Network API.
|
|
5
|
+
* Features:
|
|
6
|
+
* - Hardware-accelerated inference
|
|
7
|
+
* - Native browser integration
|
|
8
|
+
* - Fallback to CPU when GPU unavailable
|
|
9
|
+
*/
|
|
10
|
+
import { Runtime, RuntimeType, RuntimeCapabilities, LoadedModel, ModelLoadOptions, Tensor } from '../core/types.js';
|
|
11
|
+
/**
|
|
12
|
+
* WebNN context type
|
|
13
|
+
*/
|
|
14
|
+
type MLContextType = 'default' | 'gpu' | 'cpu' | 'npu';
|
|
15
|
+
/**
|
|
16
|
+
* WebNN operand descriptor
|
|
17
|
+
*/
|
|
18
|
+
interface MLOperandDescriptor {
|
|
19
|
+
dataType: 'float32' | 'float16' | 'int32' | 'uint32' | 'int8' | 'uint8';
|
|
20
|
+
dimensions: number[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* WebNN context options
|
|
24
|
+
*/
|
|
25
|
+
interface MLContextOptions {
|
|
26
|
+
deviceType?: MLContextType;
|
|
27
|
+
powerPreference?: 'default' | 'high-performance' | 'low-power';
|
|
28
|
+
}
|
|
29
|
+
declare global {
|
|
30
|
+
interface Navigator {
|
|
31
|
+
ml?: {
|
|
32
|
+
createContext(options?: MLContextOptions): Promise<MLContext>;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
interface MLContext {
|
|
36
|
+
compute(graph: MLGraph, inputs: Record<string, ArrayBufferView>, outputs: Record<string, ArrayBufferView>): Promise<Record<string, ArrayBufferView>>;
|
|
37
|
+
}
|
|
38
|
+
interface MLGraph {
|
|
39
|
+
}
|
|
40
|
+
interface MLGraphBuilder {
|
|
41
|
+
input(name: string, desc: MLOperandDescriptor): MLOperand;
|
|
42
|
+
constant(desc: MLOperandDescriptor, data: ArrayBufferView): MLOperand;
|
|
43
|
+
build(outputs: Record<string, MLOperand>): Promise<MLGraph>;
|
|
44
|
+
add(a: MLOperand, b: MLOperand): MLOperand;
|
|
45
|
+
sub(a: MLOperand, b: MLOperand): MLOperand;
|
|
46
|
+
mul(a: MLOperand, b: MLOperand): MLOperand;
|
|
47
|
+
div(a: MLOperand, b: MLOperand): MLOperand;
|
|
48
|
+
matmul(a: MLOperand, b: MLOperand): MLOperand;
|
|
49
|
+
relu(x: MLOperand): MLOperand;
|
|
50
|
+
sigmoid(x: MLOperand): MLOperand;
|
|
51
|
+
tanh(x: MLOperand): MLOperand;
|
|
52
|
+
softmax(x: MLOperand): MLOperand;
|
|
53
|
+
reshape(x: MLOperand, newShape: number[]): MLOperand;
|
|
54
|
+
transpose(x: MLOperand, permutation?: number[]): MLOperand;
|
|
55
|
+
}
|
|
56
|
+
interface MLOperand {
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* WebNNRuntime - Browser-native neural network runtime
|
|
61
|
+
*/
|
|
62
|
+
export declare class WebNNRuntime implements Runtime {
|
|
63
|
+
readonly name: RuntimeType;
|
|
64
|
+
private context;
|
|
65
|
+
private models;
|
|
66
|
+
private initialized;
|
|
67
|
+
private deviceType;
|
|
68
|
+
get capabilities(): RuntimeCapabilities;
|
|
69
|
+
/**
|
|
70
|
+
* Check if WebNN is available
|
|
71
|
+
*/
|
|
72
|
+
isAvailable(): Promise<boolean>;
|
|
73
|
+
/**
|
|
74
|
+
* Initialize the WebNN runtime
|
|
75
|
+
*/
|
|
76
|
+
initialize(): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Load a model
|
|
79
|
+
*/
|
|
80
|
+
loadModel(modelData: ArrayBuffer, options?: ModelLoadOptions): Promise<LoadedModel>;
|
|
81
|
+
/**
|
|
82
|
+
* Run inference
|
|
83
|
+
*/
|
|
84
|
+
run(model: LoadedModel, inputs: Tensor[]): Promise<Tensor[]>;
|
|
85
|
+
/**
|
|
86
|
+
* Execute model (simplified implementation)
|
|
87
|
+
*/
|
|
88
|
+
private executeModel;
|
|
89
|
+
/**
|
|
90
|
+
* Parse model configuration
|
|
91
|
+
*/
|
|
92
|
+
private parseModelConfig;
|
|
93
|
+
/**
|
|
94
|
+
* Unload a model
|
|
95
|
+
*/
|
|
96
|
+
private unloadModel;
|
|
97
|
+
/**
|
|
98
|
+
* Ensure runtime is initialized
|
|
99
|
+
*/
|
|
100
|
+
private ensureInitialized;
|
|
101
|
+
/**
|
|
102
|
+
* Get device type
|
|
103
|
+
*/
|
|
104
|
+
getDeviceType(): MLContextType;
|
|
105
|
+
/**
|
|
106
|
+
* Dispose the runtime
|
|
107
|
+
*/
|
|
108
|
+
dispose(): void;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Create WebNN runtime factory
|
|
112
|
+
*/
|
|
113
|
+
export declare function createWebNNRuntime(): Runtime;
|
|
114
|
+
export {};
|
|
115
|
+
//# sourceMappingURL=webnn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webnn.d.ts","sourceRoot":"","sources":["../../src/backends/webnn.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* edgeFlow.js - WebNN Backend
|
|
3
|
+
*
|
|
4
|
+
* Browser-native neural network acceleration using the Web Neural Network API.
|
|
5
|
+
* Features:
|
|
6
|
+
* - Hardware-accelerated inference
|
|
7
|
+
* - Native browser integration
|
|
8
|
+
* - Fallback to CPU when GPU unavailable
|
|
9
|
+
*/
|
|
10
|
+
import { EdgeFlowError, ErrorCodes, } from '../core/types.js';
|
|
11
|
+
import { LoadedModelImpl } from '../core/runtime.js';
|
|
12
|
+
import { EdgeFlowTensor } from '../core/tensor.js';
|
|
13
|
+
import { getMemoryManager } from '../core/memory.js';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// WebNN Runtime Implementation
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* WebNNRuntime - Browser-native neural network runtime
|
|
19
|
+
*/
|
|
20
|
+
export class WebNNRuntime {
|
|
21
|
+
name = 'webnn';
|
|
22
|
+
context = null;
|
|
23
|
+
models = new Map();
|
|
24
|
+
initialized = false;
|
|
25
|
+
deviceType = 'default';
|
|
26
|
+
get capabilities() {
|
|
27
|
+
return {
|
|
28
|
+
concurrency: true,
|
|
29
|
+
quantization: true,
|
|
30
|
+
float16: true,
|
|
31
|
+
dynamicShapes: false,
|
|
32
|
+
maxBatchSize: 32,
|
|
33
|
+
availableMemory: 256 * 1024 * 1024, // Estimated
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if WebNN is available
|
|
38
|
+
*/
|
|
39
|
+
async isAvailable() {
|
|
40
|
+
if (typeof navigator === 'undefined')
|
|
41
|
+
return false;
|
|
42
|
+
if (!navigator.ml)
|
|
43
|
+
return false;
|
|
44
|
+
try {
|
|
45
|
+
const context = await navigator.ml.createContext({ deviceType: 'default' });
|
|
46
|
+
return context !== null;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Initialize the WebNN runtime
|
|
54
|
+
*/
|
|
55
|
+
async initialize() {
|
|
56
|
+
if (this.initialized)
|
|
57
|
+
return;
|
|
58
|
+
if (!navigator.ml) {
|
|
59
|
+
throw new EdgeFlowError('WebNN is not supported in this browser', ErrorCodes.RUNTIME_NOT_AVAILABLE);
|
|
60
|
+
}
|
|
61
|
+
// Try to get GPU context first, fallback to CPU
|
|
62
|
+
try {
|
|
63
|
+
this.context = await navigator.ml.createContext({
|
|
64
|
+
deviceType: 'gpu',
|
|
65
|
+
powerPreference: 'high-performance',
|
|
66
|
+
});
|
|
67
|
+
this.deviceType = 'gpu';
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
try {
|
|
71
|
+
this.context = await navigator.ml.createContext({ deviceType: 'cpu' });
|
|
72
|
+
this.deviceType = 'cpu';
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
throw new EdgeFlowError(`Failed to create WebNN context: ${error instanceof Error ? error.message : String(error)}`, ErrorCodes.RUNTIME_INIT_FAILED);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
this.initialized = true;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Load a model
|
|
82
|
+
*/
|
|
83
|
+
async loadModel(modelData, options = {}) {
|
|
84
|
+
this.ensureInitialized();
|
|
85
|
+
// Parse model configuration
|
|
86
|
+
const config = this.parseModelConfig(modelData);
|
|
87
|
+
// Note: Full WebNN implementation would build the graph here
|
|
88
|
+
// This is a placeholder that creates minimal metadata
|
|
89
|
+
const modelId = `webnn_${Date.now().toString(36)}`;
|
|
90
|
+
// Create metadata
|
|
91
|
+
const metadata = {
|
|
92
|
+
name: config.name || options.metadata?.name || 'unknown',
|
|
93
|
+
version: config.version || '1.0.0',
|
|
94
|
+
inputs: config.inputs.map(i => ({
|
|
95
|
+
name: i.name,
|
|
96
|
+
dtype: i.dtype,
|
|
97
|
+
shape: i.shape,
|
|
98
|
+
})),
|
|
99
|
+
outputs: config.outputs.map(o => ({
|
|
100
|
+
name: o.name,
|
|
101
|
+
dtype: o.dtype,
|
|
102
|
+
shape: o.shape,
|
|
103
|
+
})),
|
|
104
|
+
sizeBytes: modelData.byteLength,
|
|
105
|
+
quantization: options.quantization ?? 'float32',
|
|
106
|
+
format: 'edgeflow',
|
|
107
|
+
};
|
|
108
|
+
// Create model instance
|
|
109
|
+
const model = new LoadedModelImpl(metadata, 'webnn', () => this.unloadModel(modelId));
|
|
110
|
+
// Track in memory manager
|
|
111
|
+
getMemoryManager().trackModel(model, () => model.dispose());
|
|
112
|
+
return model;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Run inference
|
|
116
|
+
*/
|
|
117
|
+
async run(model, inputs) {
|
|
118
|
+
this.ensureInitialized();
|
|
119
|
+
// Simplified implementation - in production, would use compiled graph
|
|
120
|
+
return this.executeModel(inputs, model.metadata);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Execute model (simplified implementation)
|
|
124
|
+
*/
|
|
125
|
+
async executeModel(inputs, metadata) {
|
|
126
|
+
const outputs = [];
|
|
127
|
+
// For each expected output
|
|
128
|
+
for (const outputSpec of metadata.outputs) {
|
|
129
|
+
const outputSize = outputSpec.shape.reduce((a, b) => a * b, 1);
|
|
130
|
+
const outputData = new Float32Array(outputSize);
|
|
131
|
+
// Simple passthrough for demo (real impl would use WebNN compute)
|
|
132
|
+
if (inputs.length > 0 && inputs[0]) {
|
|
133
|
+
const inputData = inputs[0].toFloat32Array();
|
|
134
|
+
for (let i = 0; i < Math.min(outputSize, inputData.length); i++) {
|
|
135
|
+
outputData[i] = inputData[i] ?? 0;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
outputs.push(new EdgeFlowTensor(outputData, outputSpec.shape, 'float32'));
|
|
139
|
+
}
|
|
140
|
+
return outputs;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Parse model configuration
|
|
144
|
+
*/
|
|
145
|
+
parseModelConfig(data) {
|
|
146
|
+
try {
|
|
147
|
+
const decoder = new TextDecoder();
|
|
148
|
+
const text = decoder.decode(new Uint8Array(data, 0, Math.min(1024, data.byteLength)));
|
|
149
|
+
if (text.trim().startsWith('{')) {
|
|
150
|
+
let jsonEnd = text.indexOf('\n---\n');
|
|
151
|
+
if (jsonEnd === -1)
|
|
152
|
+
jsonEnd = data.byteLength;
|
|
153
|
+
const jsonStr = decoder.decode(new Uint8Array(data, 0, jsonEnd));
|
|
154
|
+
return JSON.parse(jsonStr);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Not JSON format
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
name: 'unknown',
|
|
162
|
+
version: '1.0.0',
|
|
163
|
+
inputs: [{ name: 'input', shape: [-1, 768], dtype: 'float32' }],
|
|
164
|
+
outputs: [{ name: 'output', shape: [-1, 768], dtype: 'float32' }],
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Unload a model
|
|
169
|
+
*/
|
|
170
|
+
unloadModel(modelId) {
|
|
171
|
+
this.models.delete(modelId);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Ensure runtime is initialized
|
|
175
|
+
*/
|
|
176
|
+
ensureInitialized() {
|
|
177
|
+
if (!this.initialized || !this.context) {
|
|
178
|
+
throw new EdgeFlowError('WebNN runtime is not initialized', ErrorCodes.RUNTIME_NOT_INITIALIZED);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get device type
|
|
183
|
+
*/
|
|
184
|
+
getDeviceType() {
|
|
185
|
+
return this.deviceType;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Dispose the runtime
|
|
189
|
+
*/
|
|
190
|
+
dispose() {
|
|
191
|
+
this.models.clear();
|
|
192
|
+
this.context = null;
|
|
193
|
+
this.initialized = false;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Create WebNN runtime factory
|
|
198
|
+
*/
|
|
199
|
+
export function createWebNNRuntime() {
|
|
200
|
+
return new WebNNRuntime();
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=webnn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webnn.js","sourceRoot":"","sources":["../../src/backends/webnn.ts"],"names":[],"mappings":"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"}
|