oidn-webgpu 0.0.0-stage → 0.6.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 +182 -0
- package/LICENSE +21 -0
- package/README.md +89 -2
- package/dist/oidn.js +6140 -0
- package/dist/oidn.umd.cjs +1513 -0
- package/lib/UNet.d.ts +161 -0
- package/lib/UNet.js +536 -0
- package/lib/UNet.js.map +1 -0
- package/lib/WGPUComputePass.d.ts +62 -0
- package/lib/WGPUComputePass.js +278 -0
- package/lib/WGPUComputePass.js.map +1 -0
- package/lib/WGPUFullQuadPass.d.ts +50 -0
- package/lib/WGPUFullQuadPass.js +261 -0
- package/lib/WGPUFullQuadPass.js.map +1 -0
- package/lib/backend.d.ts +1 -0
- package/lib/backend.js +39 -0
- package/lib/backend.js.map +1 -0
- package/lib/finalRgbShader.d.ts +13 -0
- package/lib/finalRgbShader.js +160 -0
- package/lib/finalRgbShader.js.map +1 -0
- package/lib/gpuTypes.d.ts +158 -0
- package/lib/gpuTypes.js +27 -0
- package/lib/gpuTypes.js.map +1 -0
- package/lib/graphOptimizer.d.ts +54 -0
- package/lib/graphOptimizer.js +216 -0
- package/lib/graphOptimizer.js.map +1 -0
- package/lib/hdr.d.ts +31 -0
- package/lib/hdr.js +340 -0
- package/lib/hdr.js.map +1 -0
- package/lib/hdrTransfer.d.ts +22 -0
- package/lib/hdrTransfer.js +128 -0
- package/lib/hdrTransfer.js.map +1 -0
- package/lib/main.d.ts +57 -0
- package/lib/main.js +24 -0
- package/lib/main.js.map +1 -0
- package/lib/modelSpec.d.ts +80 -0
- package/lib/modelSpec.js +270 -0
- package/lib/modelSpec.js.map +1 -0
- package/lib/native/denoise.d.ts +25 -0
- package/lib/native/denoise.js +223 -0
- package/lib/native/denoise.js.map +1 -0
- package/lib/native/program.d.ts +53 -0
- package/lib/native/program.js +310 -0
- package/lib/native/program.js.map +1 -0
- package/lib/native/recordingDevice.d.ts +125 -0
- package/lib/native/recordingDevice.js +247 -0
- package/lib/native/recordingDevice.js.map +1 -0
- package/lib/nativeUNet.d.ts +25 -0
- package/lib/nativeUNet.js +184 -0
- package/lib/nativeUNet.js.map +1 -0
- package/lib/nativeUNetCore.d.ts +202 -0
- package/lib/nativeUNetCore.js +2945 -0
- package/lib/nativeUNetCore.js.map +1 -0
- package/lib/process.d.ts +37 -0
- package/lib/process.js +328 -0
- package/lib/process.js.map +1 -0
- package/lib/resourceTracker.d.ts +26 -0
- package/lib/resourceTracker.js +65 -0
- package/lib/resourceTracker.js.map +1 -0
- package/lib/sanitize.d.ts +15 -0
- package/lib/sanitize.js +28 -0
- package/lib/sanitize.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/tza.d.ts +15 -0
- package/lib/tza.js +114 -0
- package/lib/tza.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 +43 -4
- package/src/UNet.ts +861 -0
- package/src/WGPUComputePass.ts +382 -0
- package/src/WGPUFullQuadPass.ts +348 -0
- package/src/backend.ts +42 -0
- package/src/finalRgbShader.ts +186 -0
- package/src/gpuTypes.ts +179 -0
- package/src/graphOptimizer.ts +301 -0
- package/src/hdr.ts +398 -0
- package/src/hdrTransfer.ts +169 -0
- package/src/main.ts +126 -0
- package/src/modelSpec.ts +414 -0
- package/src/native/core-profile.json +40 -0
- package/src/native/denoise.ts +268 -0
- package/src/native/program.ts +326 -0
- package/src/native/recordingDevice.ts +341 -0
- package/src/nativeUNet.ts +269 -0
- package/src/nativeUNetCore.ts +3735 -0
- package/src/process.ts +368 -0
- package/src/resourceTracker.ts +94 -0
- package/src/sanitize.ts +29 -0
- package/src/tileScheduler.ts +330 -0
- package/src/tza.ts +136 -0
- package/src/webnnUNet.ts +812 -0
package/lib/hdr.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hdr.js","sourceRoot":"","sources":["../src/hdr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
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>;
|
|
15
|
+
export declare function avgLogLum({ data, channels }: {
|
|
16
|
+
data: Float32Array;
|
|
17
|
+
channels: number;
|
|
18
|
+
}): number;
|
|
19
|
+
/** WGSL declarations of `fn HDRForward(y: f32) -> f32` for the input pass. */
|
|
20
|
+
export declare function hdrForwardWGSL(transfer: HDRTransfer): string;
|
|
21
|
+
/** WGSL declarations of `fn HDRInverse(x: f32) -> f32` for the output pass. */
|
|
22
|
+
export declare function hdrInverseWGSL(transfer: HDRTransfer): string;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { FLT_MAX, sanitize } from './sanitize.js';
|
|
2
|
+
const a = 1.41283765e3;
|
|
3
|
+
const b = 1.64593172;
|
|
4
|
+
const c = 4.31384981e-1;
|
|
5
|
+
const d = -2.94139609e-3;
|
|
6
|
+
const e = 1.92653254e-1;
|
|
7
|
+
const f = 6.26026094e-3;
|
|
8
|
+
const g = 9.98620152e-1;
|
|
9
|
+
const y0 = 1.5794576e-6;
|
|
10
|
+
const y1 = 3.22087631e-2;
|
|
11
|
+
const x0 = 2.23151711e-3;
|
|
12
|
+
const x1 = 3.70974749e-1;
|
|
13
|
+
const yMax = 65504;
|
|
14
|
+
const puXMax = puForward(yMax);
|
|
15
|
+
const puNormScale = 1 / puXMax;
|
|
16
|
+
const puRcpNormScale = puXMax;
|
|
17
|
+
const logXMax = Math.log(yMax + 1);
|
|
18
|
+
const logNormScale = 1 / logXMax;
|
|
19
|
+
function puForward(y) {
|
|
20
|
+
if (y <= y0)
|
|
21
|
+
return a * y;
|
|
22
|
+
if (y <= y1)
|
|
23
|
+
return b * Math.pow(y, c) + d;
|
|
24
|
+
return e * Math.log(y + f) + g;
|
|
25
|
+
}
|
|
26
|
+
function puInverse(x) {
|
|
27
|
+
if (x <= x0)
|
|
28
|
+
return x / a;
|
|
29
|
+
if (x <= x1)
|
|
30
|
+
return Math.pow((x - d) / b, 1 / c);
|
|
31
|
+
return Math.exp((x - g) / e) - f;
|
|
32
|
+
}
|
|
33
|
+
function forward(y, transfer) {
|
|
34
|
+
return transfer === 'log'
|
|
35
|
+
? Math.log(y + 1) * logNormScale
|
|
36
|
+
: puForward(y) * puNormScale;
|
|
37
|
+
}
|
|
38
|
+
function inverse(x, transfer) {
|
|
39
|
+
return transfer === 'log'
|
|
40
|
+
? Math.exp(x * logXMax) - 1
|
|
41
|
+
: puInverse(x * puRcpNormScale);
|
|
42
|
+
}
|
|
43
|
+
export function hdrTransferFuncCPU({ data, channels, inputScale, transfer = 'pu' }) {
|
|
44
|
+
const newData = new Float32Array(data);
|
|
45
|
+
for (let i = 0; i < newData.length; i += channels) {
|
|
46
|
+
for (let channel = 0; channel < 3; channel++) {
|
|
47
|
+
newData[i + channel] = forward(sanitize(newData[i + channel] * inputScale, 0, FLT_MAX), transfer);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return newData;
|
|
51
|
+
}
|
|
52
|
+
export function hdrTransferFuncInverseCPU({ data, channels, inputScale, transfer = 'pu' }) {
|
|
53
|
+
const newData = new Float32Array(data);
|
|
54
|
+
const outputScale = 1 / inputScale;
|
|
55
|
+
for (let i = 0; i < newData.length; i += channels) {
|
|
56
|
+
for (let channel = 0; channel < 3; channel++) {
|
|
57
|
+
// The network output may contain negative values or NaNs.
|
|
58
|
+
newData[i + channel] = inverse(sanitize(newData[i + channel], 0, FLT_MAX), transfer) * outputScale;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return newData;
|
|
62
|
+
}
|
|
63
|
+
// TODO put in gpu
|
|
64
|
+
export function avgLogLum({ data, channels }) {
|
|
65
|
+
let totalLuminance = 0;
|
|
66
|
+
for (let i = 0; i < data.length; i += channels) {
|
|
67
|
+
const r = sanitize(data[i], 0, FLT_MAX);
|
|
68
|
+
const g = sanitize(data[i + 1], 0, FLT_MAX);
|
|
69
|
+
const b = sanitize(data[i + 2], 0, FLT_MAX);
|
|
70
|
+
const lum = 0.212671 * r + 0.71516 * g + 0.072169 * b;
|
|
71
|
+
// TODO performance
|
|
72
|
+
// https://github.com/RenderKit/oidn/blob/713ec7838ba650f99e0a896549c0dca5eeb3652d/devices/cpu/cpu_autoexposure.cpp#L43
|
|
73
|
+
totalLuminance += Math.log2(lum + 0.0001);
|
|
74
|
+
}
|
|
75
|
+
const numPixels = data.length / channels;
|
|
76
|
+
const averageLuminance = totalLuminance / numPixels;
|
|
77
|
+
const key = 0.18;
|
|
78
|
+
// https://github.com/RenderKit/oidn/blob/713ec7838ba650f99e0a896549c0dca5eeb3652d/training/color.py#L173
|
|
79
|
+
return key / Math.pow(2, averageLuminance);
|
|
80
|
+
}
|
|
81
|
+
const transferConstantsWGSL = `
|
|
82
|
+
const a = ${a};
|
|
83
|
+
const b = ${b};
|
|
84
|
+
const c = ${c};
|
|
85
|
+
const d = ${d};
|
|
86
|
+
const e = ${e};
|
|
87
|
+
const f = ${f};
|
|
88
|
+
const g = ${g};
|
|
89
|
+
const y0 =${y0};
|
|
90
|
+
const y1 =${y1};
|
|
91
|
+
const x0 =${x0};
|
|
92
|
+
const x1 =${x1};
|
|
93
|
+
|
|
94
|
+
const normScale = ${puNormScale};
|
|
95
|
+
const rcpNormScale = ${puRcpNormScale};
|
|
96
|
+
`;
|
|
97
|
+
/** WGSL declarations of `fn HDRForward(y: f32) -> f32` for the input pass. */
|
|
98
|
+
export function hdrForwardWGSL(transfer) {
|
|
99
|
+
const forwardCode = transfer === 'log'
|
|
100
|
+
? `fn HDRForward(y: f32) -> f32 { return log(y + 1.0) * logNormScale; }`
|
|
101
|
+
: `fn HDRForward(y: f32) -> f32 {
|
|
102
|
+
if (y <= y0) { return a * y * normScale; }
|
|
103
|
+
else if (y <= y1) { return (b * pow(y, c) + d) * normScale; }
|
|
104
|
+
else { return (e * log(y + f) + g) * normScale; }
|
|
105
|
+
}`;
|
|
106
|
+
return /* wgsl */ `
|
|
107
|
+
${transferConstantsWGSL}
|
|
108
|
+
const logXMax = ${logXMax};
|
|
109
|
+
const logNormScale = ${logNormScale};
|
|
110
|
+
${forwardCode}`;
|
|
111
|
+
}
|
|
112
|
+
/** WGSL declarations of `fn HDRInverse(x: f32) -> f32` for the output pass. */
|
|
113
|
+
export function hdrInverseWGSL(transfer) {
|
|
114
|
+
const inverseCode = transfer === 'log'
|
|
115
|
+
? `fn HDRInverse(x: f32) -> f32 { return exp(x * logXMax) - 1.0; }`
|
|
116
|
+
: `fn HDRInverse(x: f32) -> f32 {
|
|
117
|
+
let y = x * rcpNormScale;
|
|
118
|
+
if (y <= x0) { return y / a; }
|
|
119
|
+
else if (y <= x1) { return pow((y - d) / b, 1 / c); }
|
|
120
|
+
else { return exp((y - g) / e) - f; }
|
|
121
|
+
}`;
|
|
122
|
+
return /* wgsl */ `
|
|
123
|
+
${transferConstantsWGSL}
|
|
124
|
+
const logXMax = ${logXMax};
|
|
125
|
+
${inverseCode}
|
|
126
|
+
`;
|
|
127
|
+
}
|
|
128
|
+
//# 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
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { parseTZA } from './tza';
|
|
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 { NativeSubgroupMatrixOptions, NativeUNetGemmOptions, NativeUNetKernelSetting, NativeUNetPrecisionSetting } from './nativeUNet';
|
|
7
|
+
import type { HDRTransfer } from './process';
|
|
8
|
+
export { parseTZA, UNet };
|
|
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, selectSubgroupMatrixConfig } from './nativeUNet';
|
|
16
|
+
export type { NativeSubgroupMatrixConfig, NativeSubgroupMatrixOptions, NativeUNetGemmWorkgroup, NativeUNetGemmOptions, NativeUNetExecutionProfile, NativeUNetKernel, NativeUNetKernelSetting, NativeUNetLayerTiming, NativeUNetOptions, NativeUNetPrecision, NativeUNetPrecisionSetting } from './nativeUNet';
|
|
17
|
+
export interface UNetOptions {
|
|
18
|
+
aux?: boolean;
|
|
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. */
|
|
23
|
+
maxTileSize?: number;
|
|
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
|
+
/**
|
|
39
|
+
* Experimental `kernel: 'subgroup-matrix'` tuning. The kernel needs a
|
|
40
|
+
* GPUDevice created with `subgroups` and `chromium-experimental-subgroup-matrix`.
|
|
41
|
+
* @experimental
|
|
42
|
+
*/
|
|
43
|
+
subgroupMatrix?: NativeSubgroupMatrixOptions;
|
|
44
|
+
/** Versioned topology descriptor for future/custom OIDN TZA models. */
|
|
45
|
+
modelSpec?: UNetModelSpec;
|
|
46
|
+
}
|
|
47
|
+
export type { UNetEngineSetting, UNetExecutionStats } from './UNet';
|
|
48
|
+
export type { HDRTransfer } from './process';
|
|
49
|
+
export { WebNNUNetExecutor } from './webnnUNet';
|
|
50
|
+
export type { WebNNRuntimeSupport, WebNNUNetOptions } from './webnnUNet';
|
|
51
|
+
export type { OIDNResourceKind, OIDNResourceSnapshot, OIDNResourceStats } from './resourceTracker';
|
|
52
|
+
export declare function initUNetFromBuffer(tzaBuffer: ArrayBuffer, backendParams?: {
|
|
53
|
+
device: GPUDevice;
|
|
54
|
+
}, opts?: UNetOptions): Promise<UNet>;
|
|
55
|
+
export declare function initUNetFromURL(modelPath: string, backendParams?: {
|
|
56
|
+
device: GPUDevice;
|
|
57
|
+
}, opts?: UNetOptions): Promise<UNet>;
|
package/lib/main.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { parseTZA } from './tza';
|
|
2
|
+
import UNet from './UNet';
|
|
3
|
+
import { initWebGPUBackend } from './backend';
|
|
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, selectSubgroupMatrixConfig } from './nativeUNet';
|
|
9
|
+
export { WebNNUNetExecutor } from './webnnUNet';
|
|
10
|
+
export async function initUNetFromBuffer(tzaBuffer, backendParams, opts) {
|
|
11
|
+
const device = backendParams?.device ?? await initWebGPUBackend();
|
|
12
|
+
const tensors = parseTZA(tzaBuffer);
|
|
13
|
+
const unet = new UNet(tensors, device, opts);
|
|
14
|
+
await unet.prepare();
|
|
15
|
+
return unet;
|
|
16
|
+
}
|
|
17
|
+
export async function initUNetFromURL(modelPath, backendParams, opts) {
|
|
18
|
+
return fetch(modelPath)
|
|
19
|
+
.then((res) => res.arrayBuffer())
|
|
20
|
+
.then((ab) => {
|
|
21
|
+
return initUNetFromBuffer(ab, backendParams, opts);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=main.js.map
|
package/lib/main.js.map
ADDED
|
@@ -0,0 +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;AAE1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAW9C,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,EAC1B,0BAA0B,EAC3B,MAAM,cAAc,CAAC;AAgDtB,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 { HostTensor } from './tza.js';
|
|
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;
|
package/lib/modelSpec.js
ADDED
|
@@ -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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"}
|