[js/web] allow multiple inference session creating concurrently (#10784)

* test case

* bugfix

* fix

* support multi session init
This commit is contained in:
Yulong Wang 2022-03-07 11:35:06 -08:00 committed by GitHub
parent a4b5fa334a
commit 25fdcfbd14
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 8 deletions

View file

@ -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;
}
}
}

View 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]);
});

View file

@ -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]);

View file

@ -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'});