fix: failed to initialize WebGPU

This commit is contained in:
Xiaohan-Tian
2026-05-11 22:40:13 -07:00
parent d32dc35b6d
commit f57dd7c1da
3 changed files with 30 additions and 7 deletions
+18
View File
@@ -2,6 +2,14 @@ import type { LocalSeparatorModelConfig } from './localSeparatorTypes';
import { LocalSeparatorCpuDsp } from './localSeparatorCpuDsp'; import { LocalSeparatorCpuDsp } from './localSeparatorCpuDsp';
import { reflectPad } from './localSeparatorShared'; import { reflectPad } from './localSeparatorShared';
function localSeparatorLog(message: string, payload?: unknown): void {
if (payload === undefined) {
console.log(`[localSeparator] ${message}`);
return;
}
console.log(`[localSeparator] ${message}`, payload);
}
type GPUDeviceLike = any; type GPUDeviceLike = any;
type GPUBufferLike = any; type GPUBufferLike = any;
type GPUComputePipelineLike = any; type GPUComputePipelineLike = any;
@@ -76,14 +84,22 @@ export class LocalSeparatorGpuDsp {
throw new Error('WebGPU is not available for GPU DSP.'); throw new Error('WebGPU is not available for GPU DSP.');
} }
localSeparatorLog('Requesting WebGPU adapter for GPU DSP.');
const adapter = await (navigator as { gpu?: { requestAdapter: (options: { powerPreference: string }) => Promise<any> } }).gpu?.requestAdapter({ const adapter = await (navigator as { gpu?: { requestAdapter: (options: { powerPreference: string }) => Promise<any> } }).gpu?.requestAdapter({
powerPreference: 'high-performance', powerPreference: 'high-performance',
}); });
if (!adapter) { if (!adapter) {
throw new Error('No WebGPU adapter was available for GPU DSP.'); throw new Error('No WebGPU adapter was available for GPU DSP.');
} }
localSeparatorLog('WebGPU adapter acquired for GPU DSP.', {
features: typeof adapter.features?.values === 'function' ? Array.from(adapter.features.values()) : undefined,
limits: adapter.limits,
info: typeof adapter.info === 'object' ? adapter.info : undefined,
});
localSeparatorLog('Requesting WebGPU device for GPU DSP.');
const device = await adapter.requestDevice(); const device = await adapter.requestDevice();
localSeparatorLog('WebGPU device acquired for GPU DSP.');
return new LocalSeparatorGpuDsp(config, device); return new LocalSeparatorGpuDsp(config, device);
} }
@@ -93,6 +109,7 @@ export class LocalSeparatorGpuDsp {
this.nFft = config.metadata.mdx_n_fft_scale_set; this.nFft = config.metadata.mdx_n_fft_scale_set;
this.hopLength = config.defaults.hopLength; this.hopLength = config.defaults.hopLength;
this.trim = Math.floor(this.nFft / 2); this.trim = Math.floor(this.nFft / 2);
localSeparatorLog('Creating GPU DSP compute pipeline.');
this.pipeline = device.createComputePipeline({ this.pipeline = device.createComputePipeline({
layout: 'auto', layout: 'auto',
compute: { compute: {
@@ -100,6 +117,7 @@ export class LocalSeparatorGpuDsp {
entryPoint: 'main', entryPoint: 'main',
}, },
}); });
localSeparatorLog('GPU DSP compute pipeline created.');
} }
public async forwardStereo(leftChunk: Float32Array, rightChunk: Float32Array): Promise<{ public async forwardStereo(leftChunk: Float32Array, rightChunk: Float32Array): Promise<{
+10 -3
View File
@@ -111,14 +111,21 @@ class BrowserMdxSeparator {
localSeparatorLog('GPU DSP initialized successfully.'); localSeparatorLog('GPU DSP initialized successfully.');
} catch (error) { } catch (error) {
console.warn('[localSeparator] GPU DSP initialization failed, using CPU DSP.', error); console.warn('[localSeparator] GPU DSP initialization failed, using CPU DSP.', error);
options.onProviderChange?.('cpu/wasm fallback'); options.onProviderChange?.('webgpu + cpu dsp fallback');
localSeparatorLog('GPU DSP initialization failed. Falling back to CPU DSP.', error); localSeparatorLog(
'GPU DSP initialization failed. Inference session may still use WebGPU, but DSP will fall back to CPU.',
error,
);
} }
} }
if (!dsp) { if (!dsp) {
dsp = new LocalSeparatorCpuDsp(config); dsp = new LocalSeparatorCpuDsp(config);
localSeparatorLog('Using CPU DSP.'); if (runtimeProvider === 'webgpu') {
localSeparatorLog('Using CPU DSP while keeping the WebGPU inference provider.');
} else {
localSeparatorLog('Using CPU DSP because the active inference provider is CPU/wasm.');
}
} }
return new BrowserMdxSeparator(session, runtimeProvider, config, { return new BrowserMdxSeparator(session, runtimeProvider, config, {
+2 -4
View File
@@ -1,6 +1,5 @@
import * as ort from 'onnxruntime-web/webgpu'; import * as ort from 'onnxruntime-web/webgpu';
import ortWasmJsepMjsUrl from 'onnxruntime-web/ort-wasm-simd-threaded.jsep.mjs?url'; import ortWasmAsyncifyUrl from 'onnxruntime-web/ort-wasm-simd-threaded.asyncify.wasm?url';
import ortWasmJsepUrl from 'onnxruntime-web/ort-wasm-simd-threaded.jsep.wasm?url';
import type { LocalRuntimeState, LocalRuntimeSupport, LocalSeparatorModelConfig } from './localSeparatorTypes'; import type { LocalRuntimeState, LocalRuntimeSupport, LocalSeparatorModelConfig } from './localSeparatorTypes';
function localSeparatorLog(message: string, payload?: unknown): void { function localSeparatorLog(message: string, payload?: unknown): void {
@@ -45,8 +44,7 @@ export class LocalOrtRuntimeManager {
if (!LocalOrtRuntimeManager.wasmPathsConfigured) { if (!LocalOrtRuntimeManager.wasmPathsConfigured) {
ort.env.wasm.wasmPaths = { ort.env.wasm.wasmPaths = {
mjs: ortWasmJsepMjsUrl, wasm: ortWasmAsyncifyUrl,
wasm: ortWasmJsepUrl,
}; };
localSeparatorLog('Configured ONNX Runtime wasm paths.', ort.env.wasm.wasmPaths); localSeparatorLog('Configured ONNX Runtime wasm paths.', ort.env.wasm.wasmPaths);
LocalOrtRuntimeManager.wasmPathsConfigured = true; LocalOrtRuntimeManager.wasmPathsConfigured = true;