← Назад к вопросам

Как выпустить модель в production?

2.0 Middle🔥 61 комментариев
#MLOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Развертывание ML модели в Production: полный процесс

Развертывание модели в production — это комплексный процесс, который включает подготовку модели, создание инфраструктуры, мониторинг и масштабирование. Это критическая фаза жизненного цикла машинного обучения.

Этап 1: Подготовка модели

Шаг 1: Сохранение модели

import joblib
import torch

# Для scikit-learn
joblib.dump(model, 'model.pkl')
loaded_model = joblib.load('model.pkl')

# Для PyTorch
torch.save(model.state_dict(), 'model.pth')

# Для TensorFlow
model.save('model.h5')

Шаг 2: Версионирование модели

import mlflow

mlflow.start_run()
mlflow.log_model(model, 'model')
mlflow.log_metrics({'accuracy': 0.95})
mlflow.end_run()

Шаг 3: Контейнеризация

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY model.pkl .
COPY app.py .

EXPOSE 5000
CMD ["python", "app.py"]

Этап 2: API для модели

FastAPI сервис

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

app = FastAPI()
model = joblib.load('model.pkl')

class PredictionInput(BaseModel):
    features: list[float]

@app.post("/predict")
async def predict(data: PredictionInput):
    X = np.array([data.features])
    prediction = model.predict(X)
    return {"prediction": prediction[0]}

@app.get("/health")
async def health():
    return {"status": "healthy"}

Этап 3: Развертывание инфраструктуры

Вариант 1: Kubernetes

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ml-model-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: ml-model
  template:
    metadata:
      labels:
        app: ml-model
    spec:
      containers:
      - name: ml-model
        image: my-ml-model:1.0.0
        ports:
        - containerPort: 5000
        livenessProbe:
          httpGet:
            path: /health
            port: 5000
          initialDelaySeconds: 30

Вариант 2: Облачные платформы

# Google Cloud Run
gcloud run deploy ml-model \
  --image gcr.io/project/ml-model:latest \
  --platform managed \
  --region us-central1

# AWS SageMaker
predictor = model.deploy(
    initial_instance_count=1,
    instance_type='ml.m5.large'
)

# Heroku
git push heroku main

Этап 4: Мониторинг и логирование

Prometheus метрики

from prometheus_client import Counter, Histogram
import time

predictions_total = Counter('predictions_total', 'Total predictions')
prediction_latency = Histogram('prediction_latency_seconds', 'Latency')

@app.post("/predict")
async def predict(data: PredictionInput):
    start_time = time.time()
    
    prediction = model.predict(np.array([data.features]))[0]
    
    latency = time.time() - start_time
    predictions_total.inc()
    prediction_latency.observe(latency)
    
    return {"prediction": prediction}

Логирование

import logging

logger = logging.getLogger(__name__)

@app.post("/predict")
async def predict(data: PredictionInput):
    logger.info(f"Received prediction request")
    try:
        prediction = model.predict(np.array([data.features]))[0]
        return {"prediction": prediction}
    except Exception as e:
        logger.error(f"Prediction failed: {e}")
        return {"error": str(e)}, 500

Этап 5: CI/CD Pipeline

stages:
  - build
  - test
  - deploy

build_image:
  stage: build
  image: docker:latest
  script:
    - docker build -t my-ml-model:$CI_COMMIT_SHA .
    - docker push my-ml-model:$CI_COMMIT_SHA

test:
  stage: test
  image: python:3.11
  script:
    - pip install -r requirements.txt
    - pytest --cov=src

deploy_production:
  stage: deploy
  script:
    - kubectl set image deployment/ml-model ml-model=my-ml-model:$CI_COMMIT_SHA
    - kubectl rollout status deployment/ml-model

Этап 6: A/B Тестирование

import random

@app.post("/predict")
async def predict(data: PredictionInput):
    if random.random() < 0.9:
        prediction = new_model.predict(np.array([data.features]))[0]
        model_version = "new"
    else:
        prediction = old_model.predict(np.array([data.features]))[0]
        model_version = "old"
    
    return {
        "prediction": prediction,
        "model_version": model_version
    }

Чеклист развертывания

  • Модель сохранена и версионирована
  • API создан и протестирован локально
  • Dockerfile создан и образ собран
  • Тесты проходят (coverage > 90%)
  • Мониторинг настроен (Prometheus, Grafana)
  • Логирование работает
  • CI/CD pipeline готов
  • Graceful shutdown реализован
  • Rate limiting установлен
  • API документирована (Swagger)
  • Rollback процедура документирована
  • SLA и метрики определены
  • Алерты настроены

Типичные ошибки и решения

  1. Версионирование: Используй MLflow, DVC для отслеживания
  2. Зависимости: Зафиксируй версии в requirements.txt
  3. Данные: Версионируй скрипты предобработки
  4. Мониторинг: Отслеживай дрейф данных (data drift)
  5. Масштабирование: Используй load balancing
  6. Производительность: Оптимизируй время инференса
  7. Безопасность: Используй SSL/TLS, аутентификацию