Батчинг запросов для повышения пропускной способности

Основы батчинга

Батчинг (batching) в контексте Keras.js — это объединение нескольких входных данных в один пакет (batch) для одновременной обработки нейронной сетью. Такой подход позволяет существенно повысить пропускную способность приложения и уменьшить накладные расходы на каждый отдельный вызов модели.

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

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

  • Размер батча влияет на скорость и использование памяти.
  • Большие батчи ускоряют вычисления, но требуют больше оперативной памяти.
  • Малые батчи позволяют сохранять отзывчивость интерфейса, но пропускная способность ниже.

Подготовка входных данных

В Keras.js входные данные должны быть представлены в виде массивов или TypedArray (Float32Array). Для батчинга необходимо:

  1. Привести все входные примеры к одинаковой размерности.
  2. Объединить их в одном массиве с добавлением дополнительной размерности, соответствующей размеру батча.

Пример для изображений размером 28×28 пикселей:

// Допустим, есть 3 изображения
let image1 = new Float32Array(28 * 28);
let image2 = new Float32Array(28 * 28);
let image3 = new Float32Array(28 * 28);

// Создание батча размером 3
let batch = new Float32Array(3 * 28 * 28);
batch.set(image1, 0);
batch.set(image2, 28 * 28);
batch.set(image3, 28 * 28 * 2);

В этом примере первый индекс соответствует номеру примера в батче, а последующие — пространственным координатам.

Передача батча в модель

После подготовки батча необходимо передать его в Keras.js для предсказания. В библиотеке используется метод predict, который принимает массив данных с размерностью [batchSize, ...inputShape].

const model = new KerasJS.Model({
  filepath: 'model.bin',
  gpu: true
});

model.ready().then(() => {
  model.predict({ input: batch }).then(output => {
    console.log(output);
  });
});

Важно отметить, что input должен иметь строго соответствующую размерность. Например, если модель ожидает [batchSize, 28, 28, 1], то необходимо добавить дополнительное измерение для каналов:

let batchWithChannels = new Float32Array(3 * 28 * 28 * 1);

Оптимизация размера батча

Размер батча следует подбирать экспериментально. Основные критерии:

  • Используемая память GPU: если батч слишком большой, WebGL может выдать ошибку из-за переполнения памяти.
  • Время отклика: для интерактивных приложений слишком большие батчи приводят к заметной задержке.
  • Пропускная способность: средний размер батча от 16 до 64 часто обеспечивает оптимальный баланс.

Асинхронная обработка батчей

Keras.js поддерживает асинхронное предсказание. Это позволяет создавать очередь батчей и обрабатывать их по мере готовности:

let batchQueue = [];

function enqueueBatch(batch) {
  batchQueue.push(batch);
  if (batchQueue.length === 1) processQueue();
}

function processQueue() {
  if (batchQueue.length === 0) return;
  const currentBatch = batchQueue[0];
  model.predict({ input: currentBatch }).then(output => {
    batchQueue.shift();
    processQueue();
    handleOutput(output);
  });
}

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

Объединение батчинга с параллелизмом

Для дальнейшего ускорения можно комбинировать батчи с веб-воркерами. Каждый воркер формирует свой батч и отправляет его в модель. Основная страница собирает результаты:

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

Контроль качества предсказаний при батчинге

При обработке батчей необходимо убедиться, что порядок данных сохраняется. Неправильное формирование батча может привести к смещению соответствий вход–выход. Для этого:

  • Индексы входных данных хранятся в массиве.
  • Выходные данные после предсказания сопоставляются с исходными примерами через индексы.
let indices = [5, 2, 7]; // порядок примеров в батче
model.predict({ input: batch }).then(output => {
  output.forEach((pred, i) => {
    const originalIndex = indices[i];
    assignResult(originalIndex, pred);
  });
});

Выводы по батчингу

  • Батчинг позволяет обрабатывать несколько примеров одновременно, снижая накладные расходы на каждый вызов модели.
  • Размер батча влияет на скорость, использование памяти и отклик интерфейса.
  • Асинхронная обработка батчей и комбинация с веб-воркерами повышает пропускную способность в браузере.
  • Контроль порядка входных данных критичен для корректности предсказаний.

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