javascript42
Главная
Все учебники
Блог
Учебник ONNX Runtime Web
Введение в ONNX и ONNX Runtime Web
Что такое ONNX: история, цели, экосистема
Место ONNX Runtime Web среди других инструментов инференса в браузере
Архитектура ONNX Runtime Web: WebAssembly и WebGL бэкенды
Поддерживаемые браузеры, платформы и ограничения среды
Установка и первый запуск: npm, CDN, сборщики
Формат ONNX
Структура .onnx файла: protobuf, граф, узлы, тензоры
Типы данных: float32, int64, string и другие
Опсеты и версионирование операторов
Атрибуты узлов и метаданные модели
Инструменты для просмотра и отладки моделей: Netron и onnx Python API
Получение и подготовка моделей
Источники готовых ONNX-моделей: ONNX Model Zoo, Hugging Face, Timm
Экспорт модели из PyTorch через torch.onnx.export
Экспорт модели из TensorFlow и Keras
Экспорт из scikit-learn через sklearn-onnx
Проверка модели: onnx.checker и shape inference
Оптимизация перед деплоем: onnxoptimizer и onnxsim
Квантование модели: статическое и динамическое, int8
Обрезка графа и удаление лишних узлов
Изменение входных размерностей: динамические оси
Основы работы с ONNX Runtime Web
InferenceSession: создание, опции, жизненный цикл
Загрузка модели: из URL, ArrayBuffer, File API, Base64
Метаданные сессии: inputNames, outputNames, inputMetadata
Запуск инференса: run() и его опции
Feeds и fetches: передача входных данных и выбор выходов
Обработка возвращаемых результатов
Освобождение ресурсов и управление памятью
Тензоры в ONNX Runtime Web
Класс Tensor: конструктор, поля type, data, dims
Типизированные массивы JavaScript и их соответствие типам ONNX
Создание тензора из Float32Array, Int32Array, BigInt64Array
Создание тензора из обычного Array и вложенных массивов
Создание тензора из ImageData, HTMLImageElement, ImageBitmap
Тензоры с нулевой размерностью и скалярные тензоры
Слайсинг, изменение формы и транспонирование на стороне JS
Нормализация изображений: mean, std, каналы, порядок HWC/CHW
Батчирование: формирование батча из нескольких входов
Бэкенды и провайдеры выполнения
Обзор провайдеров: wasm, webgl, webgpu, webnn
WebAssembly бэкенд: принцип работы, SIMD, многопоточность
Настройка wasm-бэкенда: numThreads, simd, proxy
SharedArrayBuffer и заголовки COOP/COEP: почему они нужны
WebGL бэкенд: текстуры, шейдеры, ограничения точности
Настройка webgl-бэкенда: contextId, powerPreference
WebGPU бэкенд: отличия от WebGL, compute shaders, статус поддержки
WebNN бэкенд: нативное ускорение в браузере, статус стандарта
Стратегия выбора провайдера и fallback-цепочки
Профилирование провайдеров и сравнение производительности
Конфигурация и тонкая настройка
Глобальные настройки env: флаги, пути к wasm-файлам
Настройка путей к ассетам при кастомных сборках
Опции сессии: graphOptimizationLevel, executionMode
Параллельное выполнение: inter- и intra-op parallelism
Управление памятью: arenaExtendStrategy, memPatternEnabled
Флаги логирования и уровни severity
Использование кастомных операторов
Prefill сессий и переиспользование между вызовами
Предобработка и постобработка данных
Работа с изображениями: Canvas API, OffscreenCanvas
Изменение размера изображений без потерь качества
Цветовые пространства: RGB, BGR, Grayscale, YCbCr
Нормализация и денормализация значений пикселей
Предобработка текста: токенизация, padding, attention mask
Работа с числовыми данными: стандартизация, one-hot encoding
Постобработка классификации: softmax, argmax, top-k
Постобработка детекции объектов: NMS, декодирование якорей
Постобработка сегментации: разбор масок и полигонов
Постобработка генерации токенов и beam search в JS
Интеграция в браузерное окружение
Запуск инференса в основном потоке и его последствия
Перенос вычислений в Web Worker
Передача данных между потоками: Transferable, SharedArrayBuffer
Использование нескольких воркеров и очереди задач
Инференс в Service Worker и офлайн-сценарии
Кэширование моделей: Cache API и IndexedDB
Стриминг загрузки модели с прогрессом
Работа с File API и Drag & Drop для загрузки пользовательских моделей
Интеграция с WebRTC и MediaStream для инференса на видеопотоке
requestAnimationFrame и синхронизация инференса с рендером
Производительность и оптимизация
Профилирование времени инференса: Performance API, ORT profiling
Горячий и холодный старт: первый вызов и последующие
Минимизация копирования данных: zero-copy и разделяемая память
Выбор размера батча: компромисс между латентностью и пропускной способностью
Асинхронный инференс и конкурентные запросы
Оптимизация предобработки: избегание лишних аллокаций
Lazy loading и разбиение модели
Влияние квантования на скорость в браузере
Memory footprint: оценка и снижение потребления памяти
Тестирование производительности на разных устройствах и браузерах
Типичные задачи машинного обучения
Классификация изображений: ResNet, EfficientNet, MobileNet
Детекция объектов: YOLOv8, SSD, DETR
Семантическая и инстанс-сегментация
Оценка ключевых точек и pose estimation
Классификация и встраивание текста: BERT, DistilBERT
Генерация текста: GPT-2, небольшие языковые модели
Аудиоклассификация и обработка звука: Wav2Vec, Whisper tiny
Регрессия и табличные данные: деревья решений, линейные модели
Рекомендательные системы: матричная факторизация
Аномалия детекция и автоэнкодеры
Сборка и деплой
Webpack и настройка для ONNX Runtime Web
Vite: конфигурация, заголовки COOP/COEP через плагины
Rollup и esbuild: особенности бандлинга wasm
Next.js: серверные компоненты, dynamic import, заголовки
Размещение wasm-ассетов: публичная папка vs CDN
Content Security Policy и ONNX Runtime Web
Docker и nginx: правильные заголовки для SharedArrayBuffer
Деплой на Cloudflare Workers и ограничения среды
Измерение размера бандла и стратегии его уменьшения
Отладка и устранение ошибок
Типичные ошибки при загрузке модели и их причины
Несоответствие типов и форм тензоров
Ошибки операторов: неподдерживаемые опсеты и кастомные операции
Отладка NaN и Inf в выходных тензорах
Расхождение результатов между Python и браузером
Использование onnxruntime-node для отладки на сервере
Инструменты браузера: Memory, Performance, консольный вывод ORT
Верификация модели путём сравнения с эталонными выходами
Продвинутые техники
Динамические графы и условные операторы в ONNX
Модели с несколькими входами и несколькими выходами
Многоэтапный инференс и сцепление нескольких моделей
Инкрементальный инференс: KV-кэш и авторегрессионные модели
Трансформеры с attention mask переменной длины
Использование внешних данных: external_data в ONNX
Кастомные операторы на JavaScript
Операции с тензорами через ort.Tensor и ручной постпроцессинг сложных выходов
Работа с моделями в формате ONNX-ML
Безопасность и конфиденциальность
Выполнение инференса на стороне клиента как способ защиты данных
Ограничения браузерной песочницы и их значение для безопасности
Защита модели от извлечения и реверс-инжиниринга
Обфускация и шифрование весов модели
Угрозы при загрузке пользовательских .onnx файлов