Keras.js — это библиотека, позволяющая запускать предобученные модели Keras непосредственно в JavaScript, используя WebGL для ускорения вычислений. Основная особенность заключается в том, что одна и та же модель может быть выполнена как в браузере, так и в среде Node.js, но механизмы и производительность существенно различаются.
В браузере Keras.js использует WebGL для выполнения
операций на GPU через контекст canvas. Это позволяет
значительно ускорить матричные вычисления, так как большинство
современных устройств имеют аппаратное ускорение через видеокарту. В
Node.js WebGL отсутствует по умолчанию, поэтому библиотека переключается
на CPU-вычисления, используя JavaScript-реализацию
линейной алгебры. В некоторых случаях можно подключить внешние модули
вроде headless-gl, чтобы симулировать GPU через WebGL, но
это не дает полной производительности реального GPU в браузере.
Модель Keras.js загружается в формате JSON, а веса — в бинарных
файлах .bin. Для инициализации модели используется объект
KerasJS.Model:
const model = new KerasJS.Model({
filepath: 'model.json',
gpu: true // включение GPU-ускорения в браузере
});
await model.ready();
В Node.js опция gpu: true не всегда доступна, поэтому
вычисления чаще идут на CPU. Это напрямую отражается на времени
инференса: на крупных свёрточных сетях различия могут достигать
10–50 раз в пользу браузера с GPU.
Аппаратное ускорение В браузере Keras.js полностью использует WebGL для матричных операций и свёрток. В Node.js без GPU вычисления происходят в чистом JavaScript, что делает операции на больших тензорах медленными.
Асинхронность В браузере вычисления через WebGL не блокируют основной поток UI, благодаря чему интерфейс остаётся отзывчивым. В Node.js все операции по умолчанию синхронны, что может блокировать выполнение других задач в однотредовой среде.
Размер модели Большие модели требуют значительной памяти для хранения весов. В браузере лимиты памяти зависят от доступной GPU-памяти и настроек браузера. В Node.js память ограничена доступным объемом оперативной памяти процесса, что может вызвать проблемы при загрузке очень больших моделей.
Задержка при инициализации В браузере первичная загрузка модели может быть медленнее из-за необходимости подгрузки бинарных файлов через HTTP. В Node.js файлы обычно читаются с локального диска, что делает инициализацию быстрее, но последующий инференс на CPU медленнее.
| Среда | Ускорение GPU | Асинхронность | Поддержка больших моделей | Время инференса на CNN |
|---|---|---|---|---|
| Браузер | WebGL | Да | Ограничено GPU-памятью | Быстро (мс–с) |
| Node.js | CPU (или эмуляция) | Нет | Ограничено RAM | Медленно (с–мин) |
На практике для небольших моделей (например, многослойный перцептрон с десятками тысяч параметров) разница между Node.js и браузером минимальна. Для сложных свёрточных и рекуррентных сетей преимущество браузера с WebGL становится критичным.
headless-gl в сочетании с
gl-бэкендом Keras.js, что позволяет ускорить матричные
операции.