Feeds и fetches: передача входных данных и выбор выходов

ONNX Runtime Web (ORT Web) предоставляет высокопроизводительное выполнение моделей машинного обучения прямо в браузере с использованием JavaScript. Ключевым аспектом работы с моделями является правильная организация входных данных (feeds) и выбор выходов (fetches). Понимание этих понятий необходимо для эффективного взаимодействия с любой моделью ONNX.


Структура feeds

Feeds — это объект, содержащий пары ключ-значение, где ключом является имя входного тензора модели, а значением — данные для вычисления. В ORT Web данные обычно представляются объектом OrtValue или обычными массивами/типизированными массивами, которые автоматически преобразуются в OrtValue.

const feeds = {
  "input_tensor_name": new Float32Array([0.1, 0.2, 0.3, 0.4])
};

Основные моменты при формировании feeds:

  • Имена входов должны точно соответствовать именам, указанным в модели. Ошибка в написании приведет к исключению на этапе исполнения.
  • Тип данных должен совпадать с типом входного тензора в модели. ORT Web поддерживает float32, int32, bool и string.
  • Форма (shape) данных должна соответствовать ожидаемой размерности тензора. Например, если модель ожидает [1, 3, 224, 224], входной массив должен быть размером 1 × 3 × 224 × 224.

Пример создания 4D-тензора для модели обработки изображений:

const imageData = new Float32Array(1 * 3 * 224 * 224); // 1 изображение, 3 канала, 224x224
const feeds = {
  "input": imageData
};

Формирование fetches

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

  • Массив имен выходов: возвращаются только указанные тензоры.
  • Оставление пустым (undefined или null): возвращаются все выходы модели.

Пример:

const fetches = ["output_tensor_name"];

Если не требуется фильтрация, можно опустить:

const fetches = undefined; // Вернутся все выходы

Передача данных в сессию

ORT Web использует объект InferenceSession для выполнения модели. Метод run принимает feeds и опционально fetches. Пример:

import * as ort from 'onnxruntime-web';

async function runModel(session, feeds, fetches) {
  const results = await session.run(feeds, fetches);
  return results;
}

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

  • Метод run асинхронный и возвращает объект, где ключи соответствуют именам выходных тензоров.
  • Если указаны несколько fetches, результат будет содержать только эти тензоры.
  • Тип данных в выходе — TypedArray или OrtValue, в зависимости от конфигурации.

Работа с несколькими входами и выходами

Модели могут иметь несколько входных тензоров. Feeds тогда строятся как объект с несколькими ключами:

const feeds = {
  "input1": new Float32Array([0.1, 0.2]),
  "input2": new Float32Array([0.3, 0.4])
};

Fetches также могут содержать несколько элементов:

const fetches = ["output1", "output2"];

В результате session.run вернет объект:

{
  "output1": Float32Array([...]),
  "output2": Float32Array([...])
}

Конвертация данных между формами

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

  • Массивы → Float32Array / Int32Array:
const data = [1, 2, 3, 4];
const typedData = new Float32Array(data);
  • Изображения → тензоры: для моделей компьютерного зрения обычно требуется нормализация и изменение формы [H, W, C] → [N, C, H, W].
function imageToTensor(image) {
  const width = image.width;
  const height = image.height;
  const data = new Float32Array(width * height * 3);
  // заполнение data пикселями RGB
  return data;
}

Важные нюансы

  1. Совпадение имен и форматов критично для успешного запуска модели. Любая несовпадение вызывает OrtError.
  2. Типизация: ORT Web не производит неявное преобразование типов. Например, Int32Array не может быть использован для float32 входа.
  3. Асинхронность: все операции session.run выполняются асинхронно, что позволяет интегрировать их с веб-приложениями без блокировки UI.
  4. Оптимизация памяти: при работе с большими массивами стоит использовать OrtValue с явным управлением памятью, чтобы избежать лишнего копирования данных.

Примеры практического использования

Пример с несколькими входами и выходами:

const feeds = {
  "input_ids": new Int32Array([101, 102, 103]),
  "attention_mask": new Int32Array([1, 1, 1])
};

const fetches = ["logits", "hidden_states"];

const results = await session.run(feeds, fetches);

console.log(results.logits);
console.log(results.hidden_states);

Пример с изображением и нормализацией:

const imageTensor = imageToTensor(imageElement);
const feeds = { "input": imageTensor };
const results = await session.run(feeds, ["output"]);

В обоих случаях правильное формирование feeds и fetches позволяет эффективно использовать модель без ошибок и излишних вычислительных затрат.


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