168 слов | 1 минута

Интеграция ML-модели на VPS

Этот документ описывает, как подключить модель машинного обучения к проекту на Bitrix (PHP), развернутому на VPS, используя Node.js + ONNX Runtime без Python.

Общая архитектура

Bitrix (PHP)
       ↓ HTTP POST
Node.js (Express API + ONNX Runtime)
       ↓
ONNX-модель (model.onnx)

Bitrix отправляет данные → Node.js выполняет модель → возвращает результат.

Какие типы моделей подходят для такой связки

Ниже - список задач и типов моделей, которые отлично работают через ONNX Runtime + Node.js.

Классификация текста

  • BERT / MiniBERT
  • DistilBERT
  • RoBERTa
  • ALBERT

Задачи: определение тональности, классификация сообщений, фильтрация спама.

Генерация текста

  • GPT‑2 small/medium (ONNX)
  • DistilGPT2

Задачи: автодополнение, описания товаров, подсказки.

Классификация изображений

  • MobileNetV2
  • EfficientNet-Lite
  • ResNet50
  • SqueezeNet

Object Detection

  • YOLOv5/YOLOv8 (ONNX)
  • SSD MobileNet

Табличные данные

  • CatBoost
  • LightGBM
  • XGBoost
  • sklearn модели

Рекомендательные системы

  • LightFM
  • Matrix Factorization
  • NCF

Аудио

  • Whisper Tiny (ONNX)
  • Wav2Vec2

Что НЕ запускать

  • большие GPT (GPT‑J, LLaMA 13B+)
  • модели больше 3 GB
  • GPU‑зависимые модели

Установка Node.js

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

Создание Node.js ML‑сервиса

mkdir ml-service
cd ml-service
npm init -y
npm install express onnxruntime-node

server.js

const express = require("express");
const ort = require("onnxruntime-node");

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

let session;

async function loadModel() {
  session = await ort.InferenceSession.create("model.onnx");
  console.log("ONNX model loaded");
}

app.post("/predict", async (req, res) => {
  try {
    const input = Float32Array.from(req.body.input);

    const feeds = {
      input: new ort.Tensor("float32", input, [1, input.length])
    };

    const results = await session.run(feeds);

    res.json({
      result: results[Object.keys(results)[0]].data
    });

  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

loadModel();
app.listen(8000, () => console.log("ML API running on port 8000"));

Автозапуск через systemd /etc/systemd/system/ml-service.service:

[Unit]
Description=ML Node.js Service
After=network.target

[Service]
ExecStart=/usr/bin/node server.js
WorkingDirectory=/var/www/ml-service
Restart=always
User=root

[Install]
WantedBy=multi-user.target

Вызов из Bitrix (PHP)

function ml_predict($data)
{
    $url = "http://127.0.0.1:8000/predict";

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(["input" => $data]));

    $response = curl_exec($ch);
    curl_close($ch);

    return json_decode($response, true);
}

$result = ml_predict([1.0, 2.0, 3.0]);
print_r($result);

Итог

  • Bitrix остаётся на чистом PHP
  • Node.js выполняет модель
  • работает на любой VPS
  • можно использовать десятки типов моделей
  • обновление модели не требует изменений на сайте