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.
- package/CHANGELOG.md +94 -0
- package/README.md +208 -8
- package/dist/oidn.js +4699 -22516
- package/dist/oidn.umd.cjs +989 -5796
- package/lib/UNet.d.ts +111 -26
- package/lib/UNet.js +310 -329
- package/lib/UNet.js.map +1 -1
- package/lib/WGPUComputePass.d.ts +1 -1
- package/lib/WGPUComputePass.js +6 -4
- package/lib/WGPUComputePass.js.map +1 -1
- package/lib/backend.d.ts +1 -4
- package/lib/backend.js +28 -44
- package/lib/backend.js.map +1 -1
- package/lib/finalRgbShader.d.ts +13 -0
- package/lib/finalRgbShader.js +160 -0
- package/lib/finalRgbShader.js.map +1 -0
- package/lib/graphOptimizer.d.ts +54 -0
- package/lib/graphOptimizer.js +215 -0
- package/lib/graphOptimizer.js.map +1 -0
- package/lib/hdrTransfer.d.ts +14 -0
- package/lib/hdrTransfer.js +61 -0
- package/lib/hdrTransfer.js.map +1 -0
- package/lib/main.d.ts +43 -11
- package/lib/main.js +9 -5
- package/lib/main.js.map +1 -1
- package/lib/modelSpec.d.ts +80 -0
- package/lib/modelSpec.js +270 -0
- package/lib/modelSpec.js.map +1 -0
- package/lib/nativeUNet.d.ts +103 -0
- package/lib/nativeUNet.js +2064 -0
- package/lib/nativeUNet.js.map +1 -0
- package/lib/process.d.ts +5 -11
- package/lib/process.js +38 -49
- package/lib/process.js.map +1 -1
- package/lib/resourceTracker.d.ts +26 -0
- package/lib/resourceTracker.js +65 -0
- package/lib/resourceTracker.js.map +1 -0
- package/lib/tileScheduler.d.ts +61 -0
- package/lib/tileScheduler.js +199 -0
- package/lib/tileScheduler.js.map +1 -0
- package/lib/webnnUNet.d.ts +52 -0
- package/lib/webnnUNet.js +535 -0
- package/lib/webnnUNet.js.map +1 -0
- package/package.json +16 -5
- package/src/UNet.ts +463 -437
- package/src/WGPUComputePass.ts +6 -4
- package/src/backend.ts +33 -59
- package/src/finalRgbShader.ts +186 -0
- package/src/graphOptimizer.ts +300 -0
- package/src/hdrTransfer.ts +88 -0
- package/src/main.ts +95 -20
- package/src/modelSpec.ts +414 -0
- package/src/nativeUNet.ts +2655 -0
- package/src/process.ts +46 -71
- package/src/resourceTracker.ts +94 -0
- package/src/tileScheduler.ts +330 -0
- package/src/webnnUNet.ts +812 -0
- package/lib/helper.d.ts +0 -4
- package/lib/helper.js +0 -33
- package/lib/helper.js.map +0 -1
- package/lib/kernels.d.ts +0 -1
- package/lib/kernels.js +0 -26
- package/lib/kernels.js.map +0 -1
- package/src/helper.ts +0 -43
- package/src/kernels.ts +0 -31
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
function nodeInputs(node) {
|
|
2
|
+
return node.op === 'concat' ? node.inputs : [node.input];
|
|
3
|
+
}
|
|
4
|
+
function buildConsumers(spec) {
|
|
5
|
+
const consumers = new Map();
|
|
6
|
+
for (const node of spec.nodes) {
|
|
7
|
+
for (const input of nodeInputs(node)) {
|
|
8
|
+
const list = consumers.get(input) ?? [];
|
|
9
|
+
list.push(node);
|
|
10
|
+
consumers.set(input, list);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return consumers;
|
|
14
|
+
}
|
|
15
|
+
function onlyConsumer(consumers, value, op) {
|
|
16
|
+
const list = consumers.get(value);
|
|
17
|
+
if (list?.length !== 1 || list[0].op !== op)
|
|
18
|
+
return undefined;
|
|
19
|
+
return list[0];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Applies topology-only fusions. It never depends on a particular OIDN model
|
|
23
|
+
* name, so new descriptors automatically benefit from known graph patterns.
|
|
24
|
+
*/
|
|
25
|
+
export function optimizeModelGraph(validated, options = {}) {
|
|
26
|
+
const spec = validated.spec;
|
|
27
|
+
const consumers = buildConsumers(spec);
|
|
28
|
+
const nodesById = new Map(spec.nodes.map((node) => [node.id, node]));
|
|
29
|
+
const eliminated = new Set();
|
|
30
|
+
const fusedAt = new Map();
|
|
31
|
+
let convPool = 0;
|
|
32
|
+
let upsampleConcatConv = 0;
|
|
33
|
+
if (options.fuseConvPool !== false) {
|
|
34
|
+
for (const node of spec.nodes) {
|
|
35
|
+
if (node.op !== 'conv2d' || node.activation !== 'relu')
|
|
36
|
+
continue;
|
|
37
|
+
const pool = onlyConsumer(consumers, node.id, 'maxPool2d');
|
|
38
|
+
if (!pool || pool.size !== 2 || pool.stride !== 2)
|
|
39
|
+
continue;
|
|
40
|
+
eliminated.add(node.id);
|
|
41
|
+
fusedAt.set(pool.id, {
|
|
42
|
+
op: 'fusedConvReluMaxPool2d',
|
|
43
|
+
id: pool.id,
|
|
44
|
+
input: node.input,
|
|
45
|
+
conv: node,
|
|
46
|
+
pool
|
|
47
|
+
});
|
|
48
|
+
convPool++;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (options.fuseUpsampleConcatConv !== false) {
|
|
52
|
+
for (const node of spec.nodes) {
|
|
53
|
+
if (node.op !== 'conv2d')
|
|
54
|
+
continue;
|
|
55
|
+
const concat = nodesById.get(node.input);
|
|
56
|
+
if (concat?.op !== 'concat' || concat.inputs.length !== 2)
|
|
57
|
+
continue;
|
|
58
|
+
if (onlyConsumer(consumers, concat.id, 'conv2d') !== node)
|
|
59
|
+
continue;
|
|
60
|
+
// The native blocked layout can remove concat only when the source
|
|
61
|
+
// boundary is also a vec4 boundary. Other graphs keep the generic ops.
|
|
62
|
+
const firstInputChannels = validated.channelsByValue.get(concat.inputs[0]);
|
|
63
|
+
if (firstInputChannels === undefined || firstInputChannels % 4 !== 0) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const inputs = concat.inputs.map((value) => {
|
|
67
|
+
const candidate = nodesById.get(value);
|
|
68
|
+
if (candidate?.op === 'upsample2d' &&
|
|
69
|
+
candidate.scale === 2 &&
|
|
70
|
+
candidate.mode === 'nearest' &&
|
|
71
|
+
onlyConsumer(consumers, candidate.id, 'concat') === concat) {
|
|
72
|
+
return { value: candidate.input, upsample: candidate };
|
|
73
|
+
}
|
|
74
|
+
return { value };
|
|
75
|
+
});
|
|
76
|
+
const upsampleCount = inputs.filter((input) => input.upsample).length;
|
|
77
|
+
if (upsampleCount !== 1)
|
|
78
|
+
continue;
|
|
79
|
+
eliminated.add(concat.id);
|
|
80
|
+
for (const value of concat.inputs) {
|
|
81
|
+
const candidate = nodesById.get(value);
|
|
82
|
+
if (candidate?.op === 'upsample2d')
|
|
83
|
+
eliminated.add(candidate.id);
|
|
84
|
+
}
|
|
85
|
+
fusedAt.set(node.id, {
|
|
86
|
+
op: 'fusedUpsampleConcatConv2d',
|
|
87
|
+
id: node.id,
|
|
88
|
+
inputs,
|
|
89
|
+
conv: node
|
|
90
|
+
});
|
|
91
|
+
upsampleConcatConv++;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const nodes = [];
|
|
95
|
+
for (const node of spec.nodes) {
|
|
96
|
+
const fused = fusedAt.get(node.id);
|
|
97
|
+
if (fused) {
|
|
98
|
+
nodes.push(fused);
|
|
99
|
+
}
|
|
100
|
+
else if (!eliminated.has(node.id)) {
|
|
101
|
+
nodes.push(node);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
spec,
|
|
106
|
+
nodes,
|
|
107
|
+
fusions: { convPool, upsampleConcatConv }
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function executableInputs(node) {
|
|
111
|
+
if (node.op === 'concat')
|
|
112
|
+
return node.inputs;
|
|
113
|
+
if (node.op === 'fusedUpsampleConcatConv2d') {
|
|
114
|
+
return node.inputs.map((input) => input.value);
|
|
115
|
+
}
|
|
116
|
+
return [node.input];
|
|
117
|
+
}
|
|
118
|
+
function sameSpatialShape(left, right) {
|
|
119
|
+
return left.width === right.width && left.height === right.height;
|
|
120
|
+
}
|
|
121
|
+
/** Resolve all runtime shapes and value lifetimes before allocating GPU data. */
|
|
122
|
+
export function planModelExecution(validated, width, height, options) {
|
|
123
|
+
if (!Number.isInteger(width) || width <= 0 || !Number.isInteger(height) || height <= 0) {
|
|
124
|
+
throw new Error(`Invalid model input size ${width}x${height}`);
|
|
125
|
+
}
|
|
126
|
+
const graph = optimizeModelGraph(validated, options);
|
|
127
|
+
const inputShape = { width, height, channels: validated.inputChannels };
|
|
128
|
+
const valueShapes = new Map([
|
|
129
|
+
[validated.spec.input, inputShape]
|
|
130
|
+
]);
|
|
131
|
+
const outputShapes = [];
|
|
132
|
+
const shapeOf = (value, nodeId) => {
|
|
133
|
+
const shape = valueShapes.get(value);
|
|
134
|
+
if (!shape)
|
|
135
|
+
throw new Error(`Planned node ${nodeId} reads missing value ${value}`);
|
|
136
|
+
return shape;
|
|
137
|
+
};
|
|
138
|
+
for (const node of graph.nodes) {
|
|
139
|
+
let outputShape;
|
|
140
|
+
if (node.op === 'conv2d') {
|
|
141
|
+
const input = shapeOf(node.input, node.id);
|
|
142
|
+
outputShape = {
|
|
143
|
+
width: input.width,
|
|
144
|
+
height: input.height,
|
|
145
|
+
channels: validated.convChannels.get(node.id).outputChannels
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
else if (node.op === 'maxPool2d') {
|
|
149
|
+
const input = shapeOf(node.input, node.id);
|
|
150
|
+
outputShape = {
|
|
151
|
+
width: Math.ceil(input.width / 2),
|
|
152
|
+
height: Math.ceil(input.height / 2),
|
|
153
|
+
channels: input.channels
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
else if (node.op === 'upsample2d') {
|
|
157
|
+
const input = shapeOf(node.input, node.id);
|
|
158
|
+
outputShape = {
|
|
159
|
+
width: input.width * 2,
|
|
160
|
+
height: input.height * 2,
|
|
161
|
+
channels: input.channels
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
else if (node.op === 'concat') {
|
|
165
|
+
const inputs = node.inputs.map((value) => shapeOf(value, node.id));
|
|
166
|
+
if (inputs.some((shape) => !sameSpatialShape(shape, inputs[0]))) {
|
|
167
|
+
throw new Error(`Concat ${node.id} has mismatched spatial shapes`);
|
|
168
|
+
}
|
|
169
|
+
outputShape = {
|
|
170
|
+
width: inputs[0].width,
|
|
171
|
+
height: inputs[0].height,
|
|
172
|
+
channels: inputs.reduce((sum, shape) => sum + shape.channels, 0)
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
else if (node.op === 'fusedConvReluMaxPool2d') {
|
|
176
|
+
const input = shapeOf(node.input, node.id);
|
|
177
|
+
outputShape = {
|
|
178
|
+
width: Math.ceil(input.width / 2),
|
|
179
|
+
height: Math.ceil(input.height / 2),
|
|
180
|
+
channels: validated.convChannels.get(node.conv.id).outputChannels
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
const inputs = node.inputs.map((input) => {
|
|
185
|
+
const source = shapeOf(input.value, node.id);
|
|
186
|
+
return input.upsample
|
|
187
|
+
? { ...source, width: source.width * 2, height: source.height * 2 }
|
|
188
|
+
: source;
|
|
189
|
+
});
|
|
190
|
+
if (inputs.some((shape) => !sameSpatialShape(shape, inputs[0]))) {
|
|
191
|
+
throw new Error(`Fused decoder ${node.id} has mismatched spatial shapes`);
|
|
192
|
+
}
|
|
193
|
+
outputShape = {
|
|
194
|
+
width: inputs[0].width,
|
|
195
|
+
height: inputs[0].height,
|
|
196
|
+
channels: validated.convChannels.get(node.conv.id).outputChannels
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
valueShapes.set(node.id, outputShape);
|
|
200
|
+
outputShapes.push(outputShape);
|
|
201
|
+
}
|
|
202
|
+
const lastUses = new Map();
|
|
203
|
+
graph.nodes.forEach((node, index) => {
|
|
204
|
+
for (const input of executableInputs(node))
|
|
205
|
+
lastUses.set(input, index);
|
|
206
|
+
});
|
|
207
|
+
lastUses.set(validated.spec.output, graph.nodes.length);
|
|
208
|
+
const plannedNodes = graph.nodes.map((node, index) => ({
|
|
209
|
+
node,
|
|
210
|
+
outputShape: outputShapes[index],
|
|
211
|
+
lastUse: lastUses.get(node.id) ?? index
|
|
212
|
+
}));
|
|
213
|
+
return { ...graph, inputShape, valueShapes, plannedNodes };
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=graphOptimizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphOptimizer.js","sourceRoot":"","sources":["../src/graphOptimizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** HDR transfer functions used by the OIDN input and output processing passes. */
|
|
2
|
+
export type HDRTransfer = 'pu' | 'log';
|
|
3
|
+
export declare function hdrTransferFuncCPU({ data, channels, inputScale, transfer }: {
|
|
4
|
+
data: Float32Array;
|
|
5
|
+
channels: number;
|
|
6
|
+
inputScale: number;
|
|
7
|
+
transfer?: HDRTransfer;
|
|
8
|
+
}): Float32Array<ArrayBuffer>;
|
|
9
|
+
export declare function hdrTransferFuncInverseCPU({ data, channels, inputScale, transfer }: {
|
|
10
|
+
data: Float32Array;
|
|
11
|
+
channels: number;
|
|
12
|
+
inputScale: number;
|
|
13
|
+
transfer?: HDRTransfer;
|
|
14
|
+
}): Float32Array<ArrayBuffer>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
const a = 1.41283765e3;
|
|
2
|
+
const b = 1.64593172;
|
|
3
|
+
const c = 4.31384981e-1;
|
|
4
|
+
const d = -2.94139609e-3;
|
|
5
|
+
const e = 1.92653254e-1;
|
|
6
|
+
const f = 6.26026094e-3;
|
|
7
|
+
const g = 9.98620152e-1;
|
|
8
|
+
const y0 = 1.5794576e-6;
|
|
9
|
+
const y1 = 3.22087631e-2;
|
|
10
|
+
const x0 = 2.23151711e-3;
|
|
11
|
+
const x1 = 3.70974749e-1;
|
|
12
|
+
const yMax = 65504;
|
|
13
|
+
const puXMax = puForward(yMax);
|
|
14
|
+
const puNormScale = 1 / puXMax;
|
|
15
|
+
const puRcpNormScale = puXMax;
|
|
16
|
+
const logXMax = Math.log(yMax + 1);
|
|
17
|
+
const logNormScale = 1 / logXMax;
|
|
18
|
+
function puForward(y) {
|
|
19
|
+
if (y <= y0)
|
|
20
|
+
return a * y;
|
|
21
|
+
if (y <= y1)
|
|
22
|
+
return b * Math.pow(y, c) + d;
|
|
23
|
+
return e * Math.log(y + f) + g;
|
|
24
|
+
}
|
|
25
|
+
function puInverse(x) {
|
|
26
|
+
if (x <= x0)
|
|
27
|
+
return x / a;
|
|
28
|
+
if (x <= x1)
|
|
29
|
+
return Math.pow((x - d) / b, 1 / c);
|
|
30
|
+
return Math.exp((x - g) / e) - f;
|
|
31
|
+
}
|
|
32
|
+
function forward(y, transfer) {
|
|
33
|
+
return transfer === 'log'
|
|
34
|
+
? Math.log(y + 1) * logNormScale
|
|
35
|
+
: puForward(y) * puNormScale;
|
|
36
|
+
}
|
|
37
|
+
function inverse(x, transfer) {
|
|
38
|
+
return transfer === 'log'
|
|
39
|
+
? Math.exp(x * logXMax) - 1
|
|
40
|
+
: puInverse(x * puRcpNormScale);
|
|
41
|
+
}
|
|
42
|
+
export function hdrTransferFuncCPU({ data, channels, inputScale, transfer = 'pu' }) {
|
|
43
|
+
const newData = new Float32Array(data);
|
|
44
|
+
for (let i = 0; i < newData.length; i += channels) {
|
|
45
|
+
for (let channel = 0; channel < 3; channel++) {
|
|
46
|
+
newData[i + channel] = forward(newData[i + channel] * inputScale, transfer);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return newData;
|
|
50
|
+
}
|
|
51
|
+
export function hdrTransferFuncInverseCPU({ data, channels, inputScale, transfer = 'pu' }) {
|
|
52
|
+
const newData = new Float32Array(data);
|
|
53
|
+
const outputScale = 1 / inputScale;
|
|
54
|
+
for (let i = 0; i < newData.length; i += channels) {
|
|
55
|
+
for (let channel = 0; channel < 3; channel++) {
|
|
56
|
+
newData[i + channel] = inverse(newData[i + channel], transfer) * outputScale;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return newData;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=hdrTransfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hdrTransfer.js","sourceRoot":"","sources":["../src/hdrTransfer.ts"],"names":[],"mappings":"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"}
|
package/lib/main.d.ts
CHANGED
|
@@ -1,19 +1,51 @@
|
|
|
1
1
|
import { parseTZA } from './tza';
|
|
2
2
|
import UNet from './UNet';
|
|
3
|
+
import type { UNetEngineSetting } from './UNet';
|
|
4
|
+
import type { DynamicTileSetting } from './tileScheduler';
|
|
5
|
+
import type { UNetModelSpec } from './modelSpec';
|
|
6
|
+
import type { NativeUNetGemmOptions, NativeUNetKernelSetting, NativeUNetPrecisionSetting } from './nativeUNet';
|
|
7
|
+
import type { HDRTransfer } from './process';
|
|
3
8
|
export { parseTZA, UNet };
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
9
|
+
export { planTileGrid } from './tileScheduler';
|
|
10
|
+
export type { DynamicTileOptions, DynamicTileSetting, PlannedTile, TilePlan, TileRect } from './tileScheduler';
|
|
11
|
+
export { detectUNetModelSpec, OIDN_UNET_LARGE_SPEC, OIDN_UNET_SMALL_SPEC, validateUNetModel } from './modelSpec';
|
|
12
|
+
export type { ModelNodeSpec, UNetModelGraph, UNetModelSpec, ValidatedUNetModel } from './modelSpec';
|
|
13
|
+
export { optimizeModelGraph, planModelExecution } from './graphOptimizer';
|
|
14
|
+
export type { ExecutableModelNode, GraphOptimizationOptions, ModelExecutionPlan, ModelValueShape, OptimizedModelGraph } from './graphOptimizer';
|
|
15
|
+
export { NativeUNetExecutor, resolveNativeUNetPrecision } from './nativeUNet';
|
|
16
|
+
export type { NativeUNetGemmWorkgroup, NativeUNetGemmOptions, NativeUNetExecutionProfile, NativeUNetKernel, NativeUNetKernelSetting, NativeUNetLayerTiming, NativeUNetOptions, NativeUNetPrecision, NativeUNetPrecisionSetting } from './nativeUNet';
|
|
17
|
+
export interface UNetOptions {
|
|
8
18
|
aux?: boolean;
|
|
9
19
|
hdr?: boolean;
|
|
20
|
+
/** HDR transfer function expected by the trained model. Defaults to PU. */
|
|
21
|
+
hdrTransfer?: HDRTransfer;
|
|
22
|
+
/** Hard upper bound for an output tile edge. Defaults to 512. */
|
|
10
23
|
maxTileSize?: number;
|
|
11
|
-
|
|
24
|
+
/** Adaptive GPU-time-based tile sizing. Enabled by default. */
|
|
25
|
+
dynamicTile?: DynamicTileSetting;
|
|
26
|
+
/** `auto` uses native WGSL; `webnn` opts into the WebNN backend. */
|
|
27
|
+
engine?: UNetEngineSetting;
|
|
28
|
+
/** `auto` selects FP16 when shader-f16 was enabled on the GPUDevice. */
|
|
29
|
+
precision?: NativeUNetPrecisionSetting;
|
|
30
|
+
/** `auto` uses implicit GEMM for FP16/FP32 convolutions, except the direct output layer. */
|
|
31
|
+
kernel?: NativeUNetKernelSetting;
|
|
32
|
+
/**
|
|
33
|
+
* Experimental implicit-GEMM tuning for native WGSL execution. These knobs
|
|
34
|
+
* exist for benchmarking and may change or be removed in any release.
|
|
35
|
+
* @experimental
|
|
36
|
+
*/
|
|
37
|
+
gemm?: NativeUNetGemmOptions;
|
|
38
|
+
/** Versioned topology descriptor for future/custom OIDN TZA models. */
|
|
39
|
+
modelSpec?: UNetModelSpec;
|
|
40
|
+
}
|
|
41
|
+
export type { UNetEngineSetting, UNetExecutionStats } from './UNet';
|
|
42
|
+
export type { HDRTransfer } from './process';
|
|
43
|
+
export { WebNNUNetExecutor } from './webnnUNet';
|
|
44
|
+
export type { WebNNRuntimeSupport, WebNNUNetOptions } from './webnnUNet';
|
|
45
|
+
export type { OIDNResourceKind, OIDNResourceSnapshot, OIDNResourceStats } from './resourceTracker';
|
|
46
|
+
export declare function initUNetFromBuffer(tzaBuffer: ArrayBuffer, backendParams?: {
|
|
47
|
+
device: GPUDevice;
|
|
48
|
+
}, opts?: UNetOptions): Promise<UNet>;
|
|
12
49
|
export declare function initUNetFromURL(modelPath: string, backendParams?: {
|
|
13
50
|
device: GPUDevice;
|
|
14
|
-
|
|
15
|
-
}, opts?: {
|
|
16
|
-
aux?: boolean;
|
|
17
|
-
hdr?: boolean;
|
|
18
|
-
maxTileSize?: number;
|
|
19
|
-
}): Promise<UNet>;
|
|
51
|
+
}, opts?: UNetOptions): Promise<UNet>;
|
package/lib/main.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { parseTZA } from './tza';
|
|
2
2
|
import UNet from './UNet';
|
|
3
|
-
import { initWebGPUBackend
|
|
3
|
+
import { initWebGPUBackend } from './backend';
|
|
4
4
|
export { parseTZA, UNet };
|
|
5
|
+
export { planTileGrid } from './tileScheduler';
|
|
6
|
+
export { detectUNetModelSpec, OIDN_UNET_LARGE_SPEC, OIDN_UNET_SMALL_SPEC, validateUNetModel } from './modelSpec';
|
|
7
|
+
export { optimizeModelGraph, planModelExecution } from './graphOptimizer';
|
|
8
|
+
export { NativeUNetExecutor, resolveNativeUNetPrecision } from './nativeUNet';
|
|
9
|
+
export { WebNNUNetExecutor } from './webnnUNet';
|
|
5
10
|
export async function initUNetFromBuffer(tzaBuffer, backendParams, opts) {
|
|
6
|
-
const
|
|
7
|
-
? initWebGPUBackendWithDevice(backendParams.device, backendParams.adapterInfo)
|
|
8
|
-
: initWebGPUBackend());
|
|
11
|
+
const device = backendParams?.device ?? await initWebGPUBackend();
|
|
9
12
|
const tensors = parseTZA(tzaBuffer);
|
|
10
|
-
const unet = new UNet(tensors,
|
|
13
|
+
const unet = new UNet(tensors, device, opts);
|
|
14
|
+
await unet.prepare();
|
|
11
15
|
return unet;
|
|
12
16
|
}
|
|
13
17
|
export async function initUNetFromURL(modelPath, backendParams, opts) {
|
package/lib/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,IAAI,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,IAAI,MAAM,QAAQ,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAU9C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAQ/C,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAOrB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAQ1E,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC3B,MAAM,cAAc,CAAC;AAwCtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAQhD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAsB,EACtB,aAAqC,EACrC,IAAkB;IAElB,MAAM,MAAM,GAAG,aAAa,EAAE,MAAM,IAAI,MAAM,iBAAiB,EAAE,CAAC;IAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7C,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACrB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAiB,EACjB,aAAqC,EACrC,IAAkB;IAElB,OAAO,KAAK,CAAC,SAAS,CAAC;SACpB,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;SAChC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;QACX,OAAO,kBAAkB,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { HostTensor } from './tza';
|
|
2
|
+
/**
|
|
3
|
+
* Versioned, runtime-independent description of an OIDN network.
|
|
4
|
+
*
|
|
5
|
+
* TZA contains named tensors but no executable graph. Keeping the graph in a
|
|
6
|
+
* small declarative descriptor makes model upgrades independent from the WGSL
|
|
7
|
+
* kernels: a new OIDN topology only needs a new descriptor and validation
|
|
8
|
+
* fixture unless it introduces a genuinely new operation.
|
|
9
|
+
*/
|
|
10
|
+
export interface UNetModelSpec {
|
|
11
|
+
schemaVersion: 1;
|
|
12
|
+
id: string;
|
|
13
|
+
family: 'oidn-unet-small' | 'oidn-unet-large' | (string & {});
|
|
14
|
+
input: string;
|
|
15
|
+
output: string;
|
|
16
|
+
receptiveField: number;
|
|
17
|
+
nodes: readonly ModelNodeSpec[];
|
|
18
|
+
/** Reject unrecognised tensors so an upstream topology change is explicit. */
|
|
19
|
+
allowAdditionalTensors?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export type ModelActivation = 'identity' | 'relu';
|
|
22
|
+
export interface Conv2DNodeSpec {
|
|
23
|
+
op: 'conv2d';
|
|
24
|
+
id: string;
|
|
25
|
+
input: string;
|
|
26
|
+
weight: string;
|
|
27
|
+
bias: string;
|
|
28
|
+
activation: ModelActivation;
|
|
29
|
+
padding: 'same';
|
|
30
|
+
}
|
|
31
|
+
export interface MaxPool2DNodeSpec {
|
|
32
|
+
op: 'maxPool2d';
|
|
33
|
+
id: string;
|
|
34
|
+
input: string;
|
|
35
|
+
size: 2;
|
|
36
|
+
stride: 2;
|
|
37
|
+
padding: 'same';
|
|
38
|
+
}
|
|
39
|
+
export interface Upsample2DNodeSpec {
|
|
40
|
+
op: 'upsample2d';
|
|
41
|
+
id: string;
|
|
42
|
+
input: string;
|
|
43
|
+
scale: 2;
|
|
44
|
+
mode: 'nearest';
|
|
45
|
+
}
|
|
46
|
+
export interface ConcatNodeSpec {
|
|
47
|
+
op: 'concat';
|
|
48
|
+
id: string;
|
|
49
|
+
inputs: readonly string[];
|
|
50
|
+
axis: 'channels';
|
|
51
|
+
}
|
|
52
|
+
export type ModelNodeSpec = Conv2DNodeSpec | MaxPool2DNodeSpec | Upsample2DNodeSpec | ConcatNodeSpec;
|
|
53
|
+
export interface ValidatedConvTensor {
|
|
54
|
+
weight: HostTensor;
|
|
55
|
+
bias: HostTensor;
|
|
56
|
+
inputChannels: number;
|
|
57
|
+
outputChannels: number;
|
|
58
|
+
kernelHeight: number;
|
|
59
|
+
kernelWidth: number;
|
|
60
|
+
}
|
|
61
|
+
export interface ModelConvChannels {
|
|
62
|
+
inputChannels: number;
|
|
63
|
+
outputChannels: number;
|
|
64
|
+
}
|
|
65
|
+
export interface UNetModelGraph {
|
|
66
|
+
spec: UNetModelSpec;
|
|
67
|
+
inputChannels: number;
|
|
68
|
+
outputChannels: number;
|
|
69
|
+
channelsByValue: ReadonlyMap<string, number>;
|
|
70
|
+
convChannels: ReadonlyMap<string, ModelConvChannels>;
|
|
71
|
+
}
|
|
72
|
+
export interface ValidatedUNetModel extends UNetModelGraph {
|
|
73
|
+
tensorDataType: HostTensor['desc']['dataType'];
|
|
74
|
+
convTensors: ReadonlyMap<string, ValidatedConvTensor>;
|
|
75
|
+
}
|
|
76
|
+
export declare const OIDN_UNET_SMALL_SPEC: UNetModelSpec;
|
|
77
|
+
export declare const OIDN_UNET_LARGE_SPEC: UNetModelSpec;
|
|
78
|
+
export declare function detectUNetModelSpec(tensors: ReadonlyMap<string, HostTensor>, specs?: readonly UNetModelSpec[]): UNetModelSpec;
|
|
79
|
+
/** Validate tensor layout, shapes, dtypes, graph order, and channel flow. */
|
|
80
|
+
export declare function validateUNetModel(tensors: ReadonlyMap<string, HostTensor>, spec?: UNetModelSpec): ValidatedUNetModel;
|