ONNX Runtime Web (ORT Web) обеспечивает выполнение моделей машинного обучения непосредственно в браузере или в среде Node.js. Ключевым аспектом взаимодействия с ORT Web является работа с типизированными массивами JavaScript, которые напрямую соответствуют типам данных, ожидаемым ONNX-моделью. Корректное сопоставление типов критично для корректной работы модели и предотвращения ошибок во время выполнения инференса.
Типизированные массивы (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 | Соответствующий 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.Часто исходные данные представлены обычными массивами
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));
ONNX поддерживает типы INT64 и UINT64. В
JavaScript они должны быть представлены через BigInt64Array
и BigUint64Array. Пример:
const int64Data = new BigInt64Array([10n, 20n, -5n]);
const int64Tensor = new ort.Tensor('int64', int64Data, [3]);
Важно учитывать, что работа с 64-битными целыми менее производительна
в браузере по сравнению с 32-битными типами, так как требуется
использование объектов BigInt.
Для многомерных данных (например, изображений 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.
TypedArray) для оптимальной скорости.Эти принципы обеспечивают надежную и эффективную работу ONNX Runtime Web в JavaScript, позволяя создавать сложные приложения машинного обучения прямо в браузере или Node.js.