Типы данных: float32, int64, string и другие

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


Основные типы данных

float32 Тип float32 является наиболее часто используемым для численных вычислений в ONNX Runtime Web. Он представляет собой 32-битное число с плавающей запятой, обеспечивающее баланс между точностью и объемом памяти. Используется для входных тензоров изображений, аудио-сигналов, результатов нейронных сетей и других непрерывных значений.

  • Преимущества: высокая точность для большинства ML-задач, поддержка аппаратного ускорения.
  • Особенности: при использовании GPU следует учитывать требования к выравниванию данных и памяти.

int64 Тип int64 представляет собой 64-битное целое число. Он используется для категориальных данных, индексов, идентификаторов объектов и других дискретных величин.

  • Применение: NLP-модели часто используют int64 для токенов текста, а графовые алгоритмы — для индексов вершин и ребер.
  • Особенности: при передаче данных в ORT Web необходимо преобразовать JavaScript Number или BigInt в массив BigInt64Array, чтобы избежать потери точности для больших чисел.

string Тип string хранит текстовые данные. В ONNX Runtime Web строки кодируются как массивы UTF-8. Это важно для моделей, работающих с текстом, таких как модели обработки естественного языка (NLP).

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

Дополнительные типы данных

float16 16-битное число с плавающей запятой, используемое для уменьшения потребления памяти и ускорения вычислений. Подходит для моделей, где допустима меньшая точность.

int32 и int8

  • int32 — 32-битное целое число, используется для меньших диапазонов значений, например, для категориальных признаков с ограниченным числом классов.
  • int8 — 8-битное целое число, часто применяется для квантованных моделей, где экономия памяти критична. В ORT Web поддерживается при использовании WebAssembly или WebGPU.

bool Тип bool представляет логические значения true или false. Используется для масок, бинарных признаков и индикаторов состояния.

tensor с динамическим размером В дополнение к фиксированным типам данных, ONNX поддерживает тензоры с динамическим размером по одной или нескольким осям. В ORT Web это реализуется через создание массивов с соответствующими TypedArray и указание размеров в параметрах shape.


Подготовка данных для ONNX Runtime Web

  1. Создание входного тензора Для передачи данных модели необходимо создать объект ort.Tensor с указанием:

    • типа данных (type), например 'float32' или 'int64',
    • формы (dims), определяющей размерность тензора,
    • самих данных (data) в виде подходящего массива (Float32Array, Int32Array, BigInt64Array, Uint8Array и т.д.).
  2. Примеры создания тензоров

    // float32
    const inputTensor = new ort.Tensor('float32', new Float32Array([1.0, 2.0, 3.0]), [3]);
    
    // int64
    const indices = new BigInt64Array([1n, 2n, 3n]);
    const indexTensor = new ort.Tensor('int64', indices, [3]);
    
    // string
    const stringTensor = new ort.Tensor('string', ['apple', 'banana'], [2]);
  3. Особенности совместимости

    • Для float16 в браузере используется конвертация через Float32Array с последующим снижением точности.
    • Типы int64 требуют поддержки BigInt в среде выполнения.
    • Строковые данные должны быть корректно закодированы UTF-8 для предотвращения ошибок десериализации.

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

Тип данных напрямую влияет на производительность модели. Использование float32 обеспечивает максимально оптимизированные вычисления на GPU и WebAssembly. Квантованные типы (int8, int32) уменьшают нагрузку на память и ускоряют выполнение, но требуют соответствующей калибровки модели. Работа со строками и int64 может быть медленнее, особенно при больших объемах данных, из-за необходимости дополнительной сериализации и десериализации.


Рекомендации по выбору типа данных

  • float32 — для всех основных операций с изображениями, аудио и непрерывными признаками.
  • int64 — для токенов текста, индексов и идентификаторов.
  • string — для текстовых входов и меток.
  • float16 и int8 — для оптимизации скорости и памяти при квантованных моделях.
  • bool — для бинарных признаков и масок.

Корректный выбор типа данных критически важен для стабильного выполнения модели и предотвращения ошибок при работе с ORT Web.