mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-05-16 21:00:14 +00:00
[js/web] allow multiple inference session creating concurrently (#10784)
* test case * bugfix * fix * support multi session init
This commit is contained in:
parent
a4b5fa334a
commit
25fdcfbd14
4 changed files with 26 additions and 8 deletions
|
|
@ -7,7 +7,7 @@ interface BackendInfo {
|
|||
backend: Backend;
|
||||
priority: number;
|
||||
|
||||
initializing?: boolean;
|
||||
initPromise?: Promise<void>;
|
||||
initialized?: boolean;
|
||||
aborted?: boolean;
|
||||
}
|
||||
|
|
@ -67,22 +67,25 @@ export const resolveBackend = async(backendHints: readonly string[]): Promise<Ba
|
|||
if (backendInfo) {
|
||||
if (backendInfo.initialized) {
|
||||
return backendInfo.backend;
|
||||
} else if (backendInfo.initializing) {
|
||||
throw new Error(`backend "${backendName}" is being initialized; cannot initialize multiple times.`);
|
||||
} else if (backendInfo.aborted) {
|
||||
continue; // current backend is unavailable; try next
|
||||
}
|
||||
|
||||
const isInitializing = !!backendInfo.initPromise;
|
||||
try {
|
||||
backendInfo.initializing = true;
|
||||
await backendInfo.backend.init();
|
||||
if (!isInitializing) {
|
||||
backendInfo.initPromise = backendInfo.backend.init();
|
||||
}
|
||||
await backendInfo.initPromise;
|
||||
backendInfo.initialized = true;
|
||||
return backendInfo.backend;
|
||||
} catch (e) {
|
||||
errors.push({name: backendName, err: e});
|
||||
if (!isInitializing) {
|
||||
errors.push({name: backendName, err: e});
|
||||
}
|
||||
backendInfo.aborted = true;
|
||||
} finally {
|
||||
backendInfo.initializing = false;
|
||||
delete backendInfo.initPromise;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
10
js/web/test/e2e/browser-test-wasm-multi-session-create.js
Normal file
10
js/web/test/e2e/browser-test-wasm-multi-session-create.js
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
|
||||
'use strict';
|
||||
|
||||
it('Browser E2E testing - WebAssembly backend (multiple inference session create calls)', async function () {
|
||||
const sessionPromiseA = createSession(ort);
|
||||
const sessionPromiseB = createSession(ort);
|
||||
await Promise.all([sessionPromiseA, sessionPromiseB]);
|
||||
});
|
||||
|
|
@ -7,8 +7,12 @@ function assert(cond) {
|
|||
if (!cond) throw new Error();
|
||||
}
|
||||
|
||||
var createSession = function(ort, options) {
|
||||
return ort.InferenceSession.create('./model.onnx', options || {});
|
||||
}
|
||||
|
||||
var testFunction = async function (ort, options) {
|
||||
const session = await ort.InferenceSession.create('./model.onnx', options || {});
|
||||
const session = await createSession(ort, options);
|
||||
|
||||
const dataA = Float32Array.from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
|
||||
const dataB = Float32Array.from([10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]);
|
||||
|
|
|
|||
|
|
@ -100,6 +100,7 @@ async function testAllBrowserCases({ hostInKarma }) {
|
|||
await runKarma({ hostInKarma, main: './browser-test-webgl.js', ortMain: 'ort.webgl.min.js'});
|
||||
await runKarma({ hostInKarma, main: './browser-test-wasm.js'});
|
||||
await runKarma({ hostInKarma, main: './browser-test-wasm.js', ortMain: 'ort.wasm.min.js'});
|
||||
await runKarma({ hostInKarma, main: './browser-test-wasm-multi-session-create.js'});
|
||||
await runKarma({ hostInKarma, main: './browser-test-wasm-no-threads.js'});
|
||||
await runKarma({ hostInKarma, main: './browser-test-wasm-no-threads.js', ortMain: 'ort.wasm-core.min.js'});
|
||||
await runKarma({ hostInKarma, main: './browser-test-wasm-proxy.js'});
|
||||
|
|
|
|||
Loading…
Reference in a new issue