Как модель выпускалась в production в вашем рабочем ML-проекте?

«Как модель выпускалась в production в вашем рабочем ML-проекте?» — вопрос из категории MLOps и деплой моделей, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В моём последнем проекте по прогнозированию оттока клиентов мы использовали следующий пайплайн деплоя:

1. Подготовка и упаковка модели: Модель (CatBoostClassifier) после обучения сериализовалась вместе с препроцессингом (StandardScaler, OneHotEncoder) в единый артефакт с помощью joblib.

import joblib
from sklearn.pipeline import Pipeline

pipeline = Pipeline([
    ('preprocessor', preprocessor),
    ('classifier', CatBoostClassifier(verbose=False))
])
pipeline.fit(X_train, y_train)
joblib.dump(pipeline, 'model_pipeline.joblib')

2. Создание REST API сервиса: Использовали FastAPI для создания инференс-сервиса. Сервис загружал пайплайн, валидировал входные данные через Pydantic-схемы и возвращал предсказание с вероятностью.

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

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

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

@app.post("/predict")
def predict(request: PredictionRequest):
    try:
        features_array = np.array(request.features).reshape(1, -1)
        prediction = model.predict(features_array)
        probability = model.predict_proba(features_array)[0][1]
        return {"prediction": int(prediction[0]), "probability": float(probability)}
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))

3. Контейнеризация и оркестрация:

  • Написали Dockerfile, упаковывающий код, зависимости и модель.
  • Выложили образ в приватный Container Registry.
  • Развернули сервис в Kubernetes-кластере как Deployment с 3 репликами и настроили Horizontal Pod Autoscaler.
  • Настроили Ingress для маршрутизации внешних запросов.

4. CI/CD и мониторинг:

  • В GitLab CI/CD пайплайн запускал юнит-тесты, линтинг, сборку образа и деплой в staging-окружение.
  • После тестов в staging — автоматический деплой в production с canary-релизом (10% трафика на новую версию).
  • Настроили мониторинг метрик (задержка, RPS, ошибки) в Prometheus/Grafana и логирование предсказаний в ELK-стек для отслеживания дрифта данных.