Горячий и холодный старт: первый вызов и последующие

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


Инициализация модели и холодный старт

Холодный старт — это процесс первой загрузки модели и создания сессии в ORT Web. Этот этап включает несколько ключевых шагов:

  1. Загрузка модели Модель ONNX загружается из локального файла, URL или ArrayBuffer. Важно учитывать размер модели, так как при больших весах загрузка может занимать заметное время.

    import * as ort from 'onnxruntime-web';
    
    const session = await ort.InferenceSession.create('model.onnx');
  2. Компиляция графа После загрузки происходит разбор графа модели, подготовка операторов и оптимизация выполнения. На этом этапе создаются внутренние структуры данных для ускорения последующих вызовов.

  3. Выделение памяти под входные и выходные тензоры Для каждого входа и выхода модели ORT Web резервирует буферы памяти. На холодном старте это создается впервые, что влияет на задержку первого инференса.

Ключевой момент: первый вызов модели после создания сессии обычно медленнее последующих из-за необходимости выполнения всех этих операций.


Горячий старт и повторные вызовы

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

  1. Подготовка входных данных Входные тензоры создаются или переиспользуются из существующих буферов. Использование typed arrays и переиспользование памяти снижает нагрузку на сборщик мусора.

    const inputTensor = new ort.Tensor('float32', inputData, [1, 3, 224, 224]);
    const feeds = { input: inputTensor };
  2. Выполнение инференса Выполнение модели происходит без повторной компиляции графа. Это минимизирует задержку и позволяет использовать ORT Web для потоковой обработки данных.

    const results = await session.run(feeds);
    const output = results.output;

Оптимизация горячего старта:

  • Переиспользование тензоров: Для повторных инференсов можно выделять буферы один раз и заполнять их новыми данными, избегая создания новых объектов.

  • Асинхронная подготовка: Параллельная подготовка данных для следующего инференса позволяет скрыть задержку и поддерживать высокую пропускную способность.

  • Выбор бэкенда: ORT Web поддерживает несколько движков выполнения: WebAssembly, WebGL, WebGPU. После холодного старта выбранный бэкенд обеспечивает стабильную производительность для горячего старта.


Влияние размера модели и структуры графа

Большие модели с глубокой структурой требуют больше времени на холодный старт. При этом горячий старт менее чувствителен к размеру, так как граф уже оптимизирован и скомпилирован.

Рекомендации по работе с большими моделями:

  • Использовать lazy loading, когда модель загружается по частям или только при необходимости.
  • Кэшировать сессии, если один и тот же граф используется многократно.
  • Для моделей с большим количеством ветвлений оптимизировать граф заранее в ONNX, чтобы уменьшить нагрузку на холодный старт.

Замеры производительности

Реальные замеры показывают, что первый инференс может быть в 3–5 раз медленнее последующих, особенно на мобильных устройствах. В веб-сценариях это особенно заметно при загрузке модели по сети.

Пример замеров:

Тип старта Время (мс)
Холодный старт 1200
Горячий старт 250

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


Практическая стратегия

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

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