Автоматизація ML-процесів: як впровадити MLOps-платформу
Дата-саєнтист навчив градієнтний бустинг з ROC-AUC 0.97, precision 0.92, recall 0.88 на локальному Jupyter. За тиждень у production precision впав до 0.65, recall до 0.55 — дані змінилися, а модель не перенавчалася. Training-serving skew, дрейф даних, ручний деплой без версіонування — типові симптоми відсутності MLOps. За 5 років ми впровадили MLOps-платформи для 15+ команд і гарантуємо, що модель працюватиме в production так само, як на ноутбуці. Платформа вирішує три ключові задачі: відтворюваність експериментів, консистентність фіч і автоматичний моніторинг.
Як MLOps-платформа усуває розрив між розробкою та production?
Ключова проблема — Model Registry і Feature Store. Без них data scientist втрачає експерименти, а інженери — контроль над версіями. MLOps-платформа нав'язує дисципліну: кожен експеримент логується, кожна модель версіонується, кожна ознака обчислюється один раз. MLOps-платформа інтегрує стек інструментів для всього циклу: дані → експерименти → навчання → деплой → моніторинг.
- Feature Store (Feast) — фічі обчислюються один раз для навчання та інференсу, виключаючи training-serving skew.
- Model Registry (MLflow) — версіонування моделей, promotion workflow (Staging → Production), автоматичний відкат при падінні метрик.
- Автоматичні пайплайни (Kubeflow) — перезапуск навчання при появі нових даних без ручного втручання.
- Моніторинг (Evidently + Prometheus) — alert при дрейфі даних або падінні точності.
Без цих компонентів кожна модель ризикує стати legacy за тиждень.
Кроки для впровадження MLOps
- Розгорніть MLflow з PostgreSQL та S3.
- Організуйте Model Registry.
- Підключіть Feature Store (Feast).
- Налаштуйте автоматичні пайплайни Kubeflow.
- Впровадьте моніторинг Evidently.
Які компоненти входять у базовий стек MLOps?
Ми починаємо з мінімально життєздатного набору: MLflow для tracking і registry, S3 для артефактів, PostgreSQL для метаданих. Потім підключаємо Feast для Feature Store і Kubeflow для оркестрації. Нижче — детальне налаштування кожного компонента.
MLflow: налаштування Tracking Server і Model Registry
Ставимо MLflow Tracking Server з S3 artifact store і PostgreSQL backend. Це займає 1–2 тижні і дає: логування експериментів, model registry, promotion workflow.
Приклад логування моделі MLflow
import mlflow import mlflow.sklearn from mlflow.models import infer_signature mlflow.set_tracking_uri("http://mlflow.mlops.svc.cluster.local:5000") mlflow.set_experiment("fraud-detection-v2") with mlflow.start_run(run_name="lgbm-baseline") as run: mlflow.log_params({"n_estimators": 500, "learning_rate": 0.05, "max_depth": 6}) model = LGBMClassifier(**params) model.fit(X_train, y_train) y_pred = model.predict(X_test) mlflow.log_metrics({ "precision": precision_score(y_test, y_pred), "recall": recall_score(y_test, y_pred), "f1": f1_score(y_test, y_pred), "roc_auc": roc_auc_score(y_test, model.predict_proba(X_test)[:, 1]) }) signature = infer_signature(X_train, model.predict(X_train)) mlflow.sklearn.log_model(model, artifact_path="model", signature=signature, registered_model_name="fraud-detection") mlflow.log_figure(plot_feature_importance(model), "feature_importance.png") mlflow.log_artifact("shap_values.html") print(f"Run ID: {run.info.run_id}") from mlflow.tracking import MlflowClient client = MlflowClient() best_run = client.search_runs(experiment_ids=[experiment.experiment_id], order_by=["metrics.f1 DESC"], max_results=1)[0] model_version = mlflow.register_model(f"runs:/{best_run.info.run_id}/model", name="fraud-detection") client.transition_model_version_stage(name="fraud-detection", version=model_version.version, stage="Staging", archive_existing_versions=False) client.transition_model_version_stage(name="fraud-detection", version=model_version.version, stage="Production", archive_existing_versions=True) Feature Store: усунення training-serving skew з Feast
Додаємо Feast з онлайн-сховищем на Redis/Hazelcast. Тепер історичні фічі для тренування і ті ж фічі через REST API для інференсу — без skew.
from feast import FeatureStore store = FeatureStore(repo_path="./feature_repo") training_df = store.get_historical_features( entity_df=entity_df_with_timestamps, features=["customer_stats:transaction_count_7d", "customer_stats:avg_amount_30d", "merchant_stats:fraud_rate_90d"] ).to_df() online_features = store.get_online_features( features=["customer_stats:transaction_count_7d", "customer_stats:avg_amount_30d"], entity_rows=[{"customer_id": "12345", "merchant_id": "MCC001"}] ).to_dict() Kubeflow: автоматизація пайплайнів
Розгортаємо Kubeflow Pipelines для автоматичного retrain по тригеру (новий файл в S3) або за розкладом. Навчання в GPU-пулах з віртуалізацією.
Моніторинг з Evidently і Prometheus
Інтегруємо Prometheus і Grafana для збору метрик latency, throughput, GPU utilization. Для data drift використовуємо Evidently.
import evidently from evidently.report import Report from evidently.metric_preset import DataDriftPreset, ClassificationPreset report = Report(metrics=[DataDriftPreset(), ClassificationPreset()]) report.run(reference_data=training_data, current_data=production_data_last_week) report.save_html("drift_report.html") data_drift_score = report.as_dict()["metrics"][0]["result"]["dataset_drift"] if data_drift_score: alerts.send("Data drift detected", severity="warning") Чому ми обираємо self-hosted стек на Kubernetes?
Self-hosted дає повний контроль над даними та конфігурацією, а в масштабі 5+ моделей обходиться значно дешевше managed-рішень. Нижче — порівняння:
| Критерій | Self-hosted (Kubeflow + MLflow) | Managed (SageMaker, Vertex AI) |
|---|---|---|
| Контроль даних | Повний | Обмежений |
| Vendor lock-in | Немає | Є |
| Вартість при 10 моделях | Фіксована | Експоненційно зростає |
| Час розгортання | 2–4 тижні | 1–2 дні |
Self-hosted MLOps на 40% дешевший за managed-сервіси при 5+ моделях. Важно: моніторинг потрібно впроваджувати з першого дня, а не після інциденту.
Що входить у deliverables?
Ми передаємо:
- Документацію: архітектурну схему, інструкції з розгортання, API-специфікації.
- Доступи: налаштований MLflow, Feast, Grafana, kubectl-контекст.
- Навчання: 2–3 воркшопи з роботи з MLflow і Feast.
- Підтримку: 2 тижні супроводу після введення в експлуатацію.
Терміни та вартість
Вартість розраховується індивідуально — залежить від складності інтеграцій та обсягу даних. Орієнтовна вартість базової MLOps-платформи (MLflow + S3) – від $5,000. Орієнтовні терміни:
| Етап | Тривалість |
|---|---|
| Базова MLOps-платформа (MLflow + S3) | 1–2 тижні |
| MLflow + model registry + CI/CD | 3–4 тижні |
| Feast feature store | 2–3 тижні |
| Kubeflow pipelines + автоматичний retrain | 1–2 місяці |
| Evidently моніторинг + дашборди | 2–3 тижні |
| Повний стек (всі етапи) | 2–4 місяці |
Типові помилки та як їх уникнути
- Пропуск Feature Store — починають з пайплайнів, а training-serving skew вбиває accuracy. Ми завжди стартуємо з MLflow + Feast.
- Відсутність версіонування моделей — ручний деплой model.pkl призводить до хаосу. Model Registry обов'язковий.
- Ігнорування моніторингу — дрейф даних виявляють через скарги клієнтів. Evidently повинен працювати з першого дня.
Отримайте консультацію з впровадження MLOps — ми підберемо оптимальний стек під ваш проект. Оцінимо ваш проект і запропонуємо архітектуру MLOps-платформи під ваші задачі. Зв'яжіться з нами — ми підготуємо кошторис і roadmap.







