Обучение на сервере, инференс в браузере

Для работы с TensorFlow.js в браузере достаточно подключить библиотеку через CDN:

<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"></script>

В Node.js используется установка через npm:

npm install @tensorflow/tfjs

Подключение в коде:

const tf = require('@tensorflow/tfjs');

TensorFlow.js поддерживает несколько бэкендов: WebGL для ускорения на GPU в браузере и CPU для универсального исполнения.


Работа с моделями: обучение на сервере и инференс в браузере

Обучение на сервере

Обучение на сервере позволяет использовать мощные вычислительные ресурсы, такие как GPU или TPU. Это особенно важно при работе с большими наборами данных и сложными нейронными сетями.

Этапы обучения:

  1. Подготовка данных Для обучения необходимо представить данные в виде тензоров. TensorFlow.js предоставляет функции для преобразования массивов и изображений в тензоры:

    const xs = tf.tensor2d([[1, 2], [3, 4], [5, 6]]);
    const ys = tf.tensor2d([[1], [3], [5]]);
  2. Создание модели Используются слои tf.layers, которые формируют последовательность или функциональную модель:

    const model = tf.sequential();
    model.add(tf.layers.dense({units: 10, activation: 'relu', inputShape: [2]}));
    model.add(tf.layers.dense({units: 1}));
  3. Компиляция модели Указывается оптимизатор, функция потерь и метрики:

    model.compile({
        optimizer: 'sgd',
        loss: 'meanSquaredError',
        metrics: ['mse']
    });
  4. Обучение модели Обучение выполняется с помощью метода fit или fitDataset для больших данных:

    await model.fit(xs, ys, {
        epochs: 50,
        batchSize: 2,
        callbacks: {
            onEpochEnd: (epoch, logs) => console.log(`Эпоха ${epoch}: потеря = ${logs.loss}`)
        }
    });
  5. Сохранение модели После обучения модель можно сохранить на сервере в формате JSON и бинарных весов:

    await model.save('file://./model');

Сохранение на сервере особенно удобно, если инференс планируется выполнять в браузере. Модель загружается клиентом через HTTP.


Загрузка и инференс в браузере

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

Загрузка модели:

const model = await tf.loadLayersModel('https://example.com/model/model.json');

Предсказание:

const input = tf.tensor2d([[7, 8]]);
const output = model.predict(input);
output.print();

Особенности инференса в браузере:

  • Оптимизация производительности: использование WebGL ускоряет вычисления на GPU, особенно для свёрточных и рекуррентных сетей.
  • Память и управление ресурсами: важно освобождать тензоры, которые больше не нужны, с помощью dispose() или использовать tf.tidy() для автоматического управления памятью:
tf.tidy(() => {
    const result = model.predict(tf.tensor2d([[7, 8]]));
    result.print();
});
  • Асинхронность: методы предсказаний могут возвращать Promise, если требуется выполнение на GPU или с использованием WebAssembly:
const result = await model.predictAsync(tf.tensor2d([[7, 8]]));

Использование предварительно обученных моделей

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

Пример загрузки MobileNet для классификации изображений:

const mobilenet = await tf.loadGraphModel(
    'https://tfhub.dev/google/tfjs-model/imagenet/mobilenet_v2_140_224/classification/3/default/1',
    {fromTFHub: true}
);

const imageTensor = tf.browser.fromPixels(document.getElementById('image')).resizeBilinear([224, 224]).expandDims();
const predictions = mobilenet.predict(imageTensor);
predictions.print();

Преимущества такого подхода:

  • Быстрое развертывание на клиенте.
  • Минимальная нагрузка на сервер.
  • Возможность комбинирования с кастомными слоями для дообучения.

Работа с потоками данных

Для больших наборов данных рекомендуется использовать объект tf.data.Dataset. Он позволяет создавать потоковые данные и пакетную обработку, что актуально при обучении на сервере.

const data = tf.data.array([{x: [1,2], y: 3}, {x: [4,5], y: 9}]);
const dataset = data.map(item => ({
    xs: tf.tensor(item.x).expandDims(),
    ys: tf.tensor([item.y])
})).batch(2);

Использование dataset в model.fitDataset обеспечивает эффективное управление памятью и загрузкой данных.


Совместимость и миграция

  • Модели, обученные в TensorFlow (Python), могут быть конвертированы в формат TensorFlow.js с помощью утилиты tensorflowjs_converter.
  • Важно учитывать различия между WebGL и CPU бэкендами: численные расхождения могут быть незначительными, но в задачах с высокой точностью это нужно тестировать.

Управление вычислительными ресурсами в браузере

TensorFlow.js предоставляет методы для выбора бэкенда:

await tf.setBackend('webgl'); // GPU
await tf.setBackend('cpu');   // CPU

Также можно проверять доступность бэкендов:

console.log(tf.getBackend());
console.log(tf.engine().backendNames());

Это позволяет адаптировать инференс под возможности устройства пользователя. Для мобильных устройств рекомендуется использовать CPU или WebAssembly для экономии энергии и снижения нагрева.