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,199 @@
|
|
|
1
|
+
const defaultMinTileSize = 256;
|
|
2
|
+
const defaultInitialTileSize = 432;
|
|
3
|
+
const defaultTargetTileTimeMs = 16;
|
|
4
|
+
const defaultAdjustmentStep = 16;
|
|
5
|
+
export const OIDN_TILE_ALIGNMENT = 16;
|
|
6
|
+
function alignUp(value, alignment) {
|
|
7
|
+
return Math.ceil(value / alignment) * alignment;
|
|
8
|
+
}
|
|
9
|
+
function alignDown(value, alignment) {
|
|
10
|
+
return Math.floor(value / alignment) * alignment;
|
|
11
|
+
}
|
|
12
|
+
function partitionRange(length, parts, index) {
|
|
13
|
+
const start = Math.round(index * length / parts);
|
|
14
|
+
const end = Math.round((index + 1) * length / parts);
|
|
15
|
+
return { start, end };
|
|
16
|
+
}
|
|
17
|
+
function alignRangeWithinImage(start, end, imageSize, minimumSize = 0) {
|
|
18
|
+
const currentSize = end - start;
|
|
19
|
+
const alignedSize = Math.max(minimumSize, alignUp(currentSize, OIDN_TILE_ALIGNMENT));
|
|
20
|
+
let alignedStart = start - Math.floor((alignedSize - currentSize) / 2);
|
|
21
|
+
// At an image edge, keep the padded portion on the right/bottom. Input
|
|
22
|
+
// readers replicate the nearest image edge into that portion, while output
|
|
23
|
+
// tiles remain strictly inside the original image.
|
|
24
|
+
alignedStart = clamp(alignedStart, 0, Math.max(0, imageSize - alignedSize));
|
|
25
|
+
return { start: alignedStart, end: alignedStart + alignedSize };
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Splits an image into balanced rectangular output regions. Only sides that
|
|
29
|
+
* touch another tile receive a halo; image edges rely on the model's normal
|
|
30
|
+
* boundary behavior instead of doing redundant off-edge work.
|
|
31
|
+
*/
|
|
32
|
+
export function planTileGrid(width, height, maxTileSize, overlap) {
|
|
33
|
+
if (!Number.isInteger(width) || width <= 0 ||
|
|
34
|
+
!Number.isInteger(height) || height <= 0) {
|
|
35
|
+
throw new Error('Tile grid dimensions must be positive integers');
|
|
36
|
+
}
|
|
37
|
+
if (!Number.isFinite(maxTileSize) || maxTileSize <= 0) {
|
|
38
|
+
throw new Error('Maximum tile size must be positive');
|
|
39
|
+
}
|
|
40
|
+
if (!Number.isFinite(overlap) || overlap < 0) {
|
|
41
|
+
throw new Error('Tile overlap must be non-negative');
|
|
42
|
+
}
|
|
43
|
+
const alignedMaximum = Math.max(OIDN_TILE_ALIGNMENT, alignDown(maxTileSize, OIDN_TILE_ALIGNMENT));
|
|
44
|
+
const alignedOverlap = alignUp(overlap, OIDN_TILE_ALIGNMENT);
|
|
45
|
+
const columns = Math.max(1, Math.ceil(width / alignedMaximum));
|
|
46
|
+
const rows = Math.max(1, Math.ceil(height / alignedMaximum));
|
|
47
|
+
const tiles = [];
|
|
48
|
+
let maxOutputWidth = 0;
|
|
49
|
+
let maxOutputHeight = 0;
|
|
50
|
+
for (let row = 0; row < rows; row++) {
|
|
51
|
+
const outputY = partitionRange(height, rows, row);
|
|
52
|
+
for (let column = 0; column < columns; column++) {
|
|
53
|
+
const outputX = partitionRange(width, columns, column);
|
|
54
|
+
const desiredInputX = {
|
|
55
|
+
start: column === 0
|
|
56
|
+
? outputX.start
|
|
57
|
+
: Math.max(0, outputX.start - alignedOverlap),
|
|
58
|
+
end: column === columns - 1
|
|
59
|
+
? outputX.end
|
|
60
|
+
: Math.min(width, outputX.end + alignedOverlap)
|
|
61
|
+
};
|
|
62
|
+
const desiredInputY = {
|
|
63
|
+
start: row === 0
|
|
64
|
+
? outputY.start
|
|
65
|
+
: Math.max(0, outputY.start - alignedOverlap),
|
|
66
|
+
end: row === rows - 1
|
|
67
|
+
? outputY.end
|
|
68
|
+
: Math.min(height, outputY.end + alignedOverlap)
|
|
69
|
+
};
|
|
70
|
+
const inputX = alignRangeWithinImage(desiredInputX.start, desiredInputX.end, width);
|
|
71
|
+
const inputY = alignRangeWithinImage(desiredInputY.start, desiredInputY.end, height);
|
|
72
|
+
const output = {
|
|
73
|
+
x: outputX.start,
|
|
74
|
+
y: outputY.start,
|
|
75
|
+
width: outputX.end - outputX.start,
|
|
76
|
+
height: outputY.end - outputY.start
|
|
77
|
+
};
|
|
78
|
+
const input = {
|
|
79
|
+
x: inputX.start,
|
|
80
|
+
y: inputY.start,
|
|
81
|
+
width: inputX.end - inputX.start,
|
|
82
|
+
height: inputY.end - inputY.start
|
|
83
|
+
};
|
|
84
|
+
maxOutputWidth = Math.max(maxOutputWidth, output.width);
|
|
85
|
+
maxOutputHeight = Math.max(maxOutputHeight, output.height);
|
|
86
|
+
tiles.push({ column, row, input, output });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const inputShapes = () => new Set(tiles.map(({ input }) => `${input.width}x${input.height}`));
|
|
90
|
+
if (inputShapes().size > 2) {
|
|
91
|
+
const maximumInputWidth = Math.max(...tiles.map(({ input }) => input.width));
|
|
92
|
+
const maximumInputHeight = Math.max(...tiles.map(({ input }) => input.height));
|
|
93
|
+
const uniformWidthPixelCount = tiles.reduce((sum, { input }) => sum + maximumInputWidth * input.height, 0);
|
|
94
|
+
const uniformHeightPixelCount = tiles.reduce((sum, { input }) => sum + input.width * maximumInputHeight, 0);
|
|
95
|
+
if (uniformWidthPixelCount <= uniformHeightPixelCount) {
|
|
96
|
+
for (const tile of tiles) {
|
|
97
|
+
const range = alignRangeWithinImage(tile.input.x, tile.input.x + tile.input.width, width, maximumInputWidth);
|
|
98
|
+
tile.input.x = range.start;
|
|
99
|
+
tile.input.width = range.end - range.start;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
for (const tile of tiles) {
|
|
104
|
+
const range = alignRangeWithinImage(tile.input.y, tile.input.y + tile.input.height, height, maximumInputHeight);
|
|
105
|
+
tile.input.y = range.start;
|
|
106
|
+
tile.input.height = range.end - range.start;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const finalInputShapes = inputShapes();
|
|
111
|
+
const inputPixelCount = tiles.reduce((sum, { input }) => sum + input.width * input.height, 0);
|
|
112
|
+
return {
|
|
113
|
+
columns,
|
|
114
|
+
rows,
|
|
115
|
+
overlap: alignedOverlap,
|
|
116
|
+
maxOutputWidth,
|
|
117
|
+
maxOutputHeight,
|
|
118
|
+
inputPixelCount,
|
|
119
|
+
inputShapeCount: finalInputShapes.size,
|
|
120
|
+
tiles
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function clamp(value, min, max) {
|
|
124
|
+
return Math.min(Math.max(value, min), max);
|
|
125
|
+
}
|
|
126
|
+
function percentile(values, fraction) {
|
|
127
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
128
|
+
return sorted[Math.ceil(sorted.length * fraction) - 1];
|
|
129
|
+
}
|
|
130
|
+
/** Fits one output dimension without exceeding the configured tile cap. */
|
|
131
|
+
export function fitTileDimension(imageSize, maxTileSize) {
|
|
132
|
+
return imageSize <= maxTileSize
|
|
133
|
+
? Math.min(alignUp(imageSize, OIDN_TILE_ALIGNMENT), maxTileSize)
|
|
134
|
+
: maxTileSize;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Chooses an output tile size from completed GPU timings. A size change is
|
|
138
|
+
* applied to the next execution so one in-flight tiled pass keeps a stable
|
|
139
|
+
* overlap, allocation plan, and pipeline set.
|
|
140
|
+
*/
|
|
141
|
+
export class DynamicTileController {
|
|
142
|
+
enabled;
|
|
143
|
+
maxTileSize;
|
|
144
|
+
minTileSize;
|
|
145
|
+
targetTileTimeMs;
|
|
146
|
+
_tileSize;
|
|
147
|
+
_adjustmentStep;
|
|
148
|
+
_smoothedTileTimeMs;
|
|
149
|
+
_completeExecutionsSinceChange = 0;
|
|
150
|
+
constructor(maxTileSize, setting = true) {
|
|
151
|
+
const options = typeof setting === 'object' ? setting : {};
|
|
152
|
+
this.enabled = setting !== false;
|
|
153
|
+
this.maxTileSize = Math.max(OIDN_TILE_ALIGNMENT, alignDown(maxTileSize, OIDN_TILE_ALIGNMENT));
|
|
154
|
+
this.minTileSize = clamp(alignUp(options.minTileSize ?? defaultMinTileSize, OIDN_TILE_ALIGNMENT), OIDN_TILE_ALIGNMENT, this.maxTileSize);
|
|
155
|
+
this.targetTileTimeMs = Math.max(1, options.targetTileTimeMs ?? defaultTargetTileTimeMs);
|
|
156
|
+
this._adjustmentStep = Math.max(OIDN_TILE_ALIGNMENT, alignUp(options.adjustmentStep ?? defaultAdjustmentStep, OIDN_TILE_ALIGNMENT));
|
|
157
|
+
this._tileSize = this.enabled
|
|
158
|
+
? clamp(alignUp(options.initialTileSize ?? defaultInitialTileSize, OIDN_TILE_ALIGNMENT), this.minTileSize, this.maxTileSize)
|
|
159
|
+
: this.maxTileSize;
|
|
160
|
+
}
|
|
161
|
+
get tileSize() {
|
|
162
|
+
return this._tileSize;
|
|
163
|
+
}
|
|
164
|
+
/** Returns true when the next execution should use a different tile size. */
|
|
165
|
+
observe(tileTimesMs) {
|
|
166
|
+
if (!this.enabled || tileTimesMs.length === 0)
|
|
167
|
+
return false;
|
|
168
|
+
const validTimes = tileTimesMs.filter((duration) => Number.isFinite(duration) && duration >= 0);
|
|
169
|
+
if (validTimes.length === 0)
|
|
170
|
+
return false;
|
|
171
|
+
// The first tile may still pay one-time GPU residency costs even after
|
|
172
|
+
// shape preparation. It should not make a stable layout look too slow.
|
|
173
|
+
const representativeTimes = validTimes.length >= 3
|
|
174
|
+
? validTimes.slice(1)
|
|
175
|
+
: validTimes;
|
|
176
|
+
const observedTime = percentile(representativeTimes, 0.75);
|
|
177
|
+
this._smoothedTileTimeMs = this._smoothedTileTimeMs === undefined
|
|
178
|
+
? observedTime
|
|
179
|
+
: this._smoothedTileTimeMs * 0.65 + observedTime * 0.35;
|
|
180
|
+
this._completeExecutionsSinceChange++;
|
|
181
|
+
if (this._completeExecutionsSinceChange < 2)
|
|
182
|
+
return false;
|
|
183
|
+
let nextTileSize = this._tileSize;
|
|
184
|
+
if (this._smoothedTileTimeMs > this.targetTileTimeMs * 1.25) {
|
|
185
|
+
nextTileSize -= this._adjustmentStep;
|
|
186
|
+
}
|
|
187
|
+
else if (this._smoothedTileTimeMs < this.targetTileTimeMs * 0.65) {
|
|
188
|
+
nextTileSize += this._adjustmentStep;
|
|
189
|
+
}
|
|
190
|
+
nextTileSize = clamp(alignUp(nextTileSize, OIDN_TILE_ALIGNMENT), this.minTileSize, this.maxTileSize);
|
|
191
|
+
if (nextTileSize === this._tileSize)
|
|
192
|
+
return false;
|
|
193
|
+
this._tileSize = nextTileSize;
|
|
194
|
+
this._smoothedTileTimeMs = undefined;
|
|
195
|
+
this._completeExecutionsSinceChange = 0;
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=tileScheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tileScheduler.js","sourceRoot":"","sources":["../src/tileScheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { ValidatedUNetModel } from './modelSpec';
|
|
2
|
+
import type { NativeUNetPrecision, NativeUNetPrecisionSetting } from './nativeUNet';
|
|
3
|
+
import { type OIDNResourceSnapshot } from './resourceTracker.js';
|
|
4
|
+
export interface WebNNUNetOptions {
|
|
5
|
+
precision?: NativeUNetPrecisionSetting;
|
|
6
|
+
shapeCacheSize?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface WebNNRuntimeSupport {
|
|
9
|
+
available: boolean;
|
|
10
|
+
reason?: string;
|
|
11
|
+
fp16Conv: boolean;
|
|
12
|
+
gpuInterop: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** Experimental model-driven WebNN executor with FP16 WebGPU interop. */
|
|
15
|
+
export declare class WebNNUNetExecutor {
|
|
16
|
+
private _device;
|
|
17
|
+
private _model;
|
|
18
|
+
readonly precision: NativeUNetPrecision;
|
|
19
|
+
readonly support: WebNNRuntimeSupport;
|
|
20
|
+
private _context;
|
|
21
|
+
private _builderConstructor;
|
|
22
|
+
private _shapeCache;
|
|
23
|
+
private _shapePromises;
|
|
24
|
+
private _retiredExecutions;
|
|
25
|
+
private _pendingCreationCount;
|
|
26
|
+
private _shapeCacheSize;
|
|
27
|
+
private _clock;
|
|
28
|
+
private _inputPipeline;
|
|
29
|
+
private _outputPipeline;
|
|
30
|
+
private _resources;
|
|
31
|
+
private _disposed;
|
|
32
|
+
constructor(_device: GPUDevice, _model: ValidatedUNetModel, options?: WebNNUNetOptions);
|
|
33
|
+
prepare(): Promise<void>;
|
|
34
|
+
private _constant;
|
|
35
|
+
private _createExecution;
|
|
36
|
+
private _execution;
|
|
37
|
+
/** Compiles common tile shapes while the host still reports model loading. */
|
|
38
|
+
prewarm(shapes: readonly {
|
|
39
|
+
width: number;
|
|
40
|
+
height: number;
|
|
41
|
+
}[]): Promise<void>;
|
|
42
|
+
execute(inputBuffers: readonly GPUBuffer[], width: number, height: number): Promise<GPUBuffer>;
|
|
43
|
+
executeCPU(input: Float32Array, width: number, height: number): Promise<Float32Array<ArrayBuffer>>;
|
|
44
|
+
private _destroyExecution;
|
|
45
|
+
private _retireExecution;
|
|
46
|
+
private _releaseBuffer;
|
|
47
|
+
private _releaseTensor;
|
|
48
|
+
private _releaseGraph;
|
|
49
|
+
private _releaseContext;
|
|
50
|
+
getResourceInfo(): OIDNResourceSnapshot;
|
|
51
|
+
dispose(): void;
|
|
52
|
+
}
|