Serving & Production
~35 мин

Model Serving

FastAPI, TorchServe, Triton, vLLM — деплой моделей, батчинг, кеширование.

Model Serving — ты натренировал модель, что дальше?

Загрузка интерактивного виджета...

Обучить модель — 10% работы. Настоящий вызов — отдавать предсказания 24/7 с латентностью < 100 мс, обрабатывая тысячи запросов в секунду. Model serving — это вся инфраструктура вокруг inference: API-сервер, батчинг запросов, кеширование, auto-scaling. Разберём от простого (FastAPI) до production-grade (Triton, vLLM).

FastAPI — самый простой и правильный старт

Для моделей на scikit-learn, CatBoost, LightGBM, маленьких нейронок — FastAPI закрывает 80% потребностей. Быстрый, асинхронный, автодокументация (Swagger) из коробки. Модель загружается один раз при старте, дальше просто отвечает на запросы. Для production используй gunicorn с несколькими workers: gunicorn app:app -w 4 -k uvicorn.workers.UvicornWorker.

from fastapi import FastAPI
from pydantic import BaseModel
import joblib, numpy as np

app = FastAPI(title="Churn Prediction API")
model = joblib.load("models/churn_model.pkl")  # загружаем ОДИН РАЗ

class PredictRequest(BaseModel):
    user_id: str
    features: list[float]

@app.post("/predict")
async def predict(req: PredictRequest):
    proba = model.predict_proba(
        np.array(req.features).reshape(1, -1)
    )[0][1]
    return {"user_id": req.user_id, "churn_prob": round(proba, 4)}

@app.get("/health")
async def health():
    return {"status": "ok", "model_version": "v2.3"}

Triton и vLLM — production-grade serving

Когда FastAPI не хватает — есть специализированные inference-серверы. NVIDIA Triton поддерживает PyTorch, TensorFlow, ONNX, XGBoost, делает dynamic batching (собирает запросы за 1-10 мс в батч автоматически), работает на multi-GPU. Ты кладёшь модель в папку (model_repository/model_name/1/model.onnx), пишешь config.pbtxt — Triton делает остальное. Для LLM (GPT, LLaMA, Mistral) — vLLM: PagedAttention для эффективной GPU-памяти, continuous batching, OpenAI-совместимый API одной командой.

# vLLM — запуск LLM-сервера одной командой
python -m vllm.entrypoints.openai.api_server     --model meta-llama/Meta-Llama-3--Instruct     --tensor-parallel-size 2     --gpu-memory-utilization 0.9

# Клиент — стандартный OpenAI SDK, просто меняем base_url
# client = OpenAI(base_url="http://localhost:8000/v1")

Оптимизации — как сделать inference быстрее

  • Dynamic Batching — накапливаем запросы за 1-10 мс, обрабатываем одним батчем. GPU используется эффективнее
  • ONNX Runtime — конвертируем модель в ONNX (torch.onnx.export), inference в 2-5× быстрее за счёт оптимизаций графа
  • Кеширование — Redis для повторяющихся запросов. Одинаковые фичи → одинаковый ответ, GPU не нужен
  • Quantization — INT8 вместо FP32: модель в 4× меньше, inference в 2-3× быстрее, потеря качества < 1%
  • Model Distillation — маленькая модель учится у большой. 10× быстрее, 95% качества

💡 Как это в реальной работе

Для CatBoost/LightGBM моделей хватает FastAPI + gunicorn + Docker. Для GPU-моделей (embeddings, NLP) — Triton с dynamic batching. Для LLM — vLLM. Общий паттерн: модель скачивается из S3 при старте, API отвечает на /predict, Redis кеширует повторяющиеся запросы, Prometheus собирает метрики.

🎯 На собесе

Как вы деплоите ML-модель? FastAPI для простых моделей, Triton для GPU. Docker + K8s для масштабирования. Оптимизации: ONNX для ускорения, dynamic batching, Redis для кеша. Для LLM — vLLM. Health check, graceful shutdown, auto-scaling по GPU utilization. Мониторинг: latency p50/p99, error rate, throughput.