Батчинг (batching) в контексте Keras.js — это объединение нескольких входных данных в один пакет (batch) для одновременной обработки нейронной сетью. Такой подход позволяет существенно повысить пропускную способность приложения и уменьшить накладные расходы на каждый отдельный вызов модели.
В Keras.js батчинг особенно важен при работе с моделями в браузере, так как каждый вызов предсказания связан с передачей данных в WebGL, что может стать узким местом. Обработка данных пакетами снижает количество вызовов и эффективно использует графический ускоритель.
Ключевые моменты:
В Keras.js входные данные должны быть представлены в виде массивов или TypedArray (Float32Array). Для батчинга необходимо:
Пример для изображений размером 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);
Размер батча следует подбирать экспериментально. Основные критерии:
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 значительно повышает производительность веб-приложений с нейронными сетями, делая обработку больших потоков данных практически реальной в браузере.