Загрузка модели: из URL, ArrayBuffer, File API, Base64

ONNX Runtime Web (ORT Web) предоставляет возможность выполнения моделей машинного обучения непосредственно в браузере с использованием JavaScript. Ключевой этап работы с ORT Web — загрузка модели. Библиотека поддерживает несколько способов загрузки: из URL, из ArrayBuffer, через File API и из строки Base64. Каждое из этих решений имеет свои особенности и сценарии применения.


Загрузка модели из URL

Использование URL является самым распространённым способом интеграции модели, особенно когда она размещена на сервере или CDN.

Пример загрузки:

import * as ort from 'onnxruntime-web';

async function loadModelFromURL(url) {
  const session = await ort.InferenceSession.create(url);
  return session;
}

Особенности:

  • Поддерживаются стандартные HTTP(S) URL.
  • Модель автоматически загружается в память браузера.
  • Если сервер поддерживает CORS, доступ к файлу модели будет разрешён.
  • Загрузка может быть асинхронной, что позволяет отображать индикаторы прогресса или обработку ошибок.

Загрузка модели из ArrayBuffer

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

Пример загрузки:

async function loadModelFromArrayBuffer(buffer) {
  const session = await ort.InferenceSession.create(buffer);
  return session;
}

// Использование Fetch API для получения ArrayBuffer
const response = await fetch('model.onnx');
const buffer = await response.arrayBuffer();
const session = await loadModelFromArrayBuffer(buffer);

Особенности:

  • Позволяет загружать модели из локальных ресурсов или полученных через API данных.
  • Подходит для приложений с динамическим выбором модели без необходимости перезагрузки страницы.
  • Возможна интеграция с системами кэширования для ускорения повторного использования.

Загрузка модели через File API

File API позволяет загружать модели, выбранные пользователем локально через <input type="file">. Это удобно для интерактивных приложений, где пользователь сам предоставляет модель.

Пример загрузки:

const inputElement = document.getElementById('fileInput');

inputElement.addEventListener('change', async (event) => {
  const file = event.target.files[0];
  const arrayBuffer = await file.arrayBuffer();
  const session = await ort.InferenceSession.create(arrayBuffer);
});

Особенности:

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

Загрузка модели из Base64

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

Пример загрузки:

function base64ToArrayBuffer(base64) {
  const binaryString = atob(base64);
  const len = binaryString.length;
  const bytes = new Uint8Array(len);
  for (let i = 0; i < len; i++) {
    bytes[i] = binaryString.charCodeAt(i);
  }
  return bytes.buffer;
}

async function loadModelFromBase64(base64) {
  const buffer = base64ToArrayBuffer(base64);
  const session = await ort.InferenceSession.create(buffer);
  return session;
}

Особенности:

  • Удобно для интеграции моделей непосредственно в фронтенд.
  • Подходит для случаев, когда нет возможности использовать отдельные файлы.
  • Преобразование Base64 в ArrayBuffer может занимать больше времени и памяти при больших моделях.

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

Метод Основное применение Преимущества Недостатки
URL Размещение на сервере или CDN Простота, поддержка CORS Требуется доступ к серверу
ArrayBuffer Динамическая загрузка, кэширование Гибкость, совместимость с IndexedDB Необходима предварительная загрузка
File API Пользовательские локальные файлы Безопасно, интерактивно Требуется пользовательский ввод
Base64 Встраивание в код или JSON Удобно для фронтенда, легко сериализуется Высокие затраты памяти и конвертация

Рекомендации по использованию

  • Для публичных моделей на сервере предпочтителен URL.
  • Для динамически загружаемых моделей или из кэша — ArrayBuffer.
  • Для интерактивных приложений с пользовательскими файлами — File API.
  • Для полностью автономных фронтенд-приложений с небольшими моделями — Base64.

Каждый способ интеграции требует асинхронного подхода и правильного управления сессией ONNX Runtime Web, что обеспечивает стабильность и производительность при выполнении моделей в браузере.