TensorFlow.js в Node.js

TensorFlow.js — это библиотека для работы с машинным обучением в JavaScript, позволяющая создавать, обучать и запускать модели как в браузере, так и на серверной стороне через Node.js. В среде Node.js она открывает возможности полноценной серверной обработки данных, ускорения вычислений с использованием GPU и интеграции моделей машинного обучения в backend-приложения.


Установка и настройка

Для работы с TensorFlow.js в Node.js используется пакет @tensorflow/tfjs-node или @tensorflow/tfjs-node-gpu для ускорения вычислений с поддержкой CUDA. Установка производится через npm:

npm install @tensorflow/tfjs-node

или с поддержкой GPU:

npm install @tensorflow/tfjs-node-gpu

После установки модуль импортируется следующим образом:

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

Важный момент: @tensorflow/tfjs-node включает в себя бинарные зависимости для работы с нативными ускорителями, поэтому установка может потребовать наличия корректных версий Python и C++ компилятора для сборки. На Windows рекомендуется иметь Visual Studio Build Tools, на Linux — gcc и g++ последних версий.


Основные структуры данных

Тензоры — базовая структура в TensorFlow.js. Тензор представляет собой многомерный массив чисел с определённой формой (shape) и типом данных (dtype).

const a = tf.tensor([1, 2, 3, 4], [2, 2]);
console.log(a.shape); // [2, 2]
console.log(a.dtype); // 'float32'

Типы тензоров:

  • tf.scalar(value) — скаляр, тензор 0-й размерности.
  • tf.tensor1d(array) — вектор.
  • tf.tensor2d(array, [rows, cols]) — матрица.
  • tf.tensor3d и tf.tensor4d — многомерные массивы для работы с изображениями и видео.

Все операции с тензорами в TensorFlow.js ленивые и оптимизированные. Операции создают новые тензоры, не изменяя исходные данные, что позволяет избежать непреднамеренных побочных эффектов.


Работа с моделями

Создание модели

В Node.js поддерживаются как послойные модели, так и функциональные модели.

Слоевая модель (Sequential):

const model = tf.sequential();
model.add(tf.layers.dense({units: 32, inputShape: [10], activation: 'relu'}));
model.add(tf.layers.dense({units: 1, activation: 'linear'}));

Функциональная модель (Functional API):

const input = tf.input({shape: [10]});
const hidden = tf.layers.dense({units: 32, activation: 'relu'}).apply(input);
const output = tf.layers.dense({units: 1}).apply(hidden);
const model = tf.model({inputs: input, outputs: output});

Компиляция модели

model.compile({
  optimizer: tf.train.adam(0.001),
  loss: tf.losses.meanSquaredError,
  metrics: ['mse']
});
  • Optimizer — алгоритм оптимизации (Adam, SGD, RMSProp).
  • Loss — функция потерь (meanSquaredError, categoricalCrossentropy и др.).
  • Metrics — метрики для оценки модели.

Обучение модели

Node.js позволяет использовать большие датасеты, загруженные с диска или получаемые по сети, благодаря поддержке асинхронных итераторов.

const xs = tf.tensor2d([[1, 2], [3, 4], [5, 6]]);
const ys = tf.tensor2d([[1], [3], [5]]);

async function train() {
  await model.fit(xs, ys, {
    epochs: 100,
    batchSize: 2,
    callbacks: {
      onEpochEnd: (epoch, logs) => {
        console.log(`Эпоха ${epoch}: ошибка = ${logs.loss}`);
      }
    }
  });
}

train();

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


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

Модели можно сохранять локально или загружать из файловой системы.

// Сохранение модели
await model.save('file://./my-model');

// Загрузка модели
const loadedModel = await tf.loadLayersModel('file://./my-model/model.json');

Формат file:// указывает на локальную файловую систему Node.js. Поддерживаются также форматы HTTP/HTTPS для загрузки моделей из сети.


Работа с данными

Node.js предоставляет прямой доступ к файловой системе, что упрощает обработку CSV, JSON и бинарных данных.

const fs = require('fs');
const data = fs.readFileSync('data.csv', 'utf8');

TensorFlow.js содержит утилиты для преобразования данных:

const dataset = tf.data.csv('file://data.csv', {
  columnConfigs: {
    label: {isLabel: true}
  }
});

Метод tf.data позволяет создавать потоковые датасеты, комбинировать, перемешивать и батчить данные.


Использование GPU и ускорителей

@tensorflow/tfjs-node-gpu поддерживает CUDA и cuDNN. При установке система автоматически выбирает доступный GPU, ускоряя операции матричных умножений и свёрточных слоёв. Для проверки:

console.log(tf.getBackend()); // 'tensorflow'

Backend tensorflow в Node.js отличается от браузерного webgl и использует нативные библиотеки.


Примеры практических задач

  1. Регрессия и прогнозирование — построение моделей для предсказания числовых значений.
  2. Классификация изображений — обучение нейронных сетей для распознавания объектов.
  3. Обработка текста — использование embedding-слоёв и рекуррентных сетей.
  4. Онлайн-инференс на сервере — обработка запросов с прогнозами в реальном времени.

В Node.js можно интегрировать TensorFlow.js с Express или другими web-фреймворками для построения API, возвращающих предсказания модели.


Оптимизация и управление памятью

Node.js работает с большими объемами данных, поэтому важно освобождать тензоры:

const y = tf.tidy(() => {
  const x = tf.tensor([1, 2, 3, 4]);
  return x.square();
});

tf.tidy автоматически удаляет промежуточные тензоры после выполнения функции, предотвращая утечки памяти. Для контроля памяти используется метод tf.memory().


Асинхронность и промисы

Многие методы TensorFlow.js в Node.js возвращают промисы, особенно при загрузке данных и моделей. Это позволяет интегрировать библиотеку в асинхронный код и эффективно работать с большими объемами данных.


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