From 0205b637564b3559cc1409fefabb29de5293596c Mon Sep 17 00:00:00 2001 From: Yulong Wang <7679871+fs-eire@users.noreply.github.com> Date: Mon, 10 Apr 2023 11:09:09 -0700 Subject: [PATCH] [wasm] optimize default session options parsing (#15428) ### Description optimize default session options parsing. - do minimal property assignment to the passed in `options` object. - modify default value of `enableCpuMemArena` and `enableMemPattern` to `false`. We don't get benefits from enabling these 2 flags in web assembly --- js/web/lib/wasm/session-options.ts | 67 +++++++++--------------------- js/web/lib/wasm/wasm-core-impl.ts | 4 +- 2 files changed, 23 insertions(+), 48 deletions(-) diff --git a/js/web/lib/wasm/session-options.ts b/js/web/lib/wasm/session-options.ts index b63ec78a85..4d32ced239 100644 --- a/js/web/lib/wasm/session-options.ts +++ b/js/web/lib/wasm/session-options.ts @@ -81,66 +81,39 @@ export const setSessionOptions = (options?: InferenceSession.SessionOptions): [n appendDefaultOptions(sessionOptions); try { - if (options?.graphOptimizationLevel === undefined) { - sessionOptions.graphOptimizationLevel = 'all'; - } - const graphOptimizationLevel = getGraphOptimzationLevel(sessionOptions.graphOptimizationLevel!); + const graphOptimizationLevel = getGraphOptimzationLevel(sessionOptions.graphOptimizationLevel ?? 'all'); + const executionMode = getExecutionMode(sessionOptions.executionMode ?? 'sequential'); + const logIdDataOffset = + typeof sessionOptions.logId === 'string' ? allocWasmString(sessionOptions.logId, allocs) : 0; - if (options?.enableCpuMemArena === undefined) { - sessionOptions.enableCpuMemArena = true; + const logSeverityLevel = sessionOptions.logSeverityLevel ?? 2; // Default to 2 - warning + if (!Number.isInteger(logSeverityLevel) || logSeverityLevel < 0 || logSeverityLevel > 4) { + throw new Error(`log serverity level is not valid: ${logSeverityLevel}`); } - if (options?.enableMemPattern === undefined) { - sessionOptions.enableMemPattern = true; + const logVerbosityLevel = sessionOptions.logVerbosityLevel ?? 0; // Default to 0 - verbose + if (!Number.isInteger(logVerbosityLevel) || logVerbosityLevel < 0 || logVerbosityLevel > 4) { + throw new Error(`log verbosity level is not valid: ${logVerbosityLevel}`); } - if (options?.executionMode === undefined) { - sessionOptions.executionMode = 'sequential'; - } - const executionMode = getExecutionMode(sessionOptions.executionMode!); - - let logIdDataOffset = 0; - if (options?.logId !== undefined) { - logIdDataOffset = allocWasmString(options.logId, allocs); - } - - if (options?.logSeverityLevel === undefined) { - sessionOptions.logSeverityLevel = 2; // Default to warning - } else if ( - typeof options.logSeverityLevel !== 'number' || !Number.isInteger(options.logSeverityLevel) || - options.logSeverityLevel < 0 || options.logSeverityLevel > 4) { - throw new Error(`log serverity level is not valid: ${options.logSeverityLevel}`); - } - - if (options?.logVerbosityLevel === undefined) { - sessionOptions.logVerbosityLevel = 0; // Default to 0 - } else if (typeof options.logVerbosityLevel !== 'number' || !Number.isInteger(options.logVerbosityLevel)) { - throw new Error(`log verbosity level is not valid: ${options.logVerbosityLevel}`); - } - - if (options?.enableProfiling === undefined) { - sessionOptions.enableProfiling = false; - } - - let optimizedModelFilePathOffset = 0; - if (typeof options?.optimizedModelFilePath === 'string') { - optimizedModelFilePathOffset = allocWasmString(options.optimizedModelFilePath, allocs); - } + const optimizedModelFilePathOffset = typeof sessionOptions.optimizedModelFilePath === 'string' ? + allocWasmString(sessionOptions.optimizedModelFilePath, allocs) : + 0; sessionOptionsHandle = wasm._OrtCreateSessionOptions( - graphOptimizationLevel, !!sessionOptions.enableCpuMemArena!, !!sessionOptions.enableMemPattern!, executionMode, - !!sessionOptions.enableProfiling!, 0, logIdDataOffset, sessionOptions.logSeverityLevel!, - sessionOptions.logVerbosityLevel!, optimizedModelFilePathOffset); + graphOptimizationLevel, !!sessionOptions.enableCpuMemArena, !!sessionOptions.enableMemPattern, executionMode, + !!sessionOptions.enableProfiling, 0, logIdDataOffset, logSeverityLevel, logVerbosityLevel, + optimizedModelFilePathOffset); if (sessionOptionsHandle === 0) { throw new Error('Can\'t create session options'); } - if (options?.executionProviders) { - setExecutionProviders(sessionOptionsHandle, options.executionProviders, allocs); + if (sessionOptions.executionProviders) { + setExecutionProviders(sessionOptionsHandle, sessionOptions.executionProviders, allocs); } - if (options?.extra !== undefined) { - iterateExtraOptions(options.extra, '', new WeakSet>(), (key, value) => { + if (sessionOptions.extra !== undefined) { + iterateExtraOptions(sessionOptions.extra, '', new WeakSet>(), (key, value) => { const keyDataOffset = allocWasmString(key, allocs); const valueDataOffset = allocWasmString(value, allocs); diff --git a/js/web/lib/wasm/wasm-core-impl.ts b/js/web/lib/wasm/wasm-core-impl.ts index 4406f09714..3334a56d48 100644 --- a/js/web/lib/wasm/wasm-core-impl.ts +++ b/js/web/lib/wasm/wasm-core-impl.ts @@ -56,7 +56,9 @@ export const createSessionFinalize = } } finally { wasm._free(modelData[0]); - wasm._OrtReleaseSessionOptions(sessionOptionsHandle); + if (sessionOptionsHandle !== 0) { + wasm._OrtReleaseSessionOptions(sessionOptionsHandle); + } allocs.forEach(wasm._free); }