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,270 @@
1
+ function conv(id, input) {
2
+ return {
3
+ op: 'conv2d',
4
+ id,
5
+ input,
6
+ weight: `${id}.weight`,
7
+ bias: `${id}.bias`,
8
+ activation: 'relu',
9
+ padding: 'same'
10
+ };
11
+ }
12
+ function pool(id, input) {
13
+ return {
14
+ op: 'maxPool2d',
15
+ id,
16
+ input,
17
+ size: 2,
18
+ stride: 2,
19
+ padding: 'same'
20
+ };
21
+ }
22
+ function upsample(id, input) {
23
+ return {
24
+ op: 'upsample2d',
25
+ id,
26
+ input,
27
+ scale: 2,
28
+ mode: 'nearest'
29
+ };
30
+ }
31
+ function concat(id, first, second) {
32
+ return {
33
+ op: 'concat',
34
+ id,
35
+ inputs: [first, second],
36
+ axis: 'channels'
37
+ };
38
+ }
39
+ export const OIDN_UNET_SMALL_SPEC = {
40
+ schemaVersion: 1,
41
+ id: 'oidn-unet-small-v1',
42
+ family: 'oidn-unet-small',
43
+ input: 'input',
44
+ output: 'dec_conv0',
45
+ receptiveField: 174,
46
+ nodes: [
47
+ conv('enc_conv0', 'input'),
48
+ conv('enc_conv1', 'enc_conv0'),
49
+ pool('pool1', 'enc_conv1'),
50
+ conv('enc_conv2', 'pool1'),
51
+ pool('pool2', 'enc_conv2'),
52
+ conv('enc_conv3', 'pool2'),
53
+ pool('pool3', 'enc_conv3'),
54
+ conv('enc_conv4', 'pool3'),
55
+ pool('pool4', 'enc_conv4'),
56
+ conv('enc_conv5a', 'pool4'),
57
+ conv('enc_conv5b', 'enc_conv5a'),
58
+ upsample('up4', 'enc_conv5b'),
59
+ concat('concat4', 'up4', 'pool3'),
60
+ conv('dec_conv4a', 'concat4'),
61
+ conv('dec_conv4b', 'dec_conv4a'),
62
+ upsample('up3', 'dec_conv4b'),
63
+ concat('concat3', 'up3', 'pool2'),
64
+ conv('dec_conv3a', 'concat3'),
65
+ conv('dec_conv3b', 'dec_conv3a'),
66
+ upsample('up2', 'dec_conv3b'),
67
+ concat('concat2', 'up2', 'pool1'),
68
+ conv('dec_conv2a', 'concat2'),
69
+ conv('dec_conv2b', 'dec_conv2a'),
70
+ upsample('up1', 'dec_conv2b'),
71
+ concat('concat1', 'up1', 'input'),
72
+ conv('dec_conv1a', 'concat1'),
73
+ conv('dec_conv1b', 'dec_conv1a'),
74
+ conv('dec_conv0', 'dec_conv1b')
75
+ ]
76
+ };
77
+ export const OIDN_UNET_LARGE_SPEC = {
78
+ schemaVersion: 1,
79
+ id: 'oidn-unet-large-v1',
80
+ family: 'oidn-unet-large',
81
+ input: 'input',
82
+ output: 'dec_conv1c',
83
+ receptiveField: 202,
84
+ nodes: [
85
+ conv('enc_conv1a', 'input'),
86
+ conv('enc_conv1b', 'enc_conv1a'),
87
+ pool('pool1', 'enc_conv1b'),
88
+ conv('enc_conv2a', 'pool1'),
89
+ conv('enc_conv2b', 'enc_conv2a'),
90
+ pool('pool2', 'enc_conv2b'),
91
+ conv('enc_conv3a', 'pool2'),
92
+ conv('enc_conv3b', 'enc_conv3a'),
93
+ pool('pool3', 'enc_conv3b'),
94
+ conv('enc_conv4a', 'pool3'),
95
+ conv('enc_conv4b', 'enc_conv4a'),
96
+ pool('pool4', 'enc_conv4b'),
97
+ conv('enc_conv5a', 'pool4'),
98
+ conv('enc_conv5b', 'enc_conv5a'),
99
+ upsample('up4', 'enc_conv5b'),
100
+ concat('concat4', 'up4', 'pool3'),
101
+ conv('dec_conv4a', 'concat4'),
102
+ conv('dec_conv4b', 'dec_conv4a'),
103
+ upsample('up3', 'dec_conv4b'),
104
+ concat('concat3', 'up3', 'pool2'),
105
+ conv('dec_conv3a', 'concat3'),
106
+ conv('dec_conv3b', 'dec_conv3a'),
107
+ upsample('up2', 'dec_conv3b'),
108
+ concat('concat2', 'up2', 'pool1'),
109
+ conv('dec_conv2a', 'concat2'),
110
+ conv('dec_conv2b', 'dec_conv2a'),
111
+ upsample('up1', 'dec_conv2b'),
112
+ concat('concat1', 'up1', 'input'),
113
+ conv('dec_conv1a', 'concat1'),
114
+ conv('dec_conv1b', 'dec_conv1a'),
115
+ conv('dec_conv1c', 'dec_conv1b')
116
+ ]
117
+ };
118
+ const BUILTIN_MODEL_SPECS = [
119
+ OIDN_UNET_SMALL_SPEC,
120
+ OIDN_UNET_LARGE_SPEC
121
+ ];
122
+ function expectedTensorNames(spec) {
123
+ const names = new Set();
124
+ for (const node of spec.nodes) {
125
+ if (node.op === 'conv2d') {
126
+ names.add(node.weight);
127
+ names.add(node.bias);
128
+ }
129
+ }
130
+ return names;
131
+ }
132
+ function tensorByteSize(tensor) {
133
+ return tensor.desc.getByteSize();
134
+ }
135
+ function describeNames(names) {
136
+ return [...names].sort().join(', ');
137
+ }
138
+ export function detectUNetModelSpec(tensors, specs = BUILTIN_MODEL_SPECS) {
139
+ const matches = specs.filter((spec) => {
140
+ const expected = expectedTensorNames(spec);
141
+ if ([...expected].some((name) => !tensors.has(name)))
142
+ return false;
143
+ return (spec.allowAdditionalTensors === true ||
144
+ [...tensors.keys()].every((name) => expected.has(name)));
145
+ });
146
+ if (matches.length === 1)
147
+ return matches[0];
148
+ if (matches.length > 1) {
149
+ throw new Error(`Ambiguous OIDN model topology: ${matches.map((spec) => spec.id).join(', ')}`);
150
+ }
151
+ throw new Error(`Unsupported OIDN model topology. TZA tensors: ${describeNames(tensors.keys())}`);
152
+ }
153
+ function requireTensor(tensors, name, modelId) {
154
+ const tensor = tensors.get(name);
155
+ if (!tensor) {
156
+ throw new Error(`Model ${modelId} is missing tensor ${name}`);
157
+ }
158
+ if (tensor.data.byteLength !== tensorByteSize(tensor)) {
159
+ throw new Error(`Tensor ${name} has ${tensor.data.byteLength} bytes, expected ${tensorByteSize(tensor)}`);
160
+ }
161
+ return tensor;
162
+ }
163
+ /** Validate tensor layout, shapes, dtypes, graph order, and channel flow. */
164
+ export function validateUNetModel(tensors, spec = detectUNetModelSpec(tensors)) {
165
+ if (spec.schemaVersion !== 1) {
166
+ throw new Error(`Unsupported model descriptor schema ${spec.schemaVersion}`);
167
+ }
168
+ const expected = expectedTensorNames(spec);
169
+ if (!spec.allowAdditionalTensors) {
170
+ const additional = [...tensors.keys()].filter((name) => !expected.has(name));
171
+ if (additional.length > 0) {
172
+ throw new Error(`Model ${spec.id} has unexpected tensors: ${describeNames(additional)}`);
173
+ }
174
+ }
175
+ const channelsByValue = new Map();
176
+ const convTensors = new Map();
177
+ const convChannels = new Map();
178
+ const producedValues = new Set([spec.input]);
179
+ let inputChannels;
180
+ let commonDataType;
181
+ const getChannels = (value, nodeId) => {
182
+ const channels = channelsByValue.get(value);
183
+ if (channels === undefined) {
184
+ throw new Error(`Model ${spec.id} node ${nodeId} reads unknown or forward value ${value}`);
185
+ }
186
+ return channels;
187
+ };
188
+ for (const node of spec.nodes) {
189
+ if (producedValues.has(node.id)) {
190
+ throw new Error(`Model ${spec.id} produces duplicate value ${node.id}`);
191
+ }
192
+ if (node.op === 'conv2d') {
193
+ const weight = requireTensor(tensors, node.weight, spec.id);
194
+ const bias = requireTensor(tensors, node.bias, spec.id);
195
+ const dims = weight.desc.dims;
196
+ if (weight.desc.layout !== 'oihw' || dims.length !== 4) {
197
+ throw new Error(`Tensor ${node.weight} must use OIHW layout`);
198
+ }
199
+ if (dims[2] !== 3 || dims[3] !== 3) {
200
+ throw new Error(`Tensor ${node.weight} must use a 3x3 kernel`);
201
+ }
202
+ if (bias.desc.layout !== 'x' || bias.desc.dims.length !== 1) {
203
+ throw new Error(`Tensor ${node.bias} must be a one-dimensional bias`);
204
+ }
205
+ if (bias.desc.dims[0] !== dims[0]) {
206
+ throw new Error(`Tensor ${node.bias} has ${bias.desc.dims[0]} channels, expected ${dims[0]}`);
207
+ }
208
+ if (weight.desc.dataType !== bias.desc.dataType) {
209
+ throw new Error(`Weight and bias dtype differ for ${node.id}`);
210
+ }
211
+ if (commonDataType && commonDataType !== weight.desc.dataType) {
212
+ throw new Error(`Mixed tensor dtypes are not supported by model ${spec.id}`);
213
+ }
214
+ commonDataType = weight.desc.dataType;
215
+ if (node.input === spec.input && inputChannels === undefined) {
216
+ inputChannels = dims[1];
217
+ channelsByValue.set(spec.input, inputChannels);
218
+ }
219
+ const actualInputChannels = getChannels(node.input, node.id);
220
+ if (actualInputChannels !== dims[1]) {
221
+ throw new Error(`Tensor ${node.weight} expects ${dims[1]} input channels, ` +
222
+ `but ${node.input} provides ${actualInputChannels}`);
223
+ }
224
+ channelsByValue.set(node.id, dims[0]);
225
+ convTensors.set(node.id, {
226
+ weight,
227
+ bias,
228
+ inputChannels: dims[1],
229
+ outputChannels: dims[0],
230
+ kernelHeight: dims[2],
231
+ kernelWidth: dims[3]
232
+ });
233
+ convChannels.set(node.id, {
234
+ inputChannels: dims[1],
235
+ outputChannels: dims[0]
236
+ });
237
+ }
238
+ else if (node.op === 'concat') {
239
+ if (node.inputs.length < 2) {
240
+ throw new Error(`Concat ${node.id} requires at least two inputs`);
241
+ }
242
+ const channels = node.inputs.reduce((sum, value) => sum + getChannels(value, node.id), 0);
243
+ channelsByValue.set(node.id, channels);
244
+ }
245
+ else {
246
+ channelsByValue.set(node.id, getChannels(node.input, node.id));
247
+ }
248
+ producedValues.add(node.id);
249
+ }
250
+ if (inputChannels === undefined || commonDataType === undefined) {
251
+ throw new Error(`Model ${spec.id} has no convolution reading its input`);
252
+ }
253
+ const outputChannels = channelsByValue.get(spec.output);
254
+ if (outputChannels === undefined) {
255
+ throw new Error(`Model ${spec.id} output ${spec.output} is not produced`);
256
+ }
257
+ if (outputChannels !== 3) {
258
+ throw new Error(`Model ${spec.id} must produce 3 channels, got ${outputChannels}`);
259
+ }
260
+ return {
261
+ spec,
262
+ inputChannels,
263
+ outputChannels,
264
+ tensorDataType: commonDataType,
265
+ channelsByValue,
266
+ convChannels,
267
+ convTensors
268
+ };
269
+ }
270
+ //# sourceMappingURL=modelSpec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelSpec.js","sourceRoot":"","sources":["../src/modelSpec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import type { ValidatedUNetModel } from './modelSpec';
2
+ import { type OIDNResourceSnapshot } from './resourceTracker.js';
3
+ export type NativeUNetPrecision = 'fp32' | 'fp16';
4
+ export type NativeUNetPrecisionSetting = NativeUNetPrecision | 'auto';
5
+ export type NativeUNetKernel = 'direct' | 'implicit-gemm' | 'spatial' | 'subgroup';
6
+ export type NativeUNetKernelSetting = NativeUNetKernel | 'auto';
7
+ export type NativeUNetGemmWorkgroup = readonly [4 | 8 | 16, 4 | 8];
8
+ export interface NativeUNetGemmOptions {
9
+ /** Internal per-layer tile selection; explicit workgroup sizes remain fixed by default. */
10
+ tilePolicy?: 'fixed' | 'output-aligned';
11
+ /** Internal decoder source-branch scheduling experiment. */
12
+ decoderLoad?: 'per-load' | 'source-first';
13
+ /** Internal pooling dispatch experiment for the GEMM execution path. */
14
+ poolLayout?: 'spatial' | 'channels';
15
+ /** Internal shared-memory padding experiment; does not change storage ABI. */
16
+ sharedLayout?: 'linear' | 'padded' | 'padded-input' | 'padded-weights';
17
+ /** Internal loop scheduling experiment; each output keeps the same K order. */
18
+ accumulationOrder?: 'k-major' | 'row-major';
19
+ /** Internal final-convolution experiments; retains the original FP16 partial order. */
20
+ finalLayer?: 'direct' | 'shared-input' | 'shared-input-weights' | 'shared-auto';
21
+ /** Internal load-layout experiments; packed loads preserve the FP16 storage bits. */
22
+ loadMode?: 'native' | 'packed-weights' | 'packed-all';
23
+ /** Incremental addressing (default), or the original analytic path for A/B comparisons. */
24
+ addressMode?: 'analytic' | 'incremental' | 'base-offset';
25
+ /** K-major (default) coalesces neighboring output-block loads; output-major preserves the old ABI. */
26
+ weightLayout?: 'output-major' | 'k-major';
27
+ /** Register tile height (default 8). The K reduction grouping stays fixed. */
28
+ rowsPerThread?: 2 | 4 | 8;
29
+ /** Workgroup width/height (default [8, 8]); width also selects output channel blocks. */
30
+ workgroupSize?: NativeUNetGemmWorkgroup;
31
+ }
32
+ export interface NativeUNetOptions {
33
+ precision?: NativeUNetPrecisionSetting;
34
+ /**
35
+ * Convolution kernel selection. `auto` uses implicit GEMM for FP16/FP32
36
+ * convolutions and the direct kernel for the final output layer.
37
+ */
38
+ kernel?: NativeUNetKernelSetting;
39
+ /** Optional implicit-GEMM tuning; other convolution kernels ignore it. */
40
+ gemm?: NativeUNetGemmOptions;
41
+ /** Maximum number of shape-dependent activation plans retained. */
42
+ shapeCacheSize?: number;
43
+ }
44
+ export interface NativeUNetLayerTiming {
45
+ id: string;
46
+ durationMs: number;
47
+ }
48
+ export interface NativeUNetExecutionProfile {
49
+ totalMs: number;
50
+ layers: NativeUNetLayerTiming[];
51
+ }
52
+ export declare function resolveNativeUNetPrecision(device: GPUDevice, requested?: NativeUNetPrecisionSetting): NativeUNetPrecision;
53
+ /** Native, model-driven OIDN U-Net executor. */
54
+ export declare class NativeUNetExecutor {
55
+ private _device;
56
+ readonly precision: NativeUNetPrecision;
57
+ readonly kernelSetting: NativeUNetKernelSetting;
58
+ readonly gemm: Readonly<Required<NativeUNetGemmOptions>>;
59
+ readonly maxSpatialInputBlocks: number;
60
+ readonly subgroupsAvailable: boolean;
61
+ private _model;
62
+ private _gemmByOutputBlocks;
63
+ private _packedConvs;
64
+ private _pipelineCache;
65
+ private _pipelinePromises;
66
+ private _executionCache;
67
+ private _retiredExecutions;
68
+ private _clock;
69
+ private _shapeCacheSize;
70
+ private _profileNextExecution;
71
+ private _lastExecutionProfile?;
72
+ private _profileOperations;
73
+ private _resources;
74
+ private _disposed;
75
+ constructor(_device: GPUDevice, model: ValidatedUNetModel, options?: NativeUNetOptions);
76
+ private _pipeline;
77
+ private _pipelineAsync;
78
+ private _nodePipelineSpec;
79
+ private _gemmForOutput;
80
+ private _coalescedPool;
81
+ private _selectConvKernel;
82
+ private _nodePipeline;
83
+ /** Compiles all shape-independent kernels before the model reports ready. */
84
+ prepare(): Promise<void>;
85
+ private _createExecution;
86
+ private _execution;
87
+ /** Allocates shape-dependent execution resources before interactive use. */
88
+ prewarm(shapes: readonly {
89
+ width: number;
90
+ height: number;
91
+ }[]): void;
92
+ /** Captures per-pass GPU timestamps for the next execute call when supported. */
93
+ profileNextExecution(): boolean;
94
+ getLastExecutionProfile(): Promise<NativeUNetExecutionProfile> | undefined;
95
+ execute(inputBuffers: readonly GPUBuffer[], width: number, height: number): GPUBuffer;
96
+ /** Executes interleaved CPU image data through the native GPU runtime. */
97
+ executeCPU(interleavedInput: Float32Array, width: number, height: number): Promise<Float32Array>;
98
+ private _releaseBuffer;
99
+ private _releaseQuerySet;
100
+ private _destroyExecution;
101
+ getResourceInfo(): OIDNResourceSnapshot;
102
+ dispose(): void;
103
+ }