[js/web] add sessionOptions.freeDimensionOverrides (#17488)

### Description
Allows to specify fixed size for dynamic input of a model. resolves
#16707

Pending test
This commit is contained in:
Yulong Wang 2023-09-13 09:17:34 -07:00 committed by GitHub
parent 5d3786206b
commit a2e75114cc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 36 additions and 0 deletions

View file

@ -66,6 +66,13 @@ export declare namespace InferenceSession {
*/
interOpNumThreads?: number;
/**
* The free dimension override.
*
* This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend
*/
freeDimensionOverrides?: {readonly [dimensionName: string]: number};
/**
* The optimization level.
*

View file

@ -54,6 +54,7 @@ export interface OrtWasmModule extends EmscriptenModule {
enableProfiling: boolean, profileFilePrefix: number, logId: number, logSeverityLevel: number,
logVerbosityLevel: number, optimizedModelFilePath: number): number;
_OrtAppendExecutionProvider(sessionOptionsHandle: number, name: number): number;
_OrtAddFreeDimensionOverride(sessionOptionsHandle: number, name: number, dim: number): number;
_OrtAddSessionConfigEntry(sessionOptionsHandle: number, configKey: number, configValue: number): number;
_OrtReleaseSessionOptions(sessionOptionsHandle: number): void;

View file

@ -143,6 +143,21 @@ export const setSessionOptions = (options?: InferenceSession.SessionOptions): [n
setExecutionProviders(sessionOptionsHandle, sessionOptions.executionProviders, allocs);
}
if (sessionOptions.freeDimensionOverrides) {
for (const [name, value] of Object.entries(sessionOptions.freeDimensionOverrides)) {
if (typeof name !== 'string') {
throw new Error(`free dimension override name must be a string: ${name}`);
}
if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {
throw new Error(`free dimension override value must be a non-negative integer: ${value}`);
}
const nameOffset = allocWasmString(name, allocs);
if (wasm._OrtAddFreeDimensionOverride(sessionOptionsHandle, nameOffset, value) !== 0) {
checkLastError(`Can't set a free dimension override: ${name} - ${value}.`);
}
}
}
if (sessionOptions.extra !== undefined) {
iterateExtraOptions(sessionOptions.extra, '', new WeakSet<Record<string, unknown>>(), (key, value) => {
const keyDataOffset = allocWasmString(key, allocs);

View file

@ -155,6 +155,12 @@ int OrtAppendExecutionProvider(ort_session_options_handle_t session_options, con
return CHECK_STATUS(SessionOptionsAppendExecutionProvider, session_options, name, nullptr, nullptr, 0);
}
int OrtAddFreeDimensionOverride(ort_session_options_handle_t session_options,
const char* dim_param_name,
int dim_value) {
return CHECK_STATUS(AddFreeDimensionOverrideByName, session_options, dim_param_name, dim_value);
}
int OrtAddSessionConfigEntry(OrtSessionOptions* session_options,
const char* config_key,
const char* config_value) {

View file

@ -84,6 +84,13 @@ ort_session_options_handle_t EMSCRIPTEN_KEEPALIVE OrtCreateSessionOptions(size_t
int EMSCRIPTEN_KEEPALIVE OrtAppendExecutionProvider(ort_session_options_handle_t session_options,
const char* name);
/**
* add a free dimension override for one dimension of a session's input.
*/
int EMSCRIPTEN_KEEPALIVE OrtAddFreeDimensionOverride(ort_session_options_handle_t session_options,
const char* dim_param_name,
int dim_value);
/**
* store configurations for a session.
* @param session_options a handle to session options created by OrtCreateSessionOptions