Типизированные массивы JavaScript и их соответствие типам ONNX

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

Типизированные массивы в JavaScript

Типизированные массивы (TypedArray) представляют собой объекты, предназначенные для хранения массивов чисел фиксированного размера и типа. Они обеспечивают быструю и предсказуемую работу с бинарными данными и являются основой для передачи данных в ONNX Runtime Web.

Основные типы типизированных массивов:

Тип массива Размер элемента Применение
Int8Array 1 байт Целые числа со знаком, 8 бит
Uint8Array 1 байт Целые числа без знака, 8 бит
Int16Array 2 байта Целые числа со знаком, 16 бит
Uint16Array 2 байта Целые числа без знака, 16 бит
Int32Array 4 байта Целые числа со знаком, 32 бит
Uint32Array 4 байта Целые числа без знака, 32 бит
Float32Array 4 байта Числа с плавающей точкой одинарной точности
Float64Array 8 байт Числа с плавающей точкой двойной точности

Каждый типизированный массив хранит элементы в непрерывной области памяти, что позволяет ORT Web быстро считывать данные без необходимости дополнительных преобразований.

Соответствие типов ONNX

ONNX определяет набор базовых типов данных для тензоров, которые модели используют при инференсе. Основные типы:

Тип ONNX Соответствующий TypedArray JavaScript
FLOAT Float32Array
DOUBLE Float64Array
INT32 Int32Array
INT64 BigInt64Array
UINT8 Uint8Array
INT8 Int8Array
UINT16 Uint16Array
INT16 Int16Array
BOOL Uint8Array (0 — false, 1 — true)

Использование корректного соответствия типов критично: если тип массива не соответствует ожидаемому ONNX-типу, ORT Web может выбросить исключение или результат инференса окажется некорректным.

Создание тензоров из типизированных массивов

В ORT Web для передачи данных модели используется объект ort.Tensor, который принимает типизированный массив и форму (shape) тензора:

const inputData = new Float32Array([0.5, 1.2, -0.7, 3.0]);
const inputShape = [2, 2]; // 2 строки, 2 столбца
const inputTensor = new ort.Tensor('float32', inputData, inputShape);

Ключевые моменты:

  • Первый аргумент 'float32' задает тип ONNX, строго соответствующий Float32Array.
  • Второй аргумент — типизированный массив, содержащий данные тензора.
  • Третий аргумент — массив чисел, задающий размерности тензора. Длина массива определяет количество осей, а элементы — размеры каждой оси.

Преобразование массивов JavaScript в типизированные

Часто исходные данные представлены обычными массивами Array. Перед передачей в ORT Web требуется их конвертация в соответствующий типизированный массив:

const rawArray = [1.0, 2.0, 3.0, 4.0];
const floatTensorArray = new Float32Array(rawArray);

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

const boolArray = [true, false, true, false];
const boolTensorArray = new Uint8Array(boolArray.map(v => v ? 1 : 0));

Особенности работы с 64-битными целыми

ONNX поддерживает типы INT64 и UINT64. В JavaScript они должны быть представлены через BigInt64Array и BigUint64Array. Пример:

const int64Data = new BigInt64Array([10n, 20n, -5n]);
const int64Tensor = new ort.Tensor('int64', int64Data, [3]);

Важно учитывать, что работа с 64-битными целыми менее производительна в браузере по сравнению с 32-битными типами, так как требуется использование объектов BigInt.

Советы по производительности

  • Использование типизированных массивов напрямую вместо обычных массивов JavaScript минимизирует накладные расходы на преобразование.
  • Предварительное выделение памяти для больших тензоров уменьшает количество аллокаций и ускоряет инференс.
  • Согласованность типов: всегда проверять, что тип массива соответствует типу ONNX, особенно при динамическом формировании данных.

Примеры сложных тензоров

Для многомерных данных (например, изображений RGB):

const imageData = new Uint8Array(width * height * 3); // RGB
const imageTensor = new ort.Tensor('uint8', imageData, [1, 3, height, width]); 
// форма: [batch_size, channels, height, width]

Здесь ключевое — соблюдение порядка осей, ожидаемого моделью ONNX.

Итоговые принципы

  1. Всегда сопоставлять типизированный массив с ONNX-типом.
  2. Использовать непрерывные массивы памяти (TypedArray) для оптимальной скорости.
  3. Предварительно определять форму тензора, чтобы избежать ошибок во время инференса.
  4. Преобразовывать булевы и BigInt данные корректно, учитывая требования ONNX.
  5. Следить за производительностью при работе с большими массивами.

Эти принципы обеспечивают надежную и эффективную работу ONNX Runtime Web в JavaScript, позволяя создавать сложные приложения машинного обучения прямо в браузере или Node.js.