Экспресс-сервер с инференсом модели

Keras.js представляет собой библиотеку для выполнения моделей Keras непосредственно в браузере на базе JavaScript. Она позволяет загружать заранее обученные модели и выполнять инференс без необходимости использования серверной инфраструктуры на Python. Для работы требуется подключение библиотеки через npm или прямое подключение скрипта:

// Через npm
npm install keras-js

// Через подключение скрипта

После подключения создаётся объект модели, который управляет загрузкой весов и вычислением предсказаний.

const model = new KerasJS.Model({
  filepaths: {
    model: 'model.json',
    weights: 'model_weights.buf',
    metadata: 'model_metadata.json'
  },
  gpu: true
});

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

  • filepaths.model — путь к JSON-файлу модели, экспортированной из Keras.
  • filepaths.weights — бинарные веса модели.
  • filepaths.metadata — метаданные, включающие информацию о слоях и формате входных данных.
  • gpu: true — использование WebGL для ускорения вычислений на GPU браузера.

Загрузка модели и подготовка к инференсу

После создания экземпляра модели необходимо загрузить все файлы модели в память:

model.ready()
  .then(() => console.log('Модель готова к инференсу'))
  .catch(err => console.error('Ошибка загрузки модели:', err));

Для работы с Keras.js входные данные должны быть в формате Float32Array. Если модель ожидает тензор размерности (batch, height, width, channels), необходимо правильно сформировать массив входных значений.

const inputData = new Float32Array([/* данные изображения или другого источника */]);

const input = {
  input_1: inputData
};

Выполнение инференса

Инференс выполняется через метод predict. Результатом является объект, где ключи соответствуют выходным слоям модели.

model.predict(input)
  .then(outputData => {
    console.log('Результат предсказания:', outputData);
  })
  .catch(err => console.error('Ошибка инференса:', err));

Особенности работы:

  • Массивы должны соответствовать ожидаемым формам (shape) входных слоёв.
  • При работе с GPU производительность значительно выше, чем на CPU.
  • Для больших моделей рекомендуется заранее проверять размерность входных данных, чтобы избежать ошибок.

Обработка изображений и нормализация

При инференсе моделей для изображений часто требуется масштабирование и нормализация входных данных:

function preprocessImage(imageData, width, height) {
  const input = new Float32Array(width * height * 3);
  for (let i = 0; i < width * height * 3; i++) {
    input[i] = imageData[i] / 255.0; // нормализация пикселей от 0 до 1
  }
  return input;
}

Подготовленный массив затем передаётся в метод predict для получения результатов.

Интеграция с экспресс-сервером

Для создания сервера инференса на Node.js используется библиотека express. Сервер принимает данные от клиента, выполняет инференс и возвращает результат:

const express = require('express');
const app = express();
app.use(express.json());

app.post('/predict', async (req, res) => {
  try {
    const inputData = req.body.data; // ожидается массив чисел
    const input = { input_1: new Float32Array(inputData) };
    const output = await model.predict(input);
    res.json({ result: output });
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

app.listen(3000, () => console.log('Сервер запущен на порту 3000'));

Важные аспекты:

  • Обработка JSON-данных с тела запроса через express.json().
  • Преобразование массивов чисел в Float32Array перед инференсом.
  • Асинхронное ожидание метода predict с использованием await для корректного завершения вычислений.

Оптимизация производительности

  1. Использование GPU через WebGL: позволяет ускорить работу модели в браузере.
  2. Минимизация размеров модели: удаление лишних слоёв и конвертация весов в компактный формат.
  3. Батчинг запросов: обработка нескольких входов одновременно снижает нагрузку на сервер.

Особенности работы с большими моделями

  • Keras.js загружает всю модель в память, поэтому для моделей с десятками мегабайт весов требуется учитывать ограничения памяти браузера или Node.js.
  • При необходимости можно использовать streaming-загрузку весов, разбивая файлы на части.
  • Модели, включающие нестандартные слои Keras, требуют ручной реализации этих слоёв на JavaScript.

Логирование и отладка

Для отладки инференса можно использовать:

console.log(model.layers);
console.log(model.inputs);
console.log(model.outputs);

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