Изменение входных размерностей: динамические оси

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

Библиотека обеспечивает работу с различными аппаратными бэкендами: WebAssembly (WASM), WebGPU и CPU, автоматически выбирая наиболее подходящий для текущей среды исполнения.


Динамические оси в моделях ONNX

Многие модели машинного обучения требуют возможности работы с входами переменной размерности. Типичные сценарии включают обработку последовательностей текста, изображений различного разрешения или пакетов данных (batch) переменной длины. В ONNX для обозначения таких возможностей используются динамические оси.

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

Пример: модель обработки текста может иметь входной тензор с формой [batch_size, sequence_length], где batch_size и sequence_length обозначены как динамические оси.


Определение и использование динамических осей в ORT Web

При загрузке модели через ORT Web необходимо правильно указать динамические оси для обеспечения корректной работы с переменной размерностью входных данных.

Создание сессии и загрузка модели

import * as ort from 'onnxruntime-web';

const session = await ort.InferenceSession.create('model.onnx', {
    executionProviders: ['wasm'] // Возможны: ['wasm', 'webgpu', 'cpu']
});

Здесь создается сессия выполнения модели, а выбор провайдера влияет на производительность и совместимость с текущей платформой.

Подготовка входных данных с динамическими осями

Входные данные должны соответствовать динамическим осям, определённым в модели:

const inputTensor = new ort.Tensor('float32', new Float32Array([/* данные */]), [batchSize, sequenceLength]);
  • float32 — тип данных тензора.
  • Float32Array — одномерный массив данных, автоматически преобразуемый в многомерный тензор.
  • [batchSize, sequenceLength] — форма тензора, где batchSize и sequenceLength могут изменяться в зависимости от конкретного вызова.

Важно, чтобы размерность массива данных точно соответствовала произведению размеров, указанных в форме тензора. Несоответствие приведет к ошибкам выполнения.


Автоматическое управление динамическими размерами

Некоторые модели могут принимать пакеты данных различной длины или последовательности различного размера без изменения кода. Для этого в ORT Web используется гибкая подготовка данных:

function createTensor(data, batch, seqLength) {
    return new ort.Tensor('float32', new Float32Array(data), [batch, seqLength]);
}

Использование функций генерации тензоров позволяет легко адаптировать модель под входы разной длины, обеспечивая:

  • Автоматическое согласование формы тензора с размерностями модели.
  • Возможность обработки пакетов данных разного размера без изменения архитектуры.

Ограничения и особенности динамических осей

  1. Типы динамических осей: ONNX поддерживает только положительные целые значения, поэтому нельзя передавать отрицательные числа или дробные значения.
  2. Совместимость моделей: не все модели поддерживают динамические оси. Перед применением необходимо проверить метаданные модели через session.inputNames и session.outputNames.
  3. Производительность: использование динамических осей может влиять на производительность, особенно при частой переработке форм тензоров. WebGPU обеспечивает более эффективную работу с тензорами изменяемого размера по сравнению с WASM.

Проверка динамических входов

Для безопасной работы рекомендуется проверять форму входного тензора перед запуском модели:

const expectedShape = session.inputMetadata['input_0'].dims;
if (inputTensor.dims.length !== expectedShape.length) {
    throw new Error('Несоответствие размерностей входного тензора');
}

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


Выполнение модели с динамическими входами

const feeds = { 'input_0': inputTensor };
const results = await session.run(feeds);
console.log(results['output_0'].data);

Тензоры с динамическими осевыми размерами автоматически обрабатываются ORT Web, позволяя получать корректный выход без ручного изменения модели.

Использование динамических осей делает приложения гибкими и масштабируемыми, позволяя работать с разнообразными наборами данных без необходимости предварительной нормализации всех входов к одной фиксированной форме.