ONNX Runtime Web предоставляет мощный инструмент для выполнения нейронных сетей в браузере с помощью JavaScript. Эффективное управление памятью и корректное освобождение ресурсов играют критически важную роль, особенно при работе с крупными моделями и многократных вызовах инференса.
Основной единицей работы с ONNX Runtime Web является
сессия (InferenceSession). Сессия
загружает модель, выделяет необходимые внутренние буферы и поддерживает
состояние для выполнения инференса.
import * as ort from 'onnxruntime-web';
const session = await ort.InferenceSession.create('model.onnx');
При завершении работы с сессией важно освободить ресурсы, чтобы избежать утечек памяти, особенно при создании множества сессий:
session.dispose();
Метод dispose() освобождает все внутренние буферы и
объекты, выделенные для работы модели, включая веса, промежуточные
тензоры и метаданные.
Ключевой момент: после вызова dispose()
попытка выполнить инференс через эту сессию вызовет ошибку.
В ONNX Runtime Web тензоры представлены объектами
Tensor, которые инкапсулируют данные в виде TypedArray
(Float32Array, Int32Array и др.). Каждый
тензор занимает память на JavaScript heap или в WebAssembly heap, если
используется WASM бэкенд.
const input = new ort.Tensor('float32', new Float32Array([1, 2, 3, 4]), [2, 2]);
После завершения работы с тензором:
input.data = null;
Это освобождает память, занимаемую массивом, если на него больше нет ссылок. Для массивов большого объема это критично, так как JavaScript не сразу очищает память без явного обнуления ссылок.
Важно учитывать:
ONNX Runtime Web в WASM-режиме использует собственный heap. Он не всегда синхронизируется с JavaScript сборщиком мусора напрямую. Это требует дополнительного внимания при:
Для оптимизации можно:
InferenceSession для всех
вызовов, чтобы повторно использовать внутренние буферы.ONNX Runtime Web поддерживает асинхронные операции инференса. Это важно для интерфейсов с пользовательскими событиями, где необходимо предотвращать блокировку UI.
При асинхронной работе необходимо учитывать:
const result = await session.run({ input: inputTensor });
// Использование результата
Object.values(result).forEach(tensor => tensor.data = null);
Здесь каждая ссылка на возвращаемый тензор очищается после использования. Если тензоры остаются в памяти, WebAssembly heap может постепенно увеличиваться, вызывая замедления и рост потребления ресурсов.
.data.dispose() для сессий:
После окончания работы с моделью.performance.memory (Chrome) или сторонние инструменты.Эти принципы позволяют обеспечить стабильную работу моделей, даже при интенсивном использовании ONNX Runtime Web на фронтенде.
При активации бэкенда WebGPU:
dispose()
на сессии и очистки всех тензоров.session.dispose(); // Освобождает также GPU буферы
При больших моделях с несколькими батчами инференса важно соблюдать строгий контроль всех буферов.
ONNX Runtime Web требует внимательного подхода к ресурсам:
Эти практики позволяют безопасно работать с крупными моделями, сохраняя производительность и контролируя использование ресурсов в браузере.