Keras.js представляет собой библиотеку для выполнения моделей, обученных с использованием Keras, непосредственно в браузере с использованием WebGL. Основное преимущество подхода заключается в возможности инференса нейронных сетей на стороне клиента, что снижает нагрузку на сервер и обеспечивает мгновенную реакцию приложений.
Модели Keras.js загружаются в формате JSON и бинарных весов
(.bin), что позволяет браузеру полностью воспроизвести
структуру нейронной сети и выполнять вычисления.
const KerasJS = require('keras-js');
const model = new KerasJS.Model({
filepaths: {
model: 'model.json',
weights: 'model_weights.buf'
},
gpu: true
});
Ключевые моменты:
filepaths.model — путь к JSON-файлу, содержащему
архитектуру сети.filepaths.weights — бинарный файл весов,
экспортированных из Keras.gpu: true — использование WebGL для ускорения
вычислений.Перед тем как выполнять предсказания, модель необходимо
инициализировать. Метод model.ready() возвращает промис,
который завершается после полной загрузки и компиляции весов:
model.ready()
.then(() => {
console.log('Модель готова к инференсу');
})
.catch(err => {
console.error('Ошибка загрузки модели', err);
});
На этом этапе можно сразу подготовить входные данные в формате
TypedArray (например, Float32Array) с
правильной размерностью.
Для организации потоковой передачи данных в реальном времени используется WebSocket. Он позволяет клиенту отправлять данные на сервер или получать потоковые события, а Keras.js выполнять инференс без блокировки основного потока браузера.
const socket = new WebSocket('ws://localhost:8080');
socket.addEventListener('open', () => {
console.log('WebSocket соединение установлено');
});
socket.addEventListener('message', async (event) => {
const inputData = JSON.parse(event.data);
const inputTensor = new Float32Array(inputData);
try {
const output = await model.predict({ input: inputTensor });
socket.send(JSON.stringify(output));
} catch (err) {
console.error('Ошибка при предсказании', err);
}
});
Особенности подхода:
model.predict()
возвращает промис, поэтому возможна обработка данных без блокировки
интерфейса.При потоковой передаче данных может возникнуть накопление задач предсказания, если данные приходят быстрее, чем модель успевает их обрабатывать. Для этого удобно использовать очередь:
const queue = [];
let processing = false;
socket.addEventListener('message', (event) => {
queue.push(JSON.parse(event.data));
processQueue();
});
async function processQueue() {
if (processing || queue.length === 0) return;
processing = true;
const data = queue.shift();
const inputTensor = new Float32Array(data);
try {
const output = await model.predict({ input: inputTensor });
socket.send(JSON.stringify(output));
} catch (err) {
console.error('Ошибка предсказания', err);
} finally {
processing = false;
processQueue();
}
}
Такой подход гарантирует последовательную обработку входящих данных и предотвращает переполнение памяти.
Array в
TypedArray.gpu: true, иначе вычисления
на CPU могут заметно замедлить поток.Стриминг предсказаний через WebSocket с Keras.js позволяет создавать высокореактивные веб-приложения с машинным обучением прямо в браузере, сохраняя при этом производительность и отзывчивость интерфейса.