Ответ
В моём последнем проекте по прогнозированию оттока клиентов мы использовали следующий пайплайн деплоя:
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-стек для отслеживания дрифта данных.