Частичная загрузка и горячая замена модели

Keras.js предоставляет возможность загружать модели в формате Keras (HDF5 или JSON с весами в бинарном формате) прямо в браузере, используя JavaScript. Это позволяет выполнять инференс без серверной поддержки, что особенно полезно для интерактивных приложений с нейронными сетями. Однако полная загрузка больших моделей может быть ресурсозатратной. Для решения этой задачи применяется частичная загрузка модели.

Принцип работы

Частичная загрузка позволяет подгружать только необходимые слои или веса модели. Keras.js реализует это через параметр loadLayers при создании экземпляра модели. Слои модели перечисляются по именам, что дает возможность:

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

Пример структуры частичной загрузки:

import KerasJS from 'keras-js';

const model = new KerasJS.Model({
  filepath: 'model.json',
  gpu: true,
  loadLayers: ['conv2d_1', 'dense_1']
});

model.ready()
  .then(() => {
    console.log('Выбранные слои загружены');
  })
  .catch(err => console.error(err));

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

Тонкости использования

  • Имена слоев должны точно соответствовать именам в исходной модели Keras. Любая ошибка приведет к сбою загрузки.
  • Частичная загрузка не поддерживает автоматическую инициализацию зависимых слоев. Если загружаются промежуточные слои, следует учитывать порядок их использования.
  • Поддержка форматов весов: Keras.js работает с бинарным форматом .bin для весов. Для частичной загрузки необходимо отдельно сгенерировать бинарные веса для выбранных слоев с помощью Python-скрипта.

Горячая замена модели

Горячая замена модели — это возможность менять модель в браузере во время работы приложения без перезагрузки страницы. В Keras.js это реализуется через повторное создание объекта Model и его подгрузку.

Основной подход

  1. Загружается исходная модель.
  2. Выполняется инференс на входных данных.
  3. При необходимости загружается новая модель, которая заменяет старую.

Пример:

import KerasJS from 'keras-js';

let currentModel = new KerasJS.Model({ filepath: 'model_v1.json', gpu: true });

currentModel.ready()
  .then(() => currentModel.predict({ input_1: new Float32Array([0,1,2]) }))
  .then(output => {
    console.log('Выход старой модели:', output);

    // Горячая замена
    currentModel = new KerasJS.Model({ filepath: 'model_v2.json', gpu: true });
    return currentModel.ready();
  })
  .then(() => currentModel.predict({ input_1: new Float32Array([0,1,2]) }))
  .then(output => console.log('Выход новой модели:', output))
  .catch(err => console.error(err));

Особенности реализации

  • Асинхронная загрузка: Подгрузка новой модели выполняется асинхронно, что исключает блокировку интерфейса.
  • Сброс кэша: При замене модели старые веса и конфигурация удаляются из памяти, что предотвращает утечки.
  • Сохраняются интерфейсы ввода/вывода: Если новая модель использует те же входные и выходные тензоры, интеграция с существующим кодом происходит без изменений.

Практические рекомендации

  • Для больших моделей комбинируется частичная загрузка и горячая замена. Сначала подгружается минимальный набор слоев для старта интерфейса, затем по мере необходимости докачиваются дополнительные веса.
  • Оптимизация под GPU: При горячей замене следует учитывать, что Keras.js выделяет память под WebGL. Старую модель нужно корректно удалять с помощью model = null и сборки мусора браузера.
  • Версионирование моделей: Использование версионированных JSON и бинарных файлов облегчает процесс горячей замены и отслеживание изменений в архитектуре.

Пример комбинированного подхода

import KerasJS from 'keras-js';

// Загружаем только базовые слои
let model = new KerasJS.Model({
  filepath: 'base_model.json',
  gpu: true,
  loadLayers: ['input', 'conv2d_1']
});

model.ready()
  .then(() => {
    console.log('Базовые слои загружены');
    return model.predict({ input_1: new Float32Array([1,2,3]) });
  })
  .then(output => {
    console.log('Результат инференса базовой модели:', output);

    // Горячая подгрузка расширенных слоев
    model = new KerasJS.Model({
      filepath: 'extended_model.json',
      gpu: true
    });
    return model.ready();
  })
  .then(() => model.predict({ input_1: new Float32Array([1,2,3]) }))
  .then(output => console.log('Результат инференса расширенной модели:', output))
  .catch(err => console.error(err));

В этом примере демонстрируется последовательная загрузка базовой модели с минимальным набором слоев и последующая горячая замена на полную версию модели. Такой подход снижает время ожидания и экономит ресурсы при работе в браузере.