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);
Преимущества пакетной обработки:
ORT Web позволяет использовать WebGPU для значительного ускорения матричных операций:
const session = await ort.InferenceSession.create(modelUrl, {
executionProviders: ['webgpu'],
graphOptimizationLevel: 'all'
});
Особенности WebGPU:
При работе с ORT Web важно учитывать возможные ошибки:
float64 не поддерживается
в WebAssembly).Для отладки можно использовать логирование сессии:
ort.env.wasm.wasmPaths = '/path/to/ort-wasm/';
ort.env.wasm.simd = true;
ort.env.wasm.threading = true;
Эти настройки активируют SIMD и многопоточность в WASM, что повышает производительность и позволяет выявлять узкие места.
В браузерном приложении инференс может выполняться при событиях интерфейса, например, при наведении на товар или при формировании списка рекомендаций. ORT Web обеспечивает:
onnxruntime-web.Для динамических рекомендательных систем модели можно обновлять на клиенте без перезагрузки страницы:
async function updateModel(newModelUrl) {
session = await ort.InferenceSession.create(newModelUrl, {executionProviders: ['wasm']});
}
Это позволяет внедрять новые пользовательские предпочтения и новые товары мгновенно, сохраняя высокую производительность.