ONNX Runtime Web (ORT Web) предоставляет высокопроизводительное выполнение моделей машинного обучения прямо в браузере с использованием JavaScript. Ключевым аспектом работы с моделями является правильная организация входных данных (feeds) и выбор выходов (fetches). Понимание этих понятий необходимо для эффективного взаимодействия с любой моделью ONNX.
Feeds — это объект, содержащий пары ключ-значение,
где ключом является имя входного тензора модели, а значением — данные
для вычисления. В ORT Web данные обычно представляются объектом
OrtValue или обычными массивами/типизированными массивами,
которые автоматически преобразуются в OrtValue.
const feeds = {
"input_tensor_name": new Float32Array([0.1, 0.2, 0.3, 0.4])
};
Основные моменты при формировании feeds:
float32,
int32, bool и string.[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 определяют, какие выходные тензоры модели необходимо вернуть после выполнения. Это может быть:
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 асинхронный и возвращает объект, где ключи
соответствуют именам выходных тензоров.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. Примеры:
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;
}
OrtError.Int32Array не может быть
использован для float32 входа.session.run выполняются асинхронно, что позволяет
интегрировать их с веб-приложениями без блокировки UI.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 в вебе и позволяют максимально гибко управлять данными для вычислений, сохраняя контроль над ресурсами и типами данных.