Метаданные сессии: inputNames, outputNames, inputMetadata

ONNX Runtime Web (ORT Web) предоставляет возможность запускать модели машинного обучения непосредственно в браузере или в Node.js, используя высокопроизводительные механизмы выполнения. Важной частью работы с моделью является понимание структуры её входов и выходов, а также их характеристик. Метаданные сессии позволяют получить эту информацию.


inputNames

Свойство inputNames сессии содержит массив строк с именами всех входов модели. Эти имена соответствуют именам, заданным при экспорте модели в формат ONNX.

Пример использования:

const session = await ort.InferenceSession.create('model.onnx');
console.log(session.inputNames); 
// Вывод: ['input_1', 'input_2']

Особенности:

  • Позволяет динамически определить, какие данные требуется передавать в модель.
  • Особенно полезно при работе с моделями с несколькими входами.
  • Имена следует использовать при формировании объекта feeds для метода session.run().

outputNames

Свойство outputNames возвращает массив строк с именами всех выходов модели. Это необходимо для корректного получения результатов после выполнения инференса.

Пример использования:

console.log(session.outputNames); 
// Вывод: ['output_scores', 'output_labels']

Особенности:

  • Используются для указания ключей при извлечении данных из объекта results, возвращаемого session.run(feeds).
  • Позволяют программно адаптироваться к различным моделям, не зная заранее количество выходов.

inputMetadata

inputMetadata представляет собой объект, где ключами являются имена входов модели, а значениями — объекты с подробной информацией о каждом входе.

Пример структуры inputMetadata:

{
  'input_1': {
    name: 'input_1',
    type: 'tensor(float32)',
    dimensions: [1, 3, 224, 224],
    isRequired: true
  },
  'input_2': {
    name: 'input_2',
    type: 'tensor(int64)',
    dimensions: [1],
    isRequired: false
  }
}

Ключевые поля:

  • name — имя входа модели.
  • type — тип данных входного тензора, например tensor(float32) или tensor(int64).
  • dimensions — массив чисел, описывающий форму тензора. Элемент null может означать динамический размер.
  • isRequired — булево значение, указывающее, обязателен ли вход для успешного выполнения инференса.

Применение:

  • Позволяет автоматически формировать и проверять объекты feeds.
  • Упрощает валидацию данных перед вызовом session.run().
  • Позволяет обрабатывать модели с динамическими входами, подбирая размерности на лету.

Практическая интеграция метаданных

Объединение всех трёх свойств (inputNames, outputNames, inputMetadata) позволяет создавать универсальные функции инференса для разных моделей:

async function runModel(session, inputData) {
  const feeds = {};
  for (const name of session.inputNames) {
    if (!inputData[name]) {
      throw new Error(`Не передан входной тензор: ${name}`);
    }
    feeds[name] = inputData[name];
  }

  const results = await session.run(feeds);

  const output = {};
  for (const name of session.outputNames) {
    output[name] = results[name];
  }

  return output;
}

Преимущества подхода:

  • Автоматическая генерация feeds по метаданным модели.
  • Гибкость при смене модели без изменения кода.
  • Предотвращение ошибок несоответствия имен и форматов тензоров.

Взаимодействие с динамическими моделями

Модели ONNX могут иметь динамические размеры входов (null в dimensions). Метаданные позволяют определить, какие размеры необходимо задать:

const metadata = session.inputMetadata['input_1'];
const shape = metadata.dimensions.map(dim => dim === null ? batchSize : dim);
const inputTensor = new ort.Tensor('float32', inputArray, shape);
  • Использование inputMetadata позволяет корректно формировать тензоры с динамическими размерностями.
  • Значительно упрощает поддержку моделей с различной конфигурацией входов без жёстко заданных значений.

Метаданные сессии в ONNX Runtime Web — это фундаментальный инструмент для безопасного и универсального взаимодействия с моделями. inputNames, outputNames и inputMetadata позволяют программно управлять вводом и выводом, динамически адаптироваться к разным моделям и минимизировать ошибки при формировании данных для инференса.