oidn-web 0.3.5 → 0.5.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.
Files changed (65) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/README.md +208 -8
  3. package/dist/oidn.js +4699 -22516
  4. package/dist/oidn.umd.cjs +989 -5796
  5. package/lib/UNet.d.ts +111 -26
  6. package/lib/UNet.js +310 -329
  7. package/lib/UNet.js.map +1 -1
  8. package/lib/WGPUComputePass.d.ts +1 -1
  9. package/lib/WGPUComputePass.js +6 -4
  10. package/lib/WGPUComputePass.js.map +1 -1
  11. package/lib/backend.d.ts +1 -4
  12. package/lib/backend.js +28 -44
  13. package/lib/backend.js.map +1 -1
  14. package/lib/finalRgbShader.d.ts +13 -0
  15. package/lib/finalRgbShader.js +160 -0
  16. package/lib/finalRgbShader.js.map +1 -0
  17. package/lib/graphOptimizer.d.ts +54 -0
  18. package/lib/graphOptimizer.js +215 -0
  19. package/lib/graphOptimizer.js.map +1 -0
  20. package/lib/hdrTransfer.d.ts +14 -0
  21. package/lib/hdrTransfer.js +61 -0
  22. package/lib/hdrTransfer.js.map +1 -0
  23. package/lib/main.d.ts +43 -11
  24. package/lib/main.js +9 -5
  25. package/lib/main.js.map +1 -1
  26. package/lib/modelSpec.d.ts +80 -0
  27. package/lib/modelSpec.js +270 -0
  28. package/lib/modelSpec.js.map +1 -0
  29. package/lib/nativeUNet.d.ts +103 -0
  30. package/lib/nativeUNet.js +2064 -0
  31. package/lib/nativeUNet.js.map +1 -0
  32. package/lib/process.d.ts +5 -11
  33. package/lib/process.js +38 -49
  34. package/lib/process.js.map +1 -1
  35. package/lib/resourceTracker.d.ts +26 -0
  36. package/lib/resourceTracker.js +65 -0
  37. package/lib/resourceTracker.js.map +1 -0
  38. package/lib/tileScheduler.d.ts +61 -0
  39. package/lib/tileScheduler.js +199 -0
  40. package/lib/tileScheduler.js.map +1 -0
  41. package/lib/webnnUNet.d.ts +52 -0
  42. package/lib/webnnUNet.js +535 -0
  43. package/lib/webnnUNet.js.map +1 -0
  44. package/package.json +16 -5
  45. package/src/UNet.ts +463 -437
  46. package/src/WGPUComputePass.ts +6 -4
  47. package/src/backend.ts +33 -59
  48. package/src/finalRgbShader.ts +186 -0
  49. package/src/graphOptimizer.ts +300 -0
  50. package/src/hdrTransfer.ts +88 -0
  51. package/src/main.ts +95 -20
  52. package/src/modelSpec.ts +414 -0
  53. package/src/nativeUNet.ts +2655 -0
  54. package/src/process.ts +46 -71
  55. package/src/resourceTracker.ts +94 -0
  56. package/src/tileScheduler.ts +330 -0
  57. package/src/webnnUNet.ts +812 -0
  58. package/lib/helper.d.ts +0 -4
  59. package/lib/helper.js +0 -33
  60. package/lib/helper.js.map +0 -1
  61. package/lib/kernels.d.ts +0 -1
  62. package/lib/kernels.js +0 -26
  63. package/lib/kernels.js.map +0 -1
  64. package/src/helper.ts +0 -43
  65. package/src/kernels.ts +0 -31
@@ -0,0 +1,535 @@
1
+ import { Float16Array } from '@petamoriken/float16';
2
+ import { OIDNResourceTracker } from './resourceTracker.js';
3
+ const interopPipelinesByDevice = new WeakMap();
4
+ function interopPipelines(device, sourceCount) {
5
+ let bySourceCount = interopPipelinesByDevice.get(device);
6
+ if (!bySourceCount) {
7
+ bySourceCount = new Map();
8
+ interopPipelinesByDevice.set(device, bySourceCount);
9
+ }
10
+ let pipelines = bySourceCount.get(sourceCount);
11
+ if (!pipelines) {
12
+ const inputModule = device.createShaderModule({
13
+ label: `oidn/webnn/input-pack/${sourceCount}`,
14
+ code: createInputPackShader(sourceCount)
15
+ });
16
+ const outputModule = device.createShaderModule({
17
+ label: 'oidn/webnn/output-unpack',
18
+ code: createOutputUnpackShader()
19
+ });
20
+ pipelines = {
21
+ input: device.createComputePipeline({
22
+ label: `oidn/webnn/input-pack/${sourceCount}`,
23
+ layout: 'auto',
24
+ compute: { module: inputModule, entryPoint: 'main' }
25
+ }),
26
+ output: device.createComputePipeline({
27
+ label: 'oidn/webnn/output-unpack',
28
+ layout: 'auto',
29
+ compute: { module: outputModule, entryPoint: 'main' }
30
+ })
31
+ };
32
+ bySourceCount.set(sourceCount, pipelines);
33
+ }
34
+ return pipelines;
35
+ }
36
+ const WORKGROUP_SIZE = 8;
37
+ function roundUp(value, alignment) {
38
+ return Math.ceil(value / alignment) * alignment;
39
+ }
40
+ function createMappedBuffer(device, label, data, usage) {
41
+ const buffer = device.createBuffer({
42
+ label,
43
+ size: roundUp(data.byteLength, 4),
44
+ usage,
45
+ mappedAtCreation: true
46
+ });
47
+ new Uint8Array(buffer.getMappedRange()).set(new Uint8Array(data.buffer, data.byteOffset, data.byteLength));
48
+ buffer.unmap();
49
+ return buffer;
50
+ }
51
+ function uniformBuffer(device, label, values) {
52
+ const data = new Uint32Array(roundUp(values.length, 4));
53
+ data.set(values);
54
+ return createMappedBuffer(device, label, data, GPUBufferUsage.UNIFORM);
55
+ }
56
+ function hasDataType(limits, op, operand, dataType) {
57
+ return Boolean(limits?.[op]?.[operand]?.dataTypes?.includes?.(dataType));
58
+ }
59
+ function tensorBytes(tensor, precision) {
60
+ if (precision === 'fp16' &&
61
+ tensor.desc.dataType === 'Float16') {
62
+ return new Uint8Array(tensor.data.buffer, tensor.data.byteOffset, tensor.data.byteLength);
63
+ }
64
+ if (precision === 'fp32' &&
65
+ tensor.desc.dataType === 'Float32') {
66
+ return new Uint8Array(tensor.data.buffer, tensor.data.byteOffset, tensor.data.byteLength);
67
+ }
68
+ const source = tensor.desc.dataType === 'Float32'
69
+ ? new Float32Array(tensor.data.buffer, tensor.data.byteOffset, tensor.data.byteLength / 4)
70
+ : new Float16Array(tensor.data.buffer, tensor.data.byteOffset, tensor.data.byteLength / 2);
71
+ const converted = precision === 'fp16'
72
+ ? new Float16Array(source)
73
+ : new Float32Array(source);
74
+ return new Uint8Array(converted.buffer, converted.byteOffset, converted.byteLength);
75
+ }
76
+ function createInputPackShader(sourceCount) {
77
+ const sources = Array.from({ length: sourceCount }, (_, index) => `@group(0) @binding(${index}) var<storage, read> input${index}: array<vec4<f32>>;`).join('\n');
78
+ const branches = Array.from({ length: sourceCount }, (_, index) => {
79
+ const firstChannel = index * 3;
80
+ return `if (channel < ${firstChannel + 3}u) {
81
+ return input${index}[pixel][channel - ${firstChannel}u];
82
+ }`;
83
+ }).join('\n ');
84
+ return /* wgsl */ `enable f16;
85
+ struct Params { width: u32, height: u32, channels: u32, padding: u32 }
86
+ ${sources}
87
+ @group(0) @binding(${sourceCount}) var<storage, read_write> outputData: array<f16>;
88
+ @group(0) @binding(${sourceCount + 1}) var<uniform> params: Params;
89
+
90
+ fn readChannel(pixel: u32, channel: u32) -> f32 {
91
+ ${branches}
92
+ return 0.0;
93
+ }
94
+
95
+ @compute @workgroup_size(${WORKGROUP_SIZE}, ${WORKGROUP_SIZE}, 1)
96
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
97
+ if (gid.x >= params.width || gid.y >= params.height || gid.z >= params.channels) {
98
+ return;
99
+ }
100
+ let pixel = gid.y * params.width + gid.x;
101
+ let outputIndex = (gid.z * params.height + gid.y) * params.width + gid.x;
102
+ outputData[outputIndex] = f16(readChannel(pixel, gid.z));
103
+ }
104
+ `;
105
+ }
106
+ function createOutputUnpackShader() {
107
+ return /* wgsl */ `enable f16;
108
+ struct Params { width: u32, height: u32, padding0: u32, padding1: u32 }
109
+ @group(0) @binding(0) var<storage, read> inputData: array<f16>;
110
+ @group(0) @binding(1) var<storage, read_write> outputData: array<vec4<f32>>;
111
+ @group(0) @binding(2) var<uniform> params: Params;
112
+
113
+ @compute @workgroup_size(${WORKGROUP_SIZE}, ${WORKGROUP_SIZE}, 1)
114
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
115
+ if (gid.x >= params.width || gid.y >= params.height) { return; }
116
+ let pixel = gid.y * params.width + gid.x;
117
+ let plane = params.width * params.height;
118
+ outputData[pixel] = vec4<f32>(
119
+ f32(inputData[pixel]),
120
+ f32(inputData[plane + pixel]),
121
+ f32(inputData[plane * 2u + pixel]),
122
+ 0.0
123
+ );
124
+ }
125
+ `;
126
+ }
127
+ function resolveWebNNPrecision(device, requested) {
128
+ if (requested === 'fp32') {
129
+ throw new Error('OIDN WebNN GPU interop currently requires FP16 exportable tensors');
130
+ }
131
+ if (!device.features.has('shader-f16')) {
132
+ throw new Error('OIDN WebNN requires shader-f16 on the shared GPUDevice');
133
+ }
134
+ return 'fp16';
135
+ }
136
+ function activation(builder, operand, kind) {
137
+ return kind === 'relu' ? builder.relu(operand) : operand;
138
+ }
139
+ /** Experimental model-driven WebNN executor with FP16 WebGPU interop. */
140
+ export class WebNNUNetExecutor {
141
+ _device;
142
+ _model;
143
+ precision;
144
+ support;
145
+ _context;
146
+ _builderConstructor;
147
+ _shapeCache = new Map();
148
+ _shapePromises = new Map();
149
+ _retiredExecutions = new Set();
150
+ _pendingCreationCount = 0;
151
+ _shapeCacheSize;
152
+ _clock = 0;
153
+ _inputPipeline;
154
+ _outputPipeline;
155
+ _resources = new OIDNResourceTracker();
156
+ _disposed = false;
157
+ constructor(_device, _model, options = {}) {
158
+ this._device = _device;
159
+ this._model = _model;
160
+ this.precision = resolveWebNNPrecision(_device, options.precision ?? 'auto');
161
+ this._shapeCacheSize = Math.max(1, options.shapeCacheSize ?? 2);
162
+ this.support = {
163
+ available: false,
164
+ fp16Conv: false,
165
+ gpuInterop: false
166
+ };
167
+ const pipelines = interopPipelines(_device, _model.inputChannels / 3);
168
+ this._inputPipeline = pipelines.input;
169
+ this._outputPipeline = pipelines.output;
170
+ }
171
+ async prepare() {
172
+ if (this._disposed)
173
+ throw new Error('OIDN WebNN executor is disposed');
174
+ const webNN = globalThis.navigator?.ml;
175
+ const Builder = globalThis.MLGraphBuilder;
176
+ if (!webNN?.createContext || typeof Builder !== 'function') {
177
+ this.support.reason = 'WebNN is not exposed by this browser';
178
+ throw new Error(this.support.reason);
179
+ }
180
+ this._builderConstructor = Builder;
181
+ try {
182
+ try {
183
+ // Chromium's experimental implementation only enables WebGPU tensor
184
+ // interop for an explicitly GPU-backed context.
185
+ this._context = await webNN.createContext({
186
+ deviceType: 'gpu',
187
+ powerPreference: 'high-performance'
188
+ });
189
+ }
190
+ catch {
191
+ this._context = await webNN.createContext({ deviceType: 'gpu' });
192
+ }
193
+ this._resources.track('ml-context', this._context);
194
+ if (this._disposed)
195
+ throw new Error('OIDN WebNN executor is disposed');
196
+ if (typeof this._context.createExportableTensor !== 'function' ||
197
+ typeof this._context.exportToGPU !== 'function') {
198
+ this.support.reason = 'WebNN WebGPU tensor interop is unavailable';
199
+ throw new Error(this.support.reason);
200
+ }
201
+ const limits = this._context.opSupportLimits?.() ?? {};
202
+ this.support.fp16Conv =
203
+ hasDataType(limits, 'conv2d', 'input', 'float16') &&
204
+ hasDataType(limits, 'conv2d', 'filter', 'float16') &&
205
+ hasDataType(limits, 'conv2d', 'output', 'float16');
206
+ if (!this.support.fp16Conv) {
207
+ this.support.reason = 'WebNN does not support FP16 conv2d';
208
+ throw new Error(this.support.reason);
209
+ }
210
+ let probe;
211
+ let probeBuffer;
212
+ try {
213
+ probe = this._resources.track('ml-tensor', await this._context.createExportableTensor({ dataType: 'float16', shape: [4] }, this._device));
214
+ probeBuffer = this._resources.track('gpu-buffer', await this._context.exportToGPU(probe));
215
+ this.support.gpuInterop = true;
216
+ }
217
+ catch (error) {
218
+ this.support.reason =
219
+ `WebNN FP16 WebGPU interop failed: ${String(error)}`;
220
+ throw new Error(this.support.reason);
221
+ }
222
+ finally {
223
+ this._releaseBuffer(probeBuffer);
224
+ this._releaseTensor(probe);
225
+ }
226
+ this.support.available = true;
227
+ }
228
+ catch (error) {
229
+ this._releaseContext();
230
+ throw error;
231
+ }
232
+ }
233
+ _constant(builder, tensor) {
234
+ return builder.constant({
235
+ dataType: 'float16',
236
+ shape: [...tensor.desc.dims]
237
+ }, tensorBytes(tensor, this.precision));
238
+ }
239
+ async _createExecution(width, height) {
240
+ if (this._disposed)
241
+ throw new Error('OIDN WebNN executor is disposed');
242
+ const builder = new this._builderConstructor(this._context);
243
+ const values = new Map();
244
+ const shapes = new Map();
245
+ values.set(this._model.spec.input, builder.input('input', {
246
+ dataType: 'float16',
247
+ shape: [1, this._model.inputChannels, height, width]
248
+ }));
249
+ shapes.set(this._model.spec.input, [this._model.inputChannels, height, width]);
250
+ for (const node of this._model.spec.nodes) {
251
+ let result;
252
+ let shape;
253
+ if (node.op === 'conv2d') {
254
+ const inputShape = shapes.get(node.input);
255
+ const tensors = this._model.convTensors.get(node.id);
256
+ const convolution = builder.conv2d(values.get(node.input), this._constant(builder, tensors.weight), {
257
+ bias: this._constant(builder, tensors.bias),
258
+ padding: [1, 1, 1, 1],
259
+ inputLayout: 'nchw',
260
+ filterLayout: 'oihw'
261
+ });
262
+ result = activation(builder, convolution, node.activation);
263
+ shape = [tensors.outputChannels, inputShape[1], inputShape[2]];
264
+ }
265
+ else if (node.op === 'maxPool2d') {
266
+ const inputShape = shapes.get(node.input);
267
+ result = builder.maxPool2d(values.get(node.input), {
268
+ windowDimensions: [2, 2],
269
+ strides: [2, 2],
270
+ padding: [0, inputShape[1] % 2, 0, inputShape[2] % 2],
271
+ layout: 'nchw'
272
+ });
273
+ shape = [
274
+ inputShape[0],
275
+ Math.ceil(inputShape[1] / 2),
276
+ Math.ceil(inputShape[2] / 2)
277
+ ];
278
+ }
279
+ else if (node.op === 'upsample2d') {
280
+ const inputShape = shapes.get(node.input);
281
+ result = builder.resample2d(values.get(node.input), {
282
+ mode: 'nearest-neighbor',
283
+ axes: [2, 3],
284
+ scales: [2, 2]
285
+ });
286
+ shape = [inputShape[0], inputShape[1] * 2, inputShape[2] * 2];
287
+ }
288
+ else {
289
+ const inputShapes = node.inputs.map((input) => shapes.get(input));
290
+ if (inputShapes.some((candidate) => candidate[1] !== inputShapes[0][1] ||
291
+ candidate[2] !== inputShapes[0][2])) {
292
+ throw new Error(`WebNN concat ${node.id} has mismatched spatial shapes`);
293
+ }
294
+ result = builder.concat(node.inputs.map((input) => values.get(input)), 1);
295
+ shape = [
296
+ inputShapes.reduce((sum, candidate) => sum + candidate[0], 0),
297
+ inputShapes[0][1],
298
+ inputShapes[0][2]
299
+ ];
300
+ }
301
+ values.set(node.id, result);
302
+ shapes.set(node.id, shape);
303
+ }
304
+ let graph;
305
+ let inputTensor;
306
+ let outputTensor;
307
+ let outputBuffer;
308
+ let inputUniform;
309
+ let outputUniform;
310
+ try {
311
+ graph = this._resources.track('ml-graph', await builder.build({
312
+ output: values.get(this._model.spec.output)
313
+ }));
314
+ inputTensor = this._resources.track('ml-tensor', await this._context.createExportableTensor({
315
+ dataType: 'float16',
316
+ shape: [1, this._model.inputChannels, height, width],
317
+ writable: true
318
+ }, this._device));
319
+ outputTensor = this._resources.track('ml-tensor', await this._context.createExportableTensor({
320
+ dataType: 'float16',
321
+ shape: [1, this._model.outputChannels, height, width],
322
+ readable: true
323
+ }, this._device));
324
+ outputBuffer = this._resources.track('gpu-buffer', this._device.createBuffer({
325
+ label: `oidn/webnn/output/${width}x${height}`,
326
+ size: width * height * 4 * 4,
327
+ usage: GPUBufferUsage.STORAGE |
328
+ GPUBufferUsage.COPY_SRC |
329
+ GPUBufferUsage.COPY_DST
330
+ }));
331
+ inputUniform = this._resources.track('gpu-buffer', uniformBuffer(this._device, `oidn/webnn/input/${width}x${height}`, [width, height, this._model.inputChannels]));
332
+ outputUniform = this._resources.track('gpu-buffer', uniformBuffer(this._device, `oidn/webnn/output/${width}x${height}`, [width, height]));
333
+ const execution = {
334
+ graph,
335
+ inputTensor,
336
+ outputTensor,
337
+ outputBuffer,
338
+ inputUniform,
339
+ outputUniform,
340
+ width,
341
+ height,
342
+ lastUsed: ++this._clock
343
+ };
344
+ return execution;
345
+ }
346
+ catch (error) {
347
+ this._releaseBuffer(outputUniform);
348
+ this._releaseBuffer(inputUniform);
349
+ this._releaseBuffer(outputBuffer);
350
+ this._releaseTensor(outputTensor);
351
+ this._releaseTensor(inputTensor);
352
+ this._releaseGraph(graph);
353
+ throw error;
354
+ }
355
+ }
356
+ async _execution(width, height) {
357
+ const key = `${width}x${height}`;
358
+ let execution = this._shapeCache.get(key);
359
+ if (!execution) {
360
+ let pending = this._shapePromises.get(key);
361
+ if (!pending) {
362
+ pending = (async () => {
363
+ this._pendingCreationCount++;
364
+ try {
365
+ return await this._createExecution(width, height);
366
+ }
367
+ finally {
368
+ this._pendingCreationCount--;
369
+ }
370
+ })();
371
+ this._shapePromises.set(key, pending);
372
+ }
373
+ try {
374
+ execution = await pending;
375
+ if (this._disposed) {
376
+ this._destroyExecution(execution);
377
+ throw new Error('OIDN WebNN executor is disposed');
378
+ }
379
+ this._shapeCache.set(key, execution);
380
+ }
381
+ finally {
382
+ if (this._shapePromises.get(key) === pending) {
383
+ this._shapePromises.delete(key);
384
+ }
385
+ }
386
+ if (this._shapeCache.size > this._shapeCacheSize) {
387
+ const oldest = [...this._shapeCache.entries()]
388
+ .filter(([candidate]) => candidate !== key)
389
+ .sort((left, right) => left[1].lastUsed - right[1].lastUsed)[0];
390
+ if (oldest) {
391
+ this._shapeCache.delete(oldest[0]);
392
+ this._retireExecution(oldest[1]);
393
+ }
394
+ }
395
+ }
396
+ execution.lastUsed = ++this._clock;
397
+ return execution;
398
+ }
399
+ /** Compiles common tile shapes while the host still reports model loading. */
400
+ async prewarm(shapes) {
401
+ for (const shape of shapes) {
402
+ await this._execution(shape.width, shape.height);
403
+ }
404
+ }
405
+ async execute(inputBuffers, width, height) {
406
+ const sourceCount = this._model.inputChannels / 3;
407
+ if (inputBuffers.length !== sourceCount) {
408
+ throw new Error(`OIDN WebNN expected ${sourceCount} input buffers, got ${inputBuffers.length}`);
409
+ }
410
+ const execution = await this._execution(width, height);
411
+ const inputGPUBuffer = this._resources.track('gpu-buffer', await this._context.exportToGPU(execution.inputTensor));
412
+ try {
413
+ const inputEntries = inputBuffers.map((buffer, binding) => ({ binding, resource: { buffer } }));
414
+ inputEntries.push({
415
+ binding: sourceCount,
416
+ resource: { buffer: inputGPUBuffer }
417
+ });
418
+ inputEntries.push({
419
+ binding: sourceCount + 1,
420
+ resource: { buffer: execution.inputUniform }
421
+ });
422
+ const inputBindGroup = this._device.createBindGroup({
423
+ label: 'oidn/webnn/input-bindings',
424
+ layout: this._inputPipeline.getBindGroupLayout(0),
425
+ entries: inputEntries
426
+ });
427
+ const inputEncoder = this._device.createCommandEncoder({
428
+ label: 'oidn/webnn/input-pack'
429
+ });
430
+ const inputPass = inputEncoder.beginComputePass();
431
+ inputPass.setPipeline(this._inputPipeline);
432
+ inputPass.setBindGroup(0, inputBindGroup);
433
+ inputPass.dispatchWorkgroups(Math.ceil(width / WORKGROUP_SIZE), Math.ceil(height / WORKGROUP_SIZE), this._model.inputChannels);
434
+ inputPass.end();
435
+ this._device.queue.submit([inputEncoder.finish()]);
436
+ }
437
+ finally {
438
+ this._releaseBuffer(inputGPUBuffer);
439
+ }
440
+ this._context.dispatch(execution.graph, { input: execution.inputTensor }, { output: execution.outputTensor });
441
+ const outputGPUBuffer = this._resources.track('gpu-buffer', await this._context.exportToGPU(execution.outputTensor));
442
+ try {
443
+ const outputBindGroup = this._device.createBindGroup({
444
+ label: 'oidn/webnn/output-bindings',
445
+ layout: this._outputPipeline.getBindGroupLayout(0),
446
+ entries: [
447
+ { binding: 0, resource: { buffer: outputGPUBuffer } },
448
+ { binding: 1, resource: { buffer: execution.outputBuffer } },
449
+ { binding: 2, resource: { buffer: execution.outputUniform } }
450
+ ]
451
+ });
452
+ const outputEncoder = this._device.createCommandEncoder({
453
+ label: 'oidn/webnn/output-unpack'
454
+ });
455
+ const outputPass = outputEncoder.beginComputePass();
456
+ outputPass.setPipeline(this._outputPipeline);
457
+ outputPass.setBindGroup(0, outputBindGroup);
458
+ outputPass.dispatchWorkgroups(Math.ceil(width / WORKGROUP_SIZE), Math.ceil(height / WORKGROUP_SIZE));
459
+ outputPass.end();
460
+ this._device.queue.submit([outputEncoder.finish()]);
461
+ }
462
+ finally {
463
+ this._releaseBuffer(outputGPUBuffer);
464
+ }
465
+ return execution.outputBuffer;
466
+ }
467
+ async executeCPU(input, width, height) {
468
+ const execution = await this._execution(width, height);
469
+ const plane = width * height;
470
+ const packed = new Float16Array(plane * this._model.inputChannels);
471
+ for (let pixel = 0; pixel < plane; pixel++) {
472
+ for (let channel = 0; channel < this._model.inputChannels; channel++) {
473
+ packed[channel * plane + pixel] =
474
+ input[pixel * this._model.inputChannels + channel];
475
+ }
476
+ }
477
+ this._context.writeTensor(execution.inputTensor, packed);
478
+ this._context.dispatch(execution.graph, { input: execution.inputTensor }, { output: execution.outputTensor });
479
+ const result = new Float16Array(await this._context.readTensor(execution.outputTensor));
480
+ const unpacked = new Float32Array(plane * this._model.outputChannels);
481
+ for (let pixel = 0; pixel < plane; pixel++) {
482
+ for (let channel = 0; channel < this._model.outputChannels; channel++) {
483
+ unpacked[pixel * this._model.outputChannels + channel] =
484
+ result[channel * plane + pixel];
485
+ }
486
+ }
487
+ return unpacked;
488
+ }
489
+ _destroyExecution(execution) {
490
+ this._releaseGraph(execution.graph);
491
+ this._releaseTensor(execution.inputTensor);
492
+ this._releaseTensor(execution.outputTensor);
493
+ this._releaseBuffer(execution.outputBuffer);
494
+ this._releaseBuffer(execution.inputUniform);
495
+ this._releaseBuffer(execution.outputUniform);
496
+ }
497
+ _retireExecution(execution) {
498
+ this._retiredExecutions.add(execution);
499
+ void this._device.queue.onSubmittedWorkDone().catch(() => undefined).then(() => {
500
+ this._retiredExecutions.delete(execution);
501
+ this._destroyExecution(execution);
502
+ });
503
+ }
504
+ _releaseBuffer(buffer) {
505
+ this._resources.release('gpu-buffer', buffer, () => buffer.destroy());
506
+ }
507
+ _releaseTensor(tensor) {
508
+ this._resources.release('ml-tensor', tensor, () => tensor.destroy());
509
+ }
510
+ _releaseGraph(graph) {
511
+ this._resources.release('ml-graph', graph, () => graph.destroy?.());
512
+ }
513
+ _releaseContext() {
514
+ this._resources.release('ml-context', this._context, () => this._context.destroy?.());
515
+ }
516
+ getResourceInfo() {
517
+ return this._resources.snapshot(this._pendingCreationCount + this._retiredExecutions.size);
518
+ }
519
+ dispose() {
520
+ if (this._disposed)
521
+ return;
522
+ this._disposed = true;
523
+ for (const execution of this._shapeCache.values()) {
524
+ this._destroyExecution(execution);
525
+ }
526
+ this._shapeCache.clear();
527
+ for (const execution of this._retiredExecutions) {
528
+ this._destroyExecution(execution);
529
+ }
530
+ this._retiredExecutions.clear();
531
+ this._shapePromises.clear();
532
+ this._releaseContext();
533
+ }
534
+ }
535
+ //# sourceMappingURL=webnnUNet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webnnUNet.js","sourceRoot":"","sources":["../src/webnnUNet.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,26 +1,37 @@
1
1
  {
2
2
  "name": "oidn-web",
3
- "version": "0.3.5",
3
+ "version": "0.5.0",
4
4
  "description": "Run Open Image Denoiser on the Web",
5
5
  "main": "lib/main.js",
6
6
  "types": "lib/main.d.ts",
7
+ "files": [
8
+ "lib",
9
+ "dist",
10
+ "src",
11
+ "CHANGELOG.md"
12
+ ],
7
13
  "type": "module",
8
14
  "scripts": {
9
15
  "build": "vite build",
10
16
  "dev": "vite dev",
11
17
  "watch": "vite build -w",
18
+ "test": "npm run build:lib && npm run build && node --test tests/*.test.mjs",
19
+ "test:leak": "node benchmarks/leak.mjs",
20
+ "benchmark": "node benchmarks/compare.mjs",
21
+ "model:inspect": "npm run build:lib && node scripts/inspect-model.mjs",
22
+ "prepare": "npm run build:lib",
12
23
  "prepublishOnly": "npm run build && npm run build:lib",
13
- "build:lib": "tsc",
24
+ "build:lib": "node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\" && tsc",
14
25
  "watch:lib": "tsc --watch"
15
26
  },
16
27
  "author": "pissang",
17
28
  "license": "MIT",
18
29
  "dependencies": {
19
- "@petamoriken/float16": "^3.8.7",
20
- "@tensorflow/tfjs": "4.20.0",
21
- "@tensorflow/tfjs-backend-webgpu": "4.20.0"
30
+ "@petamoriken/float16": "^3.8.7"
22
31
  },
23
32
  "devDependencies": {
33
+ "@webgpu/types": "^0.1.40",
34
+ "playwright-core": "^1.62.1",
24
35
  "typescript": "^5.7.3",
25
36
  "vite": "^5.2.13",
26
37
  "vite-plugin-mkcert": "^1.17.5"