Рекомендательные системы: матричная факторизация

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

ORT Web поддерживает несколько движков выполнения: WebAssembly (WASM) и WebGPU, что позволяет адаптироваться под возможности устройства пользователя. WASM обеспечивает совместимость с большинством браузеров, WebGPU — ускорение на GPU современных устройств, включая мобильные.

Инициализация среды выполнения

Для работы с ONNX Runtime Web необходимо создать сессию, загрузив модель и указав движок выполнения:

import * as ort from 'onnxruntime-web';

async function initSession(modelUrl) {
  const session = await ort.InferenceSession.create(modelUrl, {
    executionProviders: ['wasm'], // или 'webgpu'
    graphOptimizationLevel: 'all'
  });
  return session;
}

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

  • executionProviders задает используемый движок.
  • graphOptimizationLevel позволяет включить оптимизации для ускорения вывода модели.
  • Сессия сохраняет состояние модели и используется для всех последующих вызовов инференса.

Подготовка данных для инференса

Матричная факторизация в рекомендательных системах предполагает представление пользовательских и товарных признаков в виде матриц латентных факторов. Для ORT Web данные должны быть представлены в виде тензоров ONNX:

import * as ort from 'onnxruntime-web';

const userVector = new Float32Array([0.1, 0.3, 0.7]); // пример вектора пользователя
const itemVector = new Float32Array([0.5, 0.2, 0.9]); // пример вектора товара

const userTensor = new ort.Tensor('float32', userVector, [1, 3]);
const itemTensor = new ort.Tensor('float32', itemVector, [1, 3]);

Обратите внимание:

  • Тип данных тензора должен соответствовать типу, ожидаемому моделью (float32, int32 и т.д.).
  • Форма тензора ([1, 3]) отражает размерность входного слоя модели.

Выполнение инференса

Инференс в ORT Web выполняется асинхронно через метод run с передачей словаря входных тензоров:

async function predictRating(session, userTensor, itemTensor) {
  const feeds = {
    user_input: userTensor,
    item_input: itemTensor
  };
  const results = await session.run(feeds);
  return results['rating_output'].data[0];
}

Важные моменты:

  • Ключи словаря feeds должны совпадать с именами входов модели.
  • results содержит словарь выходов модели.
  • Доступ к данным выходного тензора осуществляется через свойство .data.

Оптимизация работы с множественными пользователями и товарами

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

const userBatch = new Float32Array([/* ...данные пользователей... */]);
const itemBatch = new Float32Array([/* ...данные товаров... */]);

const userTensorBatch = new ort.Tensor('float32', userBatch, [batchSize, latentDim]);
const itemTensorBatch = new ort.Tensor('float32', itemBatch, [batchSize, latentDim]);

const feeds = {
  user_input: userTensorBatch,
  item_input: itemTensorBatch
};

const results = await session.run(feeds);

Преимущества пакетной обработки:

  • Снижение накладных расходов на вызовы инференса.
  • Возможность эффективно использовать GPU через WebGPU.
  • Уменьшение времени отклика при рекомендательных расчетах для десятков или сотен пользователей одновременно.

Использование WebGPU для ускорения

ORT Web позволяет использовать WebGPU для значительного ускорения матричных операций:

const session = await ort.InferenceSession.create(modelUrl, {
  executionProviders: ['webgpu'],
  graphOptimizationLevel: 'all'
});

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

  • Поддерживается в последних версиях Chrome, Edge и Safari.
  • Оптимизирован для матричных умножений, используемых в латентных факторных моделях.
  • Требует инициализации устройств и адаптеров GPU браузера, но ORT Web выполняет это автоматически.

Обработка ошибок и отладка

При работе с ORT Web важно учитывать возможные ошибки:

  • Несоответствие формы входного тензора.
  • Неподдерживаемые типы данных (float64 не поддерживается в WebAssembly).
  • Ограничения WebGPU на размер буфера.

Для отладки можно использовать логирование сессии:

ort.env.wasm.wasmPaths = '/path/to/ort-wasm/';
ort.env.wasm.simd = true;
ort.env.wasm.threading = true;

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

Интеграция с фронтендом

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

  • Асинхронное выполнение без блокировки UI.
  • Легкую интеграцию с React, Vue или чистым JavaScript.
  • Минимальный размер зависимостей — только onnxruntime-web.

Поддержка обновляемых моделей

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

async function updateModel(newModelUrl) {
  session = await ort.InferenceSession.create(newModelUrl, {executionProviders: ['wasm']});
}

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