Размещение wasm-ассетов: публичная папка vs CDN

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

Публичная папка проекта

Размещение WASM-ассетов в публичной папке приложения (/public или аналогичной) является наиболее прямым и часто используемым способом интеграции. Основные особенности:

  • Простота конфигурации. Файлы размещаются рядом с другими статическими ресурсами проекта. Для большинства сборщиков (Webpack, Vite, Parcel) достаточно скопировать WASM в папку public.
  • Контроль версий. Прямое хранение позволяет синхронизировать версии моделей и движка с конкретной версией приложения.
  • Быстрая локальная разработка. Файлы доступны сразу при запуске локального сервера, не требуется дополнительная настройка CORS или внешнего хостинга.

Недостатки публичного размещения:

  • Ограничения кэширования. Браузер будет кэшировать ассеты вместе с другими статическими файлами, что иногда усложняет управление версиями WASM при обновлениях.
  • Сетевые задержки при глобальной аудитории. Пользователи, находящиеся далеко от сервера, будут получать файлы с более высоким временем загрузки.
  • Увеличение размера приложения. WASM-файлы часто весят десятки мегабайт. Размещение их в публичной папке увеличивает общий размер раздаваемого приложения.

Использование CDN

Размещение WASM-ассетов на CDN (Content Delivery Network) позволяет эффективно доставлять файлы пользователям по всему миру. Основные преимущества:

  • Скорость и масштабируемость. CDN распределяет ассеты по географически распределённым узлам, минимизируя задержку загрузки.
  • Эффективное кэширование. Большинство CDN поддерживают автоматическое кэширование и управление версиями файлов, позволяя обновлять ассеты без необходимости полной пересборки приложения.
  • Разгрузка сервера приложения. Основной веб-сервер обслуживает только HTML/CSS/JS, а большие WASM-файлы отдаются CDN, снижая нагрузку.

Особенности работы с ORT Web через CDN:

  • Настройка пути к ассетам. Параметр wasmPaths при инициализации Ort.env должен указывать на URL CDN. Например:

    Ort.env.wasm.wasmPaths = "https://cdn.example.com/ort/";
  • CORS-политики. WASM-модули загружаются как обычные бинарные ресурсы, поэтому сервер CDN должен поддерживать CORS-заголовки Access-Control-Allow-Origin для домена приложения.

  • Версионирование файлов. Для стабильной работы рекомендуется включать хэш или номер версии в имя файла, например: ort-wasm-v1.15.0.wasm. Это предотвращает ошибки при обновлении ORT.

Сравнение подходов

Критерий Публичная папка CDN
Простота настройки Очень высокая Требует настройки URL и CORS
Контроль версий Прямой Через имена файлов или версионирование URL
Время загрузки для глобальных пользователей Среднее Минимальное
Масштабируемость Ограничена сервером Высокая, благодаря сети CDN
Кэширование Браузерное CDN + браузерное
Размер проекта Увеличивает сборку Не влияет на основной проект

Рекомендации по выбору

  • Для локальной разработки и небольших приложений достаточно размещения WASM в публичной папке. Это снижает сложность конфигурации и позволяет быстро тестировать модели.
  • Для производственных проектов с глобальной аудиторией предпочтительно использование CDN. Это ускоряет загрузку, уменьшает нагрузку на основной сервер и обеспечивает более гибкое управление версиями файлов.
  • Возможна комбинация подходов: локальная папка для разработки, CDN для production. В коде можно использовать условное определение пути к WASM-модулям в зависимости от окружения.

Практические нюансы

  1. Совместимость с различными браузерами. Некоторые старые версии браузеров могут некорректно обрабатывать WASM с CORS, поэтому тестирование важно.
  2. Поддержка нескольких движков. ORT Web поддерживает wasm и webgl. Для каждого движка можно настроить отдельный путь к ассетам.
  3. Асинхронная загрузка. WASM-файлы загружаются асинхронно. Использование Ort.InferenceSession.create с указанием wasmPaths позволяет корректно управлять загрузкой и предотвращать блокировку UI.

Размещение WASM-ассетов — ключевой фактор производительности и удобства разработки с ONNX Runtime Web. Выбор между публичной папкой и CDN зависит от масштаба проекта, требований к скорости загрузки и стратегии кэширования. Правильная организация ассетов позволяет минимизировать задержки и обеспечить стабильное выполнение моделей на клиентской стороне.