REST API для моделей

ConvNetJS — это библиотека для глубокого обучения на стороне клиента с использованием JavaScript, ориентированная на нейронные сети, включая сверточные. Несмотря на отсутствие встроенного серверного REST API, модели, созданные в ConvNetJS, могут быть интегрированы с серверными приложениями через стандартные HTTP-запросы. Реализация REST API позволяет использовать обученные сети для предсказаний, передачи весов и управления жизненным циклом модели в веб-приложениях.


Архитектура взаимодействия

REST API для модели обычно строится вокруг трёх ключевых операций:

  1. Загрузка модели — отправка сохранённой конфигурации и весов на сервер.
  2. Предсказание — получение результатов работы нейронной сети по входным данным.
  3. Обучение и обновление весов — отправка новых данных для дообучения сети или обновление параметров.

Каждое действие реализуется отдельным HTTP-эндпоинтом с чётко определёнными форматами запроса и ответа.


Формат хранения и передачи модели

ConvNetJS хранит модель в виде JSON-объекта, включающего:

  • Конфигурацию слоёв (layers): тип слоя (input, fc, conv, relu, softmax и др.), параметры слоя (количество нейронов, фильтры, размер ядра, шаги свертки, паддинг).
  • Весовые коэффициенты (filters, biases): массивы чисел, описывающие обученные параметры.
  • Гиперпараметры оптимизации: скорость обучения, тип оптимизатора, momentum.

Пример JSON-структуры модели:

{
  "layers": [
    {"type": "input", "out_sx": 28, "out_sy": 28, "out_depth": 1},
    {"type": "conv", "sx": 5, "filters": 8, "stride": 1, "pad": 2},
    {"type": "relu"},
    {"type": "pool", "sx": 2, "stride": 2},
    {"type": "fc", "num_neurons": 10},
    {"type": "softmax"}
  ],
  "weights": {
    "conv0": {"filters": [...], "biases": [...]},
    "fc0": {"weights": [...], "biases": [...]}
  },
  "trainer": {"method": "sgd", "learning_rate": 0.01, "momentum": 0.9}
}

JSON-формат обеспечивает совместимость между клиентом и сервером и позволяет полностью восстановить модель без необходимости повторного обучения.


Эндпоинт /load_model

Назначение: загрузка модели на сервер для последующих предсказаний.

Метод: POST Тело запроса: JSON-объект модели, включая layers и weights.

Пример запроса:

POST /load_model
Content-Type: application/json

{
  "layers": [...],
  "weights": {...},
  "trainer": {...}
}

Ответ сервера:

{
  "status": "success",
  "message": "Model loaded successfully"
}

После загрузки модель может быть использована для предсказаний без пересоздания структуры на сервере.


Эндпоинт /predict

Назначение: получение результатов предсказания по входным данным.

Метод: POST Тело запроса: массив входных значений, соответствующих размеру входного слоя.

Пример запроса:

POST /predict
Content-Type: application/json

{
  "input": [0.0, 0.1, 0.5, ..., 0.0]
}

Алгоритм обработки на сервере:

  1. Создание объекта Vol с входными данными.
  2. Передача данных в метод forward() сети: net.forward(vol).
  3. Получение результата из net.getPrediction() или net.getProbabilities() для вероятностного выхода.

Ответ сервера:

{
  "prediction": 7,
  "probabilities": [0.01, 0.02, 0.03, ..., 0.85]
}

Эндпоинт /train

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

Метод: POST Тело запроса: объект с массивами входов и целевых меток.

Пример запроса:

POST /train
Content-Type: application/json

{
  "inputs": [[0.0, 0.1, ..., 0.0], [...]],
  "targets": [7, 3]
}

Алгоритм на сервере:

  1. Для каждого примера создаётся объект Vol.
  2. Метод forward() выполняет прямой проход.
  3. Метод backward() вычисляет градиенты ошибки.
  4. Метод trainer.update() корректирует веса сети.

Ответ сервера:

{
  "status": "success",
  "message": "Training step completed"
}

Использование REST API позволяет интегрировать модель в распределённые приложения, обеспечивая обучение и предсказания через стандартные HTTP-запросы.


Форматы данных и сериализация

ConvNetJS использует числовые массивы и JSON для обмена данными. Основные рекомендации:

  • Входные данные должны быть нормализованы и приведены к диапазону [0, 1] или [-1, 1].
  • Для изображений размерность width × height × depth должна соответствовать входному слою сети.
  • Весовые матрицы сериализуются как одномерные массивы, что упрощает пересылку и хранение.

JSON обеспечивает простую интеграцию с фронтендом, Node.js-серверами и сторонними приложениями.


Особенности и ограничения

  • ConvNetJS работает на клиенте или сервере через Node.js, но не оптимизирован для больших моделей и больших данных.
  • REST API подходит для лёгких сервисов и прототипов, однако для продакшн-систем предпочтительнее использовать специализированные фреймворки с GPU-ускорением.
  • Поддержка форматов других библиотек ограничена; прямой импорт весов TensorFlow или PyTorch требует конвертации в формат ConvNetJS.

Пример полного цикла через REST

  1. Клиент отправляет JSON-модель на /load_model.
  2. Сервер хранит модель в памяти или базе данных.
  3. Клиент отправляет входные данные на /predict и получает вероятности классов.
  4. При поступлении новых меток данные отправляются на /train для дообучения сети.
  5. В любой момент можно сохранить обновлённую модель и экспортировать её обратно в JSON.

Такой подход обеспечивает гибкость, лёгкость интеграции с веб-приложениями и возможность развёртывания моделей ConvNetJS в распределённых системах.