Сохранение и загрузка моделей на сервере

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


Экспорт моделей из Keras

Модели в Keras можно сохранять двумя способами: весь объект модели целиком или только веса модели. Для работы с Keras.js рекомендуется использовать формат JSON для описания архитектуры и отдельные файлы с весами в формате .bin.

Сохранение архитектуры

from keras.models import load_model
model = load_model('model.h5')

# Экспорт архитектуры модели в JSON
model_json = model.to_json()
with open("model.json", "w") as json_file:
    json_file.write(model_json)
  • model.to_json() сохраняет структуру слоёв, конфигурацию активаций, регуляризаторов и прочие параметры.
  • JSON-файл не содержит веса модели, он лишь описывает структуру сети.

Сохранение весов

# Сохранение весов в формате HDF5
model.save_weights("weights.h5")
  • Весовые коэффициенты нужно конвертировать в формат, поддерживаемый Keras.js.
  • Для Keras.js часто используют утилиты kerasjs-converter, которые преобразуют HDF5 в бинарные .bin файлы.

Конвертация модели для Keras.js

kerasjs-converter --input model.json --weights weights.h5 --output kerasjs-model/
  • В каталоге kerasjs-model будут файлы model.json и отдельные бинарные файлы с весами.
  • Структура каталога критична для правильной загрузки в браузере.

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

Keras.js работает полностью на стороне клиента, однако сервер играет роль хранилища моделей. Для обеспечения быстрого доступа рекомендуется хранить модели в статическом каталоге сервера, например public/models/.

Структура файлов на сервере

public/
└── models/
    └── my_model/
        ├── model.json
        ├── group1-shard1of1.bin
        └── ...
  • model.json — описание архитектуры.
  • group*-shard*.bin — веса модели, разбитые на чанки.
  • Сервер должен поддерживать корректные заголовки MIME (application/json для JSON и application/octet-stream для бинарных файлов).

Пример простого Node.js сервера для хранения моделей

const express = require('express');
const path = require('path');
const app = express();

app.use('/models', express.static(path.join(__dirname, 'public/models')));

app.listen(3000, () => {
    console.log('Server running on http://localhost:3000');
});
  • Клиенты могут загружать модель через прямой URL: http://localhost:3000/models/my_model/model.json.

Загрузка модели в браузере с помощью Keras.js

После размещения модели на сервере её можно использовать для инференса в браузере.

const KerasJS = require('keras-js');

const model = new KerasJS.Model({
  filepath: 'http://localhost:3000/models/my_model/model.json',
  gpu: true
});

model.ready()
  .then(() => {
    const inputData = { input_1: new Float32Array([/* данные */]) };
    return model.predict(inputData);
  })
  .then(outputData => {
    console.log('Результат предсказания:', outputData);
  })
  .catch(err => console.error('Ошибка загрузки модели:', err));
  • Параметр gpu: true позволяет использовать WebGL для ускоренного вычисления.
  • Метод ready() гарантирует, что все веса загружены и модель готова к инференсу.
  • Входные данные должны соответствовать форме, определённой в модели.

Особенности работы с бинарными весами

  • Каждая .bin-часть соответствует отдельной матрице весов слоя.
  • Разбиение на чанки помогает браузеру эффективно загружать большие модели.
  • В случае изменения версии Keras необходимо убедиться, что конвертация и загрузка бинарных весов остаются совместимыми.

Практические рекомендации

  1. Минимизировать размер модели: удалить слои, которые не используются в инференсе, или применить квантование весов.
  2. Разбивать большие модели на несколько файлов весов: это ускоряет загрузку и снижает риск сбоев.
  3. Настроить кэширование на сервере: браузер может кэшировать модели для повторного использования.
  4. Следить за MIME-типами: неправильные заголовки могут привести к ошибкам при загрузке JSON или бинарных данных.

Поддержка обновлений моделей

Для обновления модели на сервере:

  1. Пересоздать JSON и бинарные файлы с новыми весами.
  2. Разместить их в отдельной версии каталога (my_model_v2) для предотвращения конфликтов.
  3. Изменить URL в клиентском коде, чтобы использовать новую версию.
  • Такой подход позволяет реализовать «горячее» обновление моделей без прерывания работы приложения.

Систематическое соблюдение этих правил гарантирует корректную работу Keras.js в браузере и упрощает управление моделями на сервере.