Профилирование модели: время инференса, потребление памяти

Профилирование нейронных сетей является критическим этапом при разработке веб-приложений с использованием Keras.js, так как позволяет оценить эффективность модели и оптимизировать её работу на клиентской стороне. Основными метриками являются время инференса и потребление памяти, которые определяют производительность и масштабируемость приложения.


Измерение времени инференса

В Keras.js инференс выполняется асинхронно через метод predict(). Время выполнения инференса зависит от нескольких факторов: архитектуры модели, размера входного тензора, возможностей устройства пользователя и выбранного движка (WebGL или CPU).

Пример измерения времени инференса:

const start = performance.now();
const output = await model.predict(inputTensor);
const end = performance.now();
console.log(`Время инференса: ${end - start} мс`);

Ключевые моменты:

  • Использование performance.now() обеспечивает высокую точность измерения времени.
  • Асинхронная функция predict() позволяет корректно учитывать задержки, связанные с WebGL.
  • Для более точного анализа рекомендуется усреднять время инференса по нескольким прогонкам, исключая первый прогон, который часто включает время инициализации GPU.
let totalTime = 0;
const runs = 10;

for (let i = 0; i < runs; i++) {
  const start = performance.now();
  await model.predict(inputTensor);
  const end = performance.now();
  totalTime += (end - start);
}

console.log(`Среднее время инференса: ${totalTime / runs} мс`);

Оценка потребления памяти

Потребление памяти в Keras.js определяется размером весов модели и промежуточных тензоров. Основными источниками потребления памяти являются:

  1. Массивы весов: загружаются в виде Float32Array и хранятся в GPU-памяти при использовании WebGL.
  2. Промежуточные активации: создаются для каждого слоя во время инференса.
  3. Временные буферы WebGL: используются движком для вычислений.

Keras.js не предоставляет встроенного профайлера памяти, поэтому анализ проводится через мониторинг:

  • Для браузеров с WebGL можно использовать расширение Chrome DevTools:

    • Вкладка MemoryHeap snapshot позволяет отследить выделение массивов Float32Array.
  • Для динамического контроля создаются функции, измеряющие объём активных тензоров:

function countTensors(model) {
  let total = 0;
  model.layers.forEach(layer => {
    if (layer.output != null) {
      total += layer.output.size;
    }
  });
  return total * 4; // Float32 = 4 байта
}

console.log(`Примерное потребление памяти активаций: ${countTensors(model)} байт`);

Ключевые моменты:

  • Каждое значение в Float32Array занимает 4 байта.
  • Потребление памяти сильно зависит от размера батча и количества слоев.
  • Неиспользуемые тензоры рекомендуется освобождать через dispose().
output.dispose();
inputTensor.dispose();

Оптимизация времени инференса и памяти

  1. Выбор движка:

    • WebGL обеспечивает аппаратное ускорение на GPU и ускоряет матричные операции.
    • CPU может быть более предсказуемым для маленьких моделей, но медленнее на больших тензорах.
  2. Уменьшение размера батча:

    • Снижение батча уменьшает потребление памяти, но может увеличить суммарное время инференса для полного набора данных.
  3. Удаление промежуточных тензоров:

    • Явное использование dispose() позволяет предотвратить накопление ненужных объектов в памяти.
  4. Модели меньшего размера:

    • Использование слоёв с меньшим числом нейронов и весов уменьшает объём памяти.
    • Квантизация весов и упрощение архитектуры ускоряют инференс.

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

  • Перед загрузкой модели рекомендуется проверить размер файлов весов и подготовить их в бинарном формате .bin для быстрого чтения.
  • Время первого прогонка predict() часто значительно больше последующих из-за инициализации WebGL. Для анализа производительности его лучше исключать.
  • При разработке для мобильных устройств критически важно отслеживать и оптимизировать использование памяти, так как браузеры часто убивают вкладки при превышении лимита.

Инструменты профилирования

  • Chrome DevTools Performance: измерение времени рендеринга и инференса.
  • WebGL Inspector: анализ использования GPU и временных буферов.
  • JavaScript Memory API: оценка объёма выделяемой памяти и сборки мусора.

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


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