MLOps

Maîtriser l’ensemble du cycle de vie des projets de machine learning, de la gestion des données au déploiement en production, en appliquant des pratiques robustes inspirées du DevOps.

MLOps

Chapitre 1 — Introduction au MLOps

Qu'est-ce que le MLOps ?

Le MLOps, pour Machine Learning Operations, est un ensemble de pratiques visant à automatiser, fiabiliser et industrialiser le cycle de vie des modèles de machine learning. Inspiré du DevOps, il s’adapte aux spécificités des projets ML, qui sont plus sensibles à la variabilité des données, au risque de dérive des performances dans le temps, et à la non-déterminisme des résultats.

Le MLOps ne concerne pas seulement le déploiement des modèles, mais englobe toute la chaîne : ingestion des données, expérimentation, entraînement, validation, packaging, mise en production, surveillance, et mise à jour continue.

Il vise à répondre à des enjeux concrets :

  • ReproductibilitĂ© des expĂ©riences
  • Collaboration fluide entre data scientists, ingĂ©nieurs ML, DevOps
  • DĂ©ploiement rapide, fiable, traçable
  • Suivi des performances en production

Différences entre DevOps et MLOps

Bien que le MLOps s’inspire du DevOps, il s’en distingue sur plusieurs points fondamentaux :

ÉlémentDevOpsMLOps
Entrée principaleCode sourceCode + données + hyperparamètres
Résultat attenduApplication déterministeModèle entraîné avec performance statistique
TestsFonctionnels/unitairesStatistiques, validité, robustesse du modèle
CI/CDBuild et déploiement logicielEntraînement, packaging, déploiement de modèle
MonitoringLogs, erreurs, uptimePrécision, dérive, métriques métier
ReproductibilitéCompilation identiqueDépend aussi de la qualité et version des données

Le MLOps impose donc des outils et workflows spécifiques pour :

  • versionner les donnĂ©es et les modèles ;
  • suivre les expĂ©riences d’entraĂ®nement ;
  • dĂ©clencher des retrainings ;
  • monitorer les mĂ©triques mĂ©tier en production.

Cycle de vie d’un projet ML

Le MLOps structure un cycle de vie complet du machine learning, souvent itératif :

  1. Collecte des données

    • Accès aux sources de donnĂ©es (bases SQL, fichiers, APIs, etc.)
    • Extraction, nettoyage, et prĂ©traitement
  2. Exploration & analyse des données

    • Visualisations, corrĂ©lations, dĂ©tection d’anomalies
    • ComprĂ©hension du contexte mĂ©tier
  3. Expérimentation & entraînement

    • SĂ©lection de modèles, tuning d’hyperparamètres
    • EntraĂ®nement local, sur serveur ou en cloud
  4. Validation

    • Évaluation sur jeux de tests
    • Analyse des mĂ©triques : accuracy, F1-score, ROC AUC, etc.
  5. Packaging du modèle

    • SĂ©rialisation (Pickle, ONNX, SavedModel)
    • Conteneurisation (Docker)
  6. Déploiement

    • En tant qu’API (FastAPI, Flask)
    • Dans un orchestrateur (Kubernetes, SageMaker)
  7. Monitoring & maintenance

    • Suivi de performance dans le temps
    • DĂ©tection de dĂ©rive
    • DĂ©clenchement de retrainings automatiques si nĂ©cessaire

Ce cycle de vie est au cœur du MLOps : il doit être reproductible, automatisé et traçable.


Rôles impliqués

Le MLOps repose sur la collaboration entre plusieurs profils aux compétences complémentaires :

  • Data Scientist
    Conçoit les modèles, les expérimente, les valide sur des jeux de tests.

  • ML Engineer
    Implémente les modèles de façon performante et scalable ; optimise les ressources.

  • MLOps Engineer
    Met en place les pipelines d’entraînement, de test, de déploiement, de monitoring. Automatise l’ensemble du cycle de vie.

  • Data Engineer
    Met à disposition les données nécessaires, construit les pipelines d’ingestion et de transformation.

  • Software Engineer
    Intègre les modèles dans les applications et plateformes produits.

  • Product Owner / MĂ©tier
    Définit les objectifs métiers, valide la pertinence des modèles, suit les KPIs en production.


Outils et plateformes populaires

Les outils du MLOps couvrent différents domaines du cycle de vie :

Versionnage

  • Git (code source)
  • DVC, LakeFS (donnĂ©es et artefacts)

Suivi d’expérimentations

  • MLflow
  • Weights & Biases
  • Neptune.ai

Orchestration de pipelines

  • Airflow
  • Kubeflow Pipelines
  • SageMaker Pipelines

Packaging et serving

  • Docker
  • TensorFlow Serving
  • TorchServe
  • MLServer

CI/CD

  • GitHub Actions
  • GitLab CI
  • Argo Workflows

Monitoring en production

  • Evidently
  • Prometheus + Grafana
  • Seldon Core

Feature Stores

  • Feast
  • Tecton

Ces outils peuvent être combinés dans des stacks MLOps cohérentes, selon les besoins et les ressources de l’équipe.

Structure typique d’un repo MLOps

project_name/
├── data/                  # Données brutes, transformées (via DVC ou symlink)
├── notebooks/             # Explorations, prototypage
├── src/                   # Code source : preprocessing, entraînement, évaluation
│   ├── data/              # Scripts d'ingestion et de preprocessing
│   ├── features/          # Feature engineering
│   ├── models/            # Définition, entraînement et sauvegarde des modèles
│   └── utils/             # Fonctions utilitaires
├── pipelines/             # Pipelines MLflow, Prefect, Airflow, etc.
├── tests/                 # Tests unitaires et fonctionnels
├── dvc.yaml               # Définition des pipelines de données (si DVC utilisé)
├── requirements.txt       # Dépendances du projet
├── Dockerfile             # Containerisation du projet
└── README.md              # Description et instructions

Exemple de pipeline CI/CD avec GitHub Actions + DVC + MLflow

name: mlops-pipeline on: push: branches: [ main ] jobs: train-and-track: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Python uses: actions/setup-python@v4 with: python-version: '3.10' - name: Install dependencies run: | pip install -r requirements.txt pip install dvc[gs] mlflow - name: Pull data with DVC run: dvc pull -r myremote - name: Train and log model run: python src/models/train.py - name: Push model to registry run: mlflow register-model -m ./mlruns -n my-model-name

Matrice de choix des outils MLOps selon le contexte

BesoinOpen-sourceCloud provider
Versionnage données + modèlesDVC + GitSageMaker + S3, Vertex AI + GCS
Orchestration de pipelinesAirflow, Prefect, FlyteSageMaker Pipelines, Azure ML
Suivi des expérimentationsMLflow, W&B, Neptune.aiSageMaker Experiments, Vertex
Déploiement API modèleFastAPI + Docker + K8sSageMaker Endpoint, Azure Endpoint
Monitoring post-déploiementEvidently, PrometheusVertex AI Monitoring, Azure Monitor

Pièges fréquents et solutions

🔸 Problème : Résultats non reproductibles

Cause : versions de données ou code non figées, pipelines manuels Solution : DVC pour les données, MLflow pour l’expérimentation, scripts versionnés

🔸 Problème : Environnement local ≠ production

Cause : dépendances floues, configurations spécifiques non portables Solution : Dockerisation stricte, gestion centralisée des secrets

🔸 Problème : Dérive silencieuse des données ou du modèle

Cause : manque de monitoring métier Solution : Evidently + Prometheus avec alertes sur les métriques clés

🔸 Problème : Frictions entre équipes Data / Ops

Cause : rôles mal définis, manque d'automatisation Solution : pipelines automatisés, documentation partagée, GitOps appliqué au ML


Chapitre 2 — Gestion des données

Collecte et ingestion de données

La première étape d’un pipeline MLOps est l’acquisition des données. Celles-ci peuvent provenir de sources variées :

  • Bases de donnĂ©es relationnelles (PostgreSQL, MySQL)
  • Fichiers plats (CSV, JSON, Parquet)
  • APIs externes (REST, GraphQL)
  • Flux temps rĂ©el (Kafka, MQTT)
  • DonnĂ©es cloud (S3, GCS, Azure Blob)

La collecte peut être automatisée via des outils comme Airflow, Prefect, ou des scripts dédiés intégrés dans un pipeline DVC ou MLflow.

Bonnes pratiques :

  • Centraliser les accès via une couche d’abstraction
  • Documenter chaque source (structure, frĂ©quence, format)
  • SĂ©parer la phase d’extraction de la phase de transformation

Exemple d'implémentation avec Airflow (ingestion automatique d'un dataset public)

from airflow import DAG from airflow.operators.bash import BashOperator from airflow.utils.dates import days_ago dag = DAG( 'ingest_csv_kaggle', default_args={'owner': 'mlops'}, start_date=days_ago(1), schedule_interval='@daily' ) ingest = BashOperator( task_id='download_data', bash_command='curl -o /data/raw.csv https://url-vers-dataset.csv', dag=dag )

Validation des données

Avant toute utilisation, les données doivent être validées pour éviter les erreurs silencieuses en aval. Les erreurs peuvent inclure :

  • Types incohĂ©rents
  • DonnĂ©es manquantes ou aberrantes
  • Distributions inattendues

Outils de validation :

  • Great Expectations : framework dĂ©claratif de tests de donnĂ©es
  • Pandera : validation de DataFrames Pandas avec des schĂ©mas typĂ©s
  • Deepchecks : tests orientĂ©s machine learning (biais, drift, etc.)

Exemple avancé avec Great Expectations

from great_expectations.dataset import PandasDataset import pandas as pd class MyValidatedDataset(PandasDataset): _expectations_config = { "expect_column_values_to_not_be_null": {"column": "age"}, "expect_column_values_to_be_between": {"column": "age", "min_value": 0, "max_value": 120} } df = pd.read_csv("/data/clean.csv") validated_df = MyValidatedDataset(df) validated_df.validate()

Intégration dans CI/CD

  • Ajouter un job validate_data dans GitHub Actions avec un rapport JSON
  • Failer le pipeline si un seuil de conformitĂ© est franchi

Versionnage de données

Contrairement au code, les données changent souvent et doivent être versionnées pour garantir la reproductibilité des expériences ML.

Outils :

  • DVC (Data Version Control) : s’intègre Ă  Git pour tracker les fichiers volumineux
  • LakeFS : transforme un data lake en système de fichiers versionnĂ©
  • Delta Lake : versionning transactionnel sur Apache Spark

Exemple : DVC avec Google Cloud

dvc init dvc remote add -d gcsremote gcs://bucket/dataset dvc add data/clean.csv git add data/clean.csv.dvc .gitignore git commit -m "Ajout dataset versionné" dvc push

Bonne pratique : créer un tag Git associé à chaque version de dataset

git tag -a "v_dataset_202406" -m "Version stable du dataset de juin 2024" git push origin v_dataset_202406

Data Warehouses vs Data Lakes

Data Warehouses (Entrepôts de données)

  • Stockage structurĂ©, optimisĂ© pour les requĂŞtes SQL
  • DonnĂ©es propres, modĂ©lisĂ©es (ex : BigQuery, Snowflake, Redshift)
  • IdĂ©al pour les rapports, BI, agrĂ©gations

Data Lakes

  • Stockage brut, souvent en fichiers (ex : S3, GCS, HDFS)
  • Supporte donnĂ©es structurĂ©es / semi-structurĂ©es / non structurĂ©es
  • AdaptĂ© Ă  la Data Science, traitement batch ou streaming

Évolution :

  • Lakehouse = combinaison des deux (ex : Databricks Delta Lake)

Choix en contexte industriel :

CritèreWarehouseLakeLakehouse (hybride)
CoûtÉlevéFaible à modéréModéré
Performance requêtesOptimisée (indexation)MoyenneBonne avec Delta Engine
Volume & variétéLimitéMassif, tous typesMassif + structuration
Use case typiqueBI, dashboardsIA, Big Data, logsMLOps, BI + ML

Données sensibles : anonymisation, RGPD, etc.

Le traitement de données personnelles (noms, e-mails, logs, données médicales, etc.) est soumis à des régulations strictes comme le RGPD.

Principes fondamentaux :

  • Minimisation des donnĂ©es : ne collecter que ce qui est utile
  • Droit Ă  l’oubli : suppression Ă  la demande
  • Consentement explicite de l’utilisateur

Techniques d’anonymisation :

  • Masquage : remplacement des donnĂ©es sensibles
  • Pseudonymisation : transformation rĂ©versible avec clĂ©
  • DiffĂ©rential Privacy : ajout de bruit contrĂ´lĂ© aux donnĂ©es/statistiques

Implémentation : pseudonymisation simple

import hashlib def pseudonymize_email(email: str) -> str: return hashlib.sha256(email.encode()).hexdigest()

Bonnes pratiques MLOps :

  • Logger les accès aux donnĂ©es sensibles
  • SĂ©parer donnĂ©es sensibles des features utilisĂ©es
  • Documenter les politiques de rĂ©tention et d'accès
  • IntĂ©grer les vĂ©rifications RGPD dans les checklists de mise en production

Chapitre 3 — Environnements de développement

Environnements reproductibles

Pourquoi ?

Dans le cycle de vie MLOps, il est crucial de garantir que les résultats obtenus dans un environnement (ex. notebook local) soient reproductibles ailleurs (en CI/CD, sur serveur ou en production).

Outils majeurs :

  • Conda : gestion d’environnements et de dĂ©pendances isolĂ©s
  • virtualenv / venv : standard Python plus lĂ©ger
  • Docker : conteneurisation complète de l’environnement OS + dĂ©pendances

Exemple : Dockerfile pour un environnement ML typique

FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install --upgrade pip && pip install -r requirements.txt COPY . . CMD ["python", "src/train.py"]

Recommandations :

  • Figer les versions de chaque dĂ©pendance (pas de scikit-learn>=1.0)
  • Documenter la procĂ©dure de setup local, cloud, CI/CD
  • Versionner l’environnement (ex. environment.lock.yaml, Dockerfile) au mĂŞme titre que le code

Gestion des dépendances

Une mauvaise gestion des dépendances est la cause fréquente de bugs non reproductibles ou d’échecs en production.

Outils :

  • pip + requirements.txt : simple et standard, mais peu strict
  • Poetry : gestion moderne avec rĂ©solution et lockfile
  • pipenv : alternative avec fichiers Pipfile et Pipfile.lock

Exemple avancé avec Poetry

poetry init poetry add pandas scikit-learn mlflow poetry export -f requirements.txt --output requirements.txt --without-hashes

Bonnes pratiques :

  • Utiliser un lockfile (poetry.lock, Pipfile.lock, etc.) dans tous les environnements
  • Automatiser les installations dans vos workflows CI/CD
  • Utiliser pip freeze > requirements.txt uniquement pour archiver un Ă©tat figĂ©

Jupyter vs IDE vs Notebooks orchestrés

Jupyter (Notebook local)

  • Exploratoire, rapide Ă  utiliser, mais peu reproductible
  • Faible traçabilitĂ© (sauf avec nbconvert, papermill, etc.)

IDE (VSCode, PyCharm, etc.)

  • DĂ©veloppement structurĂ©, bon pour projets complexes
  • Compatible avec dĂ©bogage, tests, linting

Notebooks orchestrés

  • Utilisent Papermill, Dagster, Metaflow, etc. pour exĂ©cuter des notebooks dans des pipelines reproductibles

Exemple avec Papermill

papermill input.ipynb output.ipynb -p learning_rate 0.01 -p n_estimators 100

Recommandations :

  • Convertir les notebooks en scripts (nbconvert) avant CI/CD
  • Journaliser tous les paramètres et outputs (MLflow, Weights & Biases)
  • Ne pas mettre en production un .ipynb directement

Bonnes pratiques de gestion de code

Utilisation de Git

  • Branches par fonctionnalitĂ© ou par expĂ©rimentation (exp/, feat/, hotfix/)
  • Commits atomiques, messages clairs et normalisĂ©s (ex : Conventional Commits)

Pre-commit hooks

  • VĂ©rifications automatiques : formatage, typage, tests, lint
  • Outils : pre-commit, black, flake8, mypy

Exemple : configuration .pre-commit-config.yaml

repos: - repo: https://github.com/psf/black rev: 23.3.0 hooks: - id: black - repo: https://github.com/pre-commit/mirrors-flake8 rev: v6.0.0 hooks: - id: flake8

Bonnes pratiques :

  • IntĂ©grer les tests et hooks dans les workflows GitHub Actions
  • GĂ©nĂ©rer un changelog automatiquement Ă  partir des commits (conventional changelog)
  • Coupler gestion du code, des notebooks, des modèles et des artefacts dans une stratĂ©gie Git unifiĂ©e

Intégrer les tests et hooks dans les workflows GitHub Actions

L’objectif est d’éviter toute régression ou code non conforme dès le push.

Exemple de workflow .github/workflows/checks.yml

name: checks on: push: branches: [main] pull_request: branches: [main] jobs: lint-and-test: runs-on: ubuntu-latest steps: - name: Checkout repo uses: actions/checkout@v3 - name: Setup Python uses: actions/setup-python@v4 with: python-version: '3.10' - name: Install dependencies run: | pip install -r requirements.txt pip install black flake8 mypy pytest - name: Lint run: | black --check . flake8 . mypy src/ - name: Run tests run: pytest tests/

Générer un changelog automatiquement à partir des commits

Pourquoi ?

Pour faciliter les releases, communiquer efficacement les changements, et maintenir la documentation Ă  jour.

Méthodes :

  • Convention de nommage de commits : Conventional Commits

  • Outils :

    • standard-version (JS/npm)
    • cz / commitizen (Python-compatible)
    • semantic-release (automatique avec GitHub Actions)

Exemple avec cz

pip install commitizen cz init # Configure avec pyproject.toml cz bump # Incrémente version + changelog auto cz changelog # Génère ou met à jour CHANGELOG.md

Stratégie unifiée : code, notebooks, modèles, artefacts

Une bonne approche consiste à versionner et structurer l’ensemble du cycle de vie ML dans un dépôt cohérent et automatisé.

Structure recommandée

repo/
├── notebooks/              # Explorations initiales (tracking MLflow ou Papermill)
├── src/                    # Code de production modulaire
├── models/                 # Fichiers de modèles exportés (liens DVC ou MLflow)
├── data/                   # Symboliques DVC ou répertoire ignoré
├── tests/                  # Tests unitaires, d’intégration, etc.
├── mlruns/                 # Logs MLflow (si local)
├── .github/workflows/      # Pipelines CI/CD
├── Dockerfile              # Environnement conteneurisé
├── dvc.yaml                # Pipelines de traitement data
└── pyproject.toml          # Config globale (formatage, version, changelog, etc.)

Automatisations

  • CI/CD dĂ©clenchant : lint → test → train → log modèle → push artefact → dĂ©ploiement
  • Git tags dĂ©clenchant des versions + changelogs + publication
  • Liaison avec MLflow pour chaque commit/tag

Règles de relecture de code en équipe ML

  • Toute pull request doit contenir :

    • description claire
    • justification mĂ©tier/technique
    • preuves reproductibles (ex : run ID MLflow)
  • Revue obligatoire Ă  deux pairs pour les Ă©tapes critiques : ingestion, entraĂ®nement, scoring

  • Tests automatisĂ©s requis avant merge, avec rapport dans le commentaire PR


Chapitre 4 — Expérimentation et suivi

Suivi des expériences

L'entraînement de modèles implique l'exploration d'une multitude de combinaisons : algorithmes, hyperparamètres, jeux de données, stratégies de preprocessing. Documenter et tracer ces expériences est essentiel pour garantir la reproductibilité et identifier les meilleurs résultats.

Outils de tracking

  • MLflow Tracking : open source, extensible, très utilisĂ©
  • Weights & Biases (W&B) : complet, orientĂ© collaboration
  • Neptune.ai : interface puissante avec gestion d’équipes
  • Comet ML : supporte mĂ©triques, graphiques, comparaison d’expĂ©riences

Exemple : tracking avec MLflow

import mlflow mlflow.start_run() mlflow.log_param("learning_rate", 0.01) mlflow.log_metric("accuracy", 0.91) mlflow.sklearn.log_model(model, "model") mlflow.end_run()

Bonnes pratiques

  • Utiliser des tags et noms explicites (exp_baseline_lr001, tuned_random_forest)
  • Lier les run IDs Ă  des commits Git
  • Stocker les artefacts de modèle dans un registre (MLflow Registry ou DVC)
  • Versionner les donnĂ©es avec DVC et les rĂ©fĂ©rencer dans l’expĂ©rience
  • Mettre en place un tableau de bord centralisĂ© (ex. via mlflow ui ou W&B Reports)

Gestion des hyperparamètres

Les hyperparamètres influencent fortement la performance d’un modèle. Leur recherche doit être systématisée et reproductible.

Méthodes classiques

  • Grid Search : exploration exhaustive
  • Random Search : Ă©chantillonnage alĂ©atoire

Méthodes avancées

  • Bayesian Optimization : ex. avec optuna
  • Hyperband : algorithme adaptatif efficace
  • Population-Based Training : stratĂ©gies Ă©volutives (ex. Ray Tune)

Exemple avec Optuna

import optuna def objective(trial): lr = trial.suggest_float("lr", 1e-4, 1e-1, log=True) clf = SomeModel(learning_rate=lr) accuracy = cross_val_score(clf, X, y).mean() return accuracy study = optuna.create_study(direction="maximize") study.optimize(objective, n_trials=50)

Bonnes pratiques

  • DĂ©finir des espaces de recherche rĂ©alistes
  • Combiner Optuna avec MLflow pour tracker automatiquement les runs
  • Limiter le coĂ»t par run via early stopping ou rĂ©duction de dataset
  • ParallĂ©liser les recherches (Ray, Optuna, SageMaker Tuning Jobs)

Réplication des expériences

Pourquoi c’est crucial ?

  • Garantir que les rĂ©sultats sont fiables, pas dus au hasard ou Ă  des fuites
  • Permettre Ă  d'autres Ă©quipes ou Ă  la CI/CD de relancer un entraĂ®nement identique

Stratégies

  • Fixer les seeds alĂ©atoires (NumPy, Torch, TensorFlow)
  • Versionner tout : code, data, config, modèle, environnement
  • Centraliser la configuration via Hydra ou YAML/JSON

Exemple : script totalement réplicable

python train.py --config config.yaml --seed 42
# config.yaml model: type: xgboost max_depth: 7 learning_rate: 0.01 training: test_split: 0.2 n_estimators: 500

Comparaison des modèles

Une fois plusieurs modèles entraînés, il est essentiel de comparer leurs performances de manière rigoureuse.

Métriques courantes

  • Classification : accuracy, precision, recall, F1-score, ROC AUC
  • RĂ©gression : RMSE, MAE, R²
  • SurvĂŞtement ? : courbes d’apprentissage, courbes de validation croisĂ©e

Outils de visualisation

  • MLflow UI : graphiques et tableaux d’expĂ©riences
  • W&B Sweeps : visualisation interactive
  • TensorBoard : pour les frameworks deep learning

Bonnes pratiques

  • Comparer non seulement la performance, mais aussi :

    • la stabilitĂ© (Ă©cart-type sur k-folds)
    • le coĂ»t d’entraĂ®nement (temps, mĂ©moire)
    • la taille du modèle (pour le dĂ©ploiement)
  • Documenter toutes les comparaisons dans un changelog expĂ©rimental versionnĂ©

  • Garder un modèle « champion » par tâche dans un registre et archiver les anciens


Chapitre 5 — Entraînement des modèles

Local, cloud et hybride : stratégies d'entraînement

Entraînement local

  • Avantages : rapide Ă  mettre en Ĺ“uvre, pas de coĂ»t cloud
  • Limites : ressources limitĂ©es (RAM, GPU), non scalable, reproductibilitĂ© manuelle

Entraînement sur le cloud

  • Services managĂ©s : AWS SageMaker, Google Vertex AI, Azure ML
  • Infrastructure IaaS : Kubernetes + GPU (ex. GKE, AKS, EKS)

Stratégie hybride

  • PrĂ©-traitement et prototypage en local
  • EntraĂ®nement distribuĂ© et orchestration sur cloud
  • Artefacts synchronisĂ©s via DVC, MLflow, ou stockage object (S3, GCS)

Bonnes pratiques

  • Automatiser les transferts de donnĂ©es et modèles
  • DĂ©clencher les entraĂ®nements depuis un pipeline CI/CD (GitHub Actions, Airflow)
  • SĂ©curiser les accès cloud avec secrets manager ou vault

Accélération avec GPU/TPU

Frameworks compatibles

  • TensorFlow, PyTorch, JAX, RAPIDS (cuDF, cuML)

Bonnes pratiques :

  • Activer le profiling GPU (torch.cuda.Profiler, tf.profiler)
  • LibĂ©rer explicitement la mĂ©moire GPU entre les runs
  • Mesurer le batch size maximal par modèle pour optimiser l'utilisation

Exemple (PyTorch)

import torch device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = MyModel().to(device)

TPUs

  • Disponibles via Google Cloud ou Colab
  • IdĂ©al pour modèles massifs ou entraĂ®nement distribuĂ© Ă  grande Ă©chelle

Orchestration d'entraînement

Un entraînement en production ne se lance jamais manuellement : il est orchestré.

Outils open-source :

  • Airflow : DAGs, scheduling, dĂ©pendances
  • Prefect : workflow Pythonic, rĂ©silient
  • Kubeflow Pipelines : pour K8s, avec support ML complet
  • Dagster : typage fort, monitoring intĂ©grĂ©

Exemple : DAG Airflow simplifié

from airflow import DAG from airflow.operators.python import PythonOperator from datetime import datetime def train_model(): ... # logiques d'entraînement dag = DAG( 'train_model_pipeline', start_date=datetime(2023, 1, 1), schedule_interval='@daily' ) train_task = PythonOperator( task_id='train_model', python_callable=train_model, dag=dag )

Bonnes pratiques

  • GĂ©rer les Ă©checs avec des retries et des alertes
  • SĂ©parer les Ă©tapes : preprocessing → entraĂ®nement → Ă©valuation → packaging
  • Utiliser un DAG versionnĂ© avec dvc.yaml pour les pipelines data

Gestion des ressources

Scénarios fréquents

  • Modèle trop lent ? → profiler et parallĂ©liser (batching, num_workers)
  • Trop gourmand ? → simplifier (distillation, pruning, quantization)
  • EntraĂ®nement interrompu ? → checkpoints frĂ©quents, reprise automatique

Optimisations clés

  • DataLoader bien paramĂ©trĂ© (shuffle, num_workers, pin_memory)
  • Mixed Precision Training (ex: torch.cuda.amp) : accĂ©lère sans perte significative
  • Early stopping : Ă©viter d'Ă©puiser inutilement les ressources

Exemple : mixed precision training (PyTorch)

from torch.cuda.amp import GradScaler, autocast scaler = GradScaler() for inputs, targets in dataloader: optimizer.zero_grad() with autocast(): outputs = model(inputs) loss = criterion(outputs, targets) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()

Distribution de l'entraînement

Approches :

  • Data Parallel : mĂŞme modèle sur plusieurs GPU (PyTorch DDP, Horovod)
  • Model Parallel : modèle rĂ©parti sur plusieurs machines (gros LLM)
  • Parameter Server : partage centralisĂ© des poids

Outils/frameworks

  • PyTorch Lightning + DDP
  • Ray Train : orchestration distribuĂ©e moderne
  • SageMaker Training Jobs : distribuĂ© et managĂ©
  • Accelerate (Hugging Face) : wrappe DDP/TPU/CPU facilement

Exemple : DDP avec PyTorch Lightning

from pytorch_lightning import Trainer trainer = Trainer( accelerator="gpu", devices=4, strategy="ddp" ) trainer.fit(model, dataloader)

Bonnes pratiques

  • Monitorer les workers distribuĂ©s (logs + Prometheus/Grafana)
  • Synchroniser les artefacts entre nĹ“uds
  • Tester d’abord en local avec 1 worker simulĂ© (--num_processes=1)

Chapitre 6 — Tests & Validation des modèles

Tests unitaires pour le code ML

Même dans un projet de data science, tout le code doit être testé :

  • Fonctions de preprocessing
  • Fonctions d’ingĂ©nierie de features
  • MĂ©triques personnalisĂ©es
  • Chargement/sĂ©rialisation de modèle

Outils recommandés :

  • pytest : framework de test Python standard
  • hypothesis : tests de propriĂ©tĂ© (valeurs alĂ©atoires intelligentes)
  • tox ou nox : tests sur plusieurs environnements

Exemple : test unitaire d’une fonction de normalisation

def normalize(x): return (x - x.mean()) / x.std() def test_normalize(): import numpy as np x = np.array([1, 2, 3, 4, 5]) z = normalize(x) assert np.isclose(z.mean(), 0.0, atol=1e-6) assert np.isclose(z.std(), 1.0, atol=1e-6)

Tests de performance et robustesse

Les modèles doivent être évalués au-delà des seules métriques standard.

Types de tests :

  • Stress tests : Ă©valuer la stabilitĂ© avec des inputs bruitĂ©s ou extrĂŞmes
  • Tests de performance : latence, RAM/VRAM, dĂ©bit (inference/sec)
  • Tests mĂ©tier : sensibilitĂ© Ă  des cas clĂ©s ou critiques

Exemple : test de robustesse Ă  des valeurs aberrantes

def test_model_robustness(): X_outlier = generate_abnormal_inputs() predictions = model.predict(X_outlier) assert not np.any(np.isnan(predictions))

Bonnes pratiques :

  • Suivre une courbe prĂ©cision/latence pour arbitrage
  • IntĂ©grer ces tests dans les workflows de validation
  • Exiger une robustesse documentĂ©e avant mise en production

Détection de dérive (drift) et biais

Les modèles peuvent perdre en pertinence si la distribution des données change (dérive) ou s’ils amplifient des inégalités (biais).

Types de dérives :

  • Data drift : changement dans les features d’entrĂ©e
  • Concept drift : changement dans la relation X → Y

Outils de détection :

  • Evidently (open-source, simple Ă  intĂ©grer)
  • Fiddler, WhyLabs, Amazon Clarify (solutions SaaS)
  • Scikit-multiflow pour les flux en ligne

Exemple avec Evidently

from evidently.report import Report from evidently.metric_preset import DataDriftPreset report = Report(metrics=[DataDriftPreset()]) report.run(reference_data=df_ref, current_data=df_prod) report.save_html("drift_report.html")

Tests anti-biais :

  • Problèmes : dĂ©sĂ©quilibre, traitement inĂ©quitable, proxies indirects
  • MĂ©triques : Equal Opportunity, Demographic Parity, TPR/FPR gap
  • RĂ©parations : re-weighting, post-processing, fairness-aware learning

Validation croisée automatique

La validation croisée (cross-validation) évalue la généralisation du modèle. Elle doit être systématisée dans les pipelines.

Méthodes principales :

  • K-Fold (stratifiĂ© ou non)
  • Leave-One-Out
  • Time Series Split (pour donnĂ©es temporelles)

Implémentation avec sklearn

from sklearn.model_selection import cross_validate scores = cross_validate(model, X, y, scoring=["accuracy", "f1"], cv=5, return_train_score=True) print(scores)

Bonnes pratiques :

  • Toujours stratifier les splits en classification
  • SĂ©parer pipeline d’entraĂ®nement et validation (eviter les fuites de donnĂ©es)
  • Logguer tous les splits, seeds, et scores dans MLflow
  • Étendre la validation croisĂ©e aux pipelines complets (avec Pipeline sklearn, Optuna, PyCaret, etc.)

Chapitre 7 — Déploiement des modèles

Modèles servables : formats et compatibilité

Avant tout déploiement, un modèle doit être exporté dans un format standardisé.

Formats de sérialisation

  • Pickle / Joblib : spĂ©cifique Ă  Python, non sĂ©curisĂ© (ne jamais charger depuis une source non fiable)
  • ONNX (Open Neural Network Exchange) : format inter-framework, compatible avec C++, JavaScript, mobile, edge
  • TorchScript : optimisĂ© pour la production avec PyTorch
  • TensorFlow SavedModel : standard de TensorFlow

Bonnes pratiques

  • Exporter avec version, signature d’entrĂ©e/sortie, mĂ©tadonnĂ©es
  • Valider les entrĂ©es avec des schĂ©mas (pydantic, marshmallow, OpenAPI)
  • Tester les modèles après export avec des tests fonctionnels

Déploiement avec Flask/FastAPI

Usage : exposer le modèle en tant qu’API REST

Exemple avec FastAPI

from fastapi import FastAPI from pydantic import BaseModel import joblib app = FastAPI() model = joblib.load("model.joblib") class Input(BaseModel): feature1: float feature2: float @app.post("/predict") def predict(input: Input): data = [[input.feature1, input.feature2]] prediction = model.predict(data) return {"prediction": prediction.tolist()}

Bonnes pratiques

  • Ajouter Swagger (auto-gĂ©nĂ©rĂ©)
  • Ajouter validation stricte des entrĂ©es
  • Journaliser les requĂŞtes et latence (via middleware)
  • SĂ©parer service API / logique mĂ©tier / modèle pour maintenabilitĂ©

Docker + Kubernetes : production scalable

Dockerisation

  • Fournit un environnement isolĂ© et reproductible
  • Facilite la portabilitĂ© : local → CI → cloud

Exemple : Dockerfile

FROM python:3.10 WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]

Kubernetes

  • Orchestration de containers : scaling, rolling updates, auto-recovery
  • YAML de dĂ©ploiement typique :
apiVersion: apps/v1 kind: Deployment metadata: name: ml-api spec: replicas: 3 selector: matchLabels: app: ml-api template: metadata: labels: app: ml-api spec: containers: - name: api image: myorg/ml-api:latest ports: - containerPort: 8080

Bonnes pratiques

  • Utiliser des probes (liveness/readiness)
  • Centraliser les logs avec Fluentd ou Loki
  • GĂ©rer les secrets avec K8s secrets ou Hashicorp Vault
  • Surveiller avec Prometheus + Grafana

Serveurs de modèles spécialisés

Solutions

  • MLflow Models : serveurs REST auto-gĂ©nĂ©rĂ©s (mlflow models serve)
  • TensorFlow Serving : performant pour modèles TF
  • TorchServe : optimisĂ© pour modèles PyTorch
  • MLServer : standard compatible avec BentoML, FastAPI, SKLearn

Avantages

  • Meilleures performances qu’un serveur API maison
  • IntĂ©gration native avec des pipelines CI/CD
  • Multiples modèles, versioning, autoscaling natif (ex : Seldon Core)

Exemple : servir un modèle avec MLflow

mlflow models serve -m runs:/<run-id>/model --port 1234

Services managés (SageMaker, Vertex AI, Azure ML)

Quand les utiliser ?

  • Équipes petites ou non expertes en infra
  • Besoin de gestion simplifiĂ©e du cycle complet (train + deploy + monitor)

Fonctionnalités typiques

  • One-click deployment
  • Auto-scaling & A/B testing
  • Monitoring intĂ©grĂ©
  • Modèle registry et gestion des versions

Inconvénients

  • CoĂ»t Ă©levĂ© Ă  l’échelle
  • Verrouillage propriĂ©taire (vendor lock-in)
  • Personnalisation limitĂ©e

CI/CD pour modèles ML

Objectifs

  • Automatiser : tests → packaging → validation → dĂ©ploiement
  • Versionner tous les artefacts (modèle, data, code, config)

Pipelines typiques

  1. Trigger : push/tag Git ou validation humaine
  2. Test du modèle (fonctionnel + perf)
  3. Packaging (Docker, ONNX, archive MLflow)
  4. Publication (registry, S3, DVC remote)
  5. Déploiement (API, Kubernetes, cloud)

Exemple de pipeline GitHub Actions (déploiement MLflow)

jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Python uses: actions/setup-python@v4 with: python-version: '3.10' - name: Install deps & MLflow run: pip install -r requirements.txt mlflow - name: Deploy model run: mlflow models serve -m runs:/latest/model --port 5000

Bonnes pratiques

  • SĂ©parer les jobs train/test/deploy
  • Restreindre les dĂ©ploiements au main ou Ă  certains tags (v*.*.*)
  • Ajouter un environnement de staging
  • Monitorer les latences post-dĂ©ploiement automatiquement

Chapitre 8 — Surveillance en production

Monitoring des performances de modèles

Une fois déployé, un modèle doit être surveillé en continu pour garantir :

  • Sa disponibilitĂ© (temps de rĂ©ponse, uptime)
  • Sa performance mĂ©tier (prĂ©cision, recall, etc.)
  • L'absence de dĂ©rive statistique (features, labels)
  • L’usage effectif de ses prĂ©dictions

Outils utilisés

  • Prometheus : collecte de mĂ©triques
  • Grafana : visualisation
  • Evidently : dĂ©tection automatique de dĂ©rive
  • Seldon Core / Alibi Detect : framework pour ML sur Kubernetes avec outils de monitoring intĂ©grĂ©s

Exemple : métriques Prometheus exposées depuis FastAPI

from prometheus_client import Counter, Histogram, start_http_server prediction_count = Counter('predictions_total', 'Total predictions made') prediction_latency = Histogram('prediction_latency_seconds', 'Time for prediction') @app.post("/predict") @prediction_latency.time() def predict(input: Input): prediction_count.inc() return {"prediction": model.predict(...)}

Logging et traçabilité

Chaque appel au modèle doit être loggé :

  • EntrĂ©es utilisateur (après validation/anonymisation)
  • Timestamp, user ID ou session ID
  • Temps de rĂ©ponse, statut
  • RĂ©sultat retournĂ© (et Ă©ventuelle probabilitĂ© ou confiance)

Bonnes pratiques

  • Ajouter un middleware de journalisation
  • Utiliser des outils comme ELK Stack (Elasticsearch + Logstash + Kibana), Loki, ou Fluentd
  • CorrĂ©ler logs applicatifs avec les mĂ©triques de modèle
  • S'assurer de la conformitĂ© RGPD pour les logs de production

Exemple : middleware FastAPI

@app.middleware("http") async def log_requests(request: Request, call_next): start = time.time() response = await call_next(request) duration = time.time() - start log.info(f"{request.method} {request.url} {duration:.3f}s") return response

Alerte sur les métriques clés

Un modèle peut être silencieusement dégradé en production.

Cas fréquents à détecter

  • Augmentation brutale du taux d'erreur ou des requĂŞtes nulles
  • Chute soudaine de prĂ©cision ou de score mĂ©tier
  • Changements dans la distribution des entrĂ©es (drift)

Système d’alerte

  • Alertmanager (couplĂ© Ă  Prometheus)
  • Notifications : Slack, e-mail, webhook, dashboard visuel

Exemple : règle d’alerte Prometheus

groups: - name: model_alerts rules: - alert: HighLatency expr: prediction_latency_seconds_bucket{le="1.0"} < 0.5 for: 5m labels: severity: warning annotations: summary: "Latence de prédiction élevée"

Mise à jour continue des modèles

Même les meilleurs modèles doivent être mis à jour périodiquement. En production, cela peut être fait de manière :

  • Manuelle (re-training pĂ©riodique avec validation humaine)
  • AutomatisĂ©e (re-training dĂ©clenchĂ© par dĂ©tection de dĂ©rive ou baisse de performance)

Techniques et outils

  • Scheduled retraining via Airflow ou Prefect
  • Continuous Training (CT) avec dĂ©tection automatique + dĂ©clenchement pipeline
  • Shadow deployment : tester le nouveau modèle sans l’exposer (split du trafic)
  • Canary release : dĂ©ploiement progressif pour valider la nouvelle version

Étapes d’un cycle complet

  1. Surveillance et collecte continue (logs, métriques, dérive)
  2. Déclenchement conditionnel ou périodique
  3. Réentraînement (sur les nouvelles données collectées)
  4. Validation
  5. Publication ou rollback selon résultats

Exemple de déclenchement Airflow

def check_drift(): drift = run_drift_detector() return "retrain" if drift else "skip" branch = BranchPythonOperator( task_id='drift_check', python_callable=check_drift, dag=dag )

Synthèse

Surveiller un modèle en production ne se limite pas à vérifier sa disponibilité. Il faut également :

  • Comprendre l’usage rĂ©el du modèle
  • Maintenir une visibilitĂ© complète sur les entrĂ©es, sorties, erreurs
  • ĂŠtre en mesure de rĂ©agir rapidement Ă  toute dĂ©rive
  • Organiser les mises Ă  jour sans perturber l’utilisateur final

Le monitoring d’un modèle doit être traité comme un produit vivant, évolutif, avec des responsabilités partagées entre data scientists, ingénieurs, et opérationnels.


Chapitre 9 — Automatisation et orchestration

Pipelines automatisés avec Airflow / Prefect

L'automatisation des workflows est cruciale pour garantir la reproductibilité, la fiabilité et la scalabilité des projets ML. Deux outils sont aujourd'hui largement utilisés : Apache Airflow et Prefect.

Airflow

  • BasĂ© sur le concept de DAG (Directed Acyclic Graph).
  • Chaque tâche est un opĂ©rateur Python ou Bash.
  • Excellente extensibilitĂ© avec des plugins.
from airflow import DAG from airflow.operators.python import PythonOperator from datetime import datetime def preprocess(): # Code de preprocessing pass def train_model(): # Code d'entraînement pass dag = DAG('ml_pipeline', start_date=datetime(2024, 1, 1), schedule_interval='@daily') preprocess_task = PythonOperator(task_id='preprocess', python_callable=preprocess, dag=dag) train_task = PythonOperator(task_id='train', python_callable=train_model, dag=dag) preprocess_task >> train_task

Prefect

  • Plus moderne, plus orientĂ© objet.
  • S'intègre facilement Ă  DVC, MLflow, et des services cloud.
from prefect import flow, task @task def preprocess(): pass @task def train(): pass @flow def ml_flow(): data = preprocess() train() ml_flow()

GitOps appliqué au MLOps

GitOps consiste à piloter l’ensemble des déploiements via Git comme source unique de vérité. Il est de plus en plus appliqué aux projets ML.

Principes

  • DĂ©ploiement dĂ©clenchĂ© par des commits Git (push/PR/tag).
  • Repos sĂ©parĂ©s pour le code, les modèles, les donnĂ©es et la configuration.
  • IntĂ©gration continue + livraison continue (CI/CD) via outils comme ArgoCD, FluxCD.

Avantages

  • TraçabilitĂ© complète des changements
  • Rollback simplifiĂ©s
  • Approche dĂ©clarative et auditable

Exemple : déploiement via ArgoCD

apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: ml-deploy spec: source: repoURL: https://github.com/myorg/ml-deploy targetRevision: HEAD path: k8s/ destination: server: https://kubernetes.default.svc namespace: production project: default

Feature Stores (Feast, Tecton)

Les Feature Stores sont des systèmes spécialisés pour le stockage, la gestion et la réutilisation des variables explicatives.

Objectifs

  • Éviter les dĂ©rives entre entraĂ®nement et production
  • Partager les features entre Ă©quipes et projets
  • Suivre le versioning et les mises Ă  jour

Feast

  • Open-source, très utilisĂ©
  • Connecteurs vers Redis, BigQuery, Snowflake…
from feast import FeatureStore store = FeatureStore(repo_path="my_feature_repo") data = store.get_online_features( features=["user_profile:age", "user_profile:gender"], entity_rows=[{"user_id": 1234}] ).to_dict()

Tecton

  • Solution commerciale très complète
  • Forte intĂ©gration avec Spark, Kafka, Snowflake…

Entraînement et déploiement en continu (CT/CI/CD/CM)

Le ML a besoin de pipelines robustes qui intègrent :

  • CT (Continuous Training) : rĂ©entraĂ®nement automatique Ă  intervalle ou sur dĂ©clencheur
  • CI/CD (IntĂ©gration et livraison continues) : vĂ©rification + packaging + dĂ©ploiement
  • CM (Continuous Monitoring) : supervision active du modèle

Enchaînement typique

  1. Nouveau lot de données → déclenche le pipeline Airflow
  2. Réentraînement + évaluation avec MLflow
  3. Validation automatisée des performances
  4. Déploiement (si performances > seuil) via GitOps
  5. Monitoring déclenché (Prometheus, Grafana, Evidently…)

Exemple de pipeline CI/CD GitHub Actions

name: ml-cicd on: push: branches: - main jobs: train-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Setup Python uses: actions/setup-python@v2 with: python-version: 3.9 - name: Install deps run: pip install -r requirements.txt - name: Train model run: python scripts/train.py - name: Deploy model run: bash deploy.sh

L’automatisation et l’orchestration des workflows ML réduisent les erreurs humaines, améliorent la reproductibilité, et accélèrent le time-to-market des modèles. Ce chapitre fournit les briques pour construire des pipelines robustes et scalables, du prototypage au déploiement.



Chapitre 10 — Sécurité, éthique et conformité

Sécurisation des modèles et des APIs

La sécurité des modèles de ML ne se limite pas à l’accès au modèle lui-même. Il faut aussi protéger l’ensemble du pipeline : code, données, artefacts, endpoints et infrastructure.

Menaces courantes

  • Reverse engineering de modèles : extraction du modèle via des appels API.
  • Attaques par injection de donnĂ©es (data poisoning).
  • Attaques par Ă©vasion (adversarial examples).
  • Fuites de donnĂ©es sensibles Ă  travers les rĂ©ponses du modèle.

Bonnes pratiques

  • Chiffrement des modèles en transit et au repos.
  • Authentification forte pour les APIs (OAuth2, JWT).
  • Limitation du dĂ©bit et analyse comportementale des appels API.
  • Signature et vĂ©rification des modèles.
  • Sandboxing ou conteneurisation de l’environnement d’infĂ©rence.

Outils et techniques

  • ONNX Runtime avec chiffrement intĂ©grĂ©.
  • TF Encrypted / PySyft pour les modèles sensibles.
  • API Gateway + WAF (Web Application Firewall) devant chaque service de ML.

Dérives algorithmiques, fairness & explainability

Dérives algorithmiques

  • DĂ©pendance aux donnĂ©es de production : dĂ©rives de distribution.
  • Concept drift (changement du sens des variables).
  • Bias drift (changement dans l'Ă©quilibre des classes ou des groupes).

Fairness (équité)

  • ReprĂ©sentation biaisĂ©e : minoritĂ©s mal reprĂ©sentĂ©es → prĂ©dictions injustes.
  • MĂ©triques : Demographic Parity, Equalized Odds, Disparate Impact.
  • StratĂ©gies : rebalancer les donnĂ©es, entraĂ®ner des modèles contraints ou appliquer un post-traitement.

Explainability

  • Critique dans les systèmes sensibles (santĂ©, finance, justice).

  • MĂ©thodes :

    • SHAP : importance des features par instance.
    • LIME : approximation locale du modèle.
    • Integrated Gradients, Captum pour les rĂ©seaux de neurones.
  • IntĂ©gration de l’explicabilitĂ© dans les dashboards ou les systèmes de dĂ©cision (sous forme d’annotations ou d’analyses).


Auditabilité des modèles

L’auditabilité vise à assurer une traçabilité complète des actions, transformations et décisions du pipeline ML.

Composants clés

  • Suivi des versions de code, de donnĂ©es, de modèles et de paramètres.
  • Journaux d'exĂ©cution et mĂ©tadonnĂ©es d'entraĂ®nement.
  • Enregistrement des inputs/outputs lors de la prĂ©diction.

Outils

  • MLflow Tracking avec artefacts versionnĂ©s.
  • DVC + Git pour le versioning de datasets et modèles.
  • Neptune.ai / Weights & Biases pour l'observabilitĂ© Ă©tendue.

Objectifs

  • RĂ©trospective sur les performances passĂ©es.
  • ReproductibilitĂ© scientifique ou rĂ©glementaire.
  • ContrĂ´le qualitĂ© et analyse des incidents.

Conformité réglementaire (RGPD, HIPAA)

RGPD (Europe)

  • Minimisation des donnĂ©es personnelles.
  • Droit Ă  l’explication (Art. 22).
  • Consentement explicite et rĂ©vocable.
  • Anonymisation ou pseudonymisation obligatoire.
  • Encadrement des transferts hors UE.

HIPAA (États-Unis)

  • Protection des donnĂ©es de santĂ© (PHI).
  • Audit logs obligatoires.
  • Cryptage des transmissions et du stockage.

Implications concrètes

  • Choix d’un hĂ©bergement conforme.
  • Journalisation des accès et des dĂ©cisions.
  • Fourniture d’un mĂ©canisme de retrait ou de correction des donnĂ©es.
  • Design du modèle orientĂ© vers la transparence (modèles interprĂ©tables par design quand c’est possible).

La sécurité, l'éthique et la conformité sont des piliers trop souvent négligés dans le déploiement de modèles ML. Ce chapitre vous permet de comprendre les risques réels, de structurer les réponses techniques et organisationnelles, et de rendre vos systèmes auditables, équitables et légitimes face à la société et au droit.



Chapitre 11 — Cas pratiques

MLOps complet sur un cas réel : prédiction de churn

Ce cas pratique met en œuvre toutes les briques vues précédemment, à travers un projet complet de bout en bout. Nous allons prédire le risque de désabonnement d’un utilisateur dans un service en ligne, en temps quasi-réel.

Objectif

Anticiper les utilisateurs susceptibles de se désabonner dans les 30 prochains jours afin d'agir proactivement (offre personnalisée, relance, etc.).


Étape 1 : Ingestion de données

Source : événements d’usage collectés en continu (clics, connexions, achats, navigation).

Technologies utilisées :

  • Kafka : ingestion temps rĂ©el.
  • Kafka Connect + S3 Sink : enregistrement dans un lac de donnĂ©es brut (S3).

Instructions détaillées :

  1. Crée un cluster Kafka local avec Docker Compose :
version: '2' services: zookeeper: image: confluentinc/cp-zookeeper:latest environment: ZOOKEEPER_CLIENT_PORT: 2181 kafka: image: confluentinc/cp-kafka:latest depends_on: - zookeeper environment: KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
  1. Lance avec : docker-compose up -d
  2. Configure Kafka Connect avec un connecteur S3 Sink (exemple en JSON à envoyer à l’API REST de Kafka Connect) :
{ "name": "s3-sink", "config": { "connector.class": "io.confluent.connect.s3.S3SinkConnector", "topics": "user-events", "s3.bucket.name": "mlops-churn", "s3.part.size": 5242880, "flush.size": 3, "storage.class": "io.confluent.connect.s3.storage.S3Storage", "format.class": "io.confluent.connect.s3.format.json.JsonFormat", "schema.compatibility": "NONE" } }
  1. Tester la chaîne complète en publiant des messages dans user-events et vérifier dans S3.

Étape 2 : Nettoyage & prétraitement

Objectif : transformer les données brutes en un format exploitable pour l’entraînement.

Technologies utilisées :

  • Apache Spark pour le traitement distribuĂ©.
  • DVC (Data Version Control) pour versionner les jeux de donnĂ©es nettoyĂ©s.

Instructions détaillées :

  1. Installe Spark localement ou via Docker :
pip install pyspark
  1. Écris un script de transformation PySpark :
from pyspark.sql import SparkSession from pyspark.sql.functions import col, to_date spark = SparkSession.builder.appName("Preprocessing").getOrCreate() df = spark.read.json("s3a://mlops-churn/raw-events/") cleaned_df = df.filter(col("event_type").isNotNull()) \ .withColumn("event_date", to_date(col("timestamp"))) \ .dropna(subset=["user_id"]) cleaned_df.write.parquet("cleaned-data/")
  1. Versionne les données avec DVC :
dvc init dvc add cleaned-data/ git add cleaned-data.dvc .gitignore git commit -m "Ajout données nettoyées"
  1. Connecte DVC à un stockage distant (ex. : S3, SSH, GDrive).

Étape 3 : Feature Engineering automatisé

Objectif : extraire des variables pertinentes, historisées, et cohérentes pour l’entraînement et l’inférence.

Technologies utilisées :

  • Apache Airflow pour orchestrer le calcul des features.
  • Feast comme Feature Store.

Instructions détaillées :

  1. Installe Feast et configure le projet :
pip install feast feast init churn_project cd churn_project
  1. Exemple d'entité et de features :
# churn_project/feature_repo/entity.py from feast import Entity user = Entity(name="user_id", join_keys=["user_id"]) # churn_project/feature_repo/feature_view.py from feast import FeatureView, Field from feast.types import Float32 from datetime import timedelta user_activity_view = FeatureView( name="user_activity", entities=["user_id"], ttl=timedelta(days=30), schema=[ Field(name="avg_session_duration", dtype=Float32), Field(name="support_tickets_last_30d", dtype=Float32), ], online=True, source=... # Source définie dans data_source.py )
  1. Matérialise les features :
feast apply feast materialize-incremental $(date +%F)
  1. Utilise Airflow pour automatiser les jobs de calcul et de push vers Feast.

Étape 4 : Entraînement et validation

Objectif : entraîner un modèle robuste sur les données et valider ses performances avant packaging.

Technologies utilisées :

  • scikit-learn ou XGBoost pour les modèles tabulaires.
  • MLflow pour le suivi des expĂ©riences.
  • DVC pour versionner les datasets et modèles.

Instructions détaillées :

  1. Crée un environnement Python dédié :
python -m venv env source env/bin/activate pip install pandas scikit-learn xgboost mlflow dvc
  1. Prépare les données (depuis les features matérialisées) :
import pandas as pd from sklearn.model_selection import train_test_split features = pd.read_parquet("cleaned-data/features.parquet") X = features.drop("churned", axis=1) y = features["churned"] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
  1. Entraîne un modèle XGBoost avec suivi MLflow :
import mlflow import xgboost as xgb from sklearn.metrics import roc_auc_score mlflow.start_run() model = xgb.XGBClassifier(eval_metric="auc") model.fit(X_train, y_train) preds = model.predict_proba(X_test)[:, 1] auc = roc_auc_score(y_test, preds) mlflow.log_metric("roc_auc", auc) mlflow.sklearn.log_model(model, "model") mlflow.end_run()
  1. Versionne le modèle avec DVC :
dvc add model.pkl git add model.pkl.dvc git commit -m "Ajout modèle XGBoost"

Étape 5 : Packaging, déploiement et CI/CD

Objectif : transformer le modèle validé en une API déployable, intégrer dans une chaîne CI/CD, et orchestrer les mises à jour.

Technologies utilisées :

  • FastAPI pour exposer l’API.
  • Docker pour packager l’application.
  • GitHub Actions ou GitLab CI pour automatiser les tests, le build et le dĂ©ploiement.
  • Kubernetes (avec Helm) pour le dĂ©ploiement.

Instructions détaillées :

1. Créer une API avec FastAPI

# api/app.py from fastapi import FastAPI, Request import joblib import pandas as pd app = FastAPI() model = joblib.load("model.pkl") @app.post("/predict") async def predict(request: Request): data = await request.json() df = pd.DataFrame([data]) prediction = model.predict_proba(df)[0][1] return {"churn_probability": prediction}

2. Dockeriser l'application

# Dockerfile FROM python:3.10 WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]

requirements.txt :

fastapi
uvicorn
pandas
scikit-learn
xgboost
joblib

3. Construire et tester l’image

docker build -t churn-api . docker run -p 8000:8000 churn-api

Test avec curl :

curl -X POST http://localhost:8000/predict \ -H "Content-Type: application/json" \ -d '{"feature1": 0.12, "feature2": 3, ...}'

4. CI/CD avec GitHub Actions (exemple de .github/workflows/deploy.yml)

name: Deploy to Kubernetes on: push: branches: [main] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build Docker image run: docker build -t ghcr.io/your_user/churn-api:latest . - name: Push to GitHub Container Registry run: | echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u your_user --password-stdin docker push ghcr.io/your_user/churn-api:latest

5. Déploiement Kubernetes avec Helm

helm create churn-api

Dans values.yaml :

image: repository: ghcr.io/your_user/churn-api tag: latest

Puis :

helm install churn-api ./churn-api

Étape 6 : Monitoring, drift, alerting

Objectif : surveiller les performances du modèle en production, détecter les dérives, et générer des alertes.

Technologies utilisées :

  • Prometheus + Grafana pour les mĂ©triques.
  • Evidently pour le suivi de la dĂ©rive de donnĂ©es.
  • Sentry ou ELK Stack pour les logs et erreurs.

Instructions détaillées :

  1. Intégrer des métriques Prometheus dans FastAPI
from prometheus_client import start_http_server, Summary start_http_server(8001) # endpoint Prometheus REQUEST_TIME = Summary("request_processing_seconds", "Time spent processing request") @app.post("/predict") @REQUEST_TIME.time() async def predict(request: Request): ...
  1. Lancer Prometheus avec configuration :
scrape_configs: - job_name: 'churn-api' static_configs: - targets: ['localhost:8001']
  1. Utiliser Evidently pour le suivi des dérives :
from evidently.report import Report from evidently.metric_preset import DataDriftPreset report = Report(metrics=[DataDriftPreset()]) report.run(reference_data=ref_df, current_data=prod_df) report.save_html("drift_report.html")

Automatiser cette étape chaque semaine avec un DAG Airflow.

  1. Alertes avec Grafana (alerting rule sur dérive de features clés) ou Sentry pour erreurs API critiques.

Étape 7 : Bonnes pratiques et erreurs fréquentes

  • Toujours versionner les datasets ET les modèles.
  • Ne pas confondre AUC Ă©levĂ©e avec bonne performance rĂ©elle : attention aux biais.
  • Ne pas hardcoder des logiques mĂ©tier dans l’API de prĂ©diction.
  • Mettre Ă  jour les features et rĂ©entraĂ®ner rĂ©gulièrement.
  • Ne jamais exposer directement des donnĂ©es sensibles dans les logs.


Chapitre 12 — Aller plus loin

Ce chapitre explore des sujets avancés du MLOps permettant d’aller au-delà du déploiement initial et d’industrialiser l’approche pour des systèmes ML robustes, scalables et dynamiques. On aborde ici des mécanismes d’apprentissage actif, de tests A/B, d’architecture multi-tenants et une analyse comparative des solutions open-source et cloud.


1. Monitoring avec retraining automatique (Active Learning)

Objectif

Mettre en place un système capable de détecter les dérives et déclencher automatiquement le réentraînement du modèle avec les nouvelles données jugées informatives.

Étapes détaillées

  • Suivi des performances du modèle en production :

    • Collecte des prĂ©dictions et vĂ©ritĂ©s terrain (quand disponibles).
    • Calcul de mĂ©triques temporelles (rolling accuracy, f1-score).
  • DĂ©tection de dĂ©rive :

    • Utilisation d’Evidently, Alibi Detect ou River pour monitorer le data drift et concept drift.
    • Seuils critiques dĂ©finis pour dĂ©clencher une alerte.
  • SĂ©lection active des exemples :

    • Échantillons Ă  faible confiance du modèle (ex : marge faible dans SVM, entropie de softmax Ă©levĂ©e).
    • Choix de la stratĂ©gie : incertitude, diversitĂ©, densitĂ©, hybridation.
  • RĂ©entraĂ®nement automatique :

    • Orchestration via Airflow / Prefect.
    • Stockage des exemples labellisĂ©s via feedback utilisateur ou annotation humaine.
    • Modèle entraĂ®nĂ©, validĂ©, versionnĂ© puis promu automatiquement si meilleur.

2. A/B testing sur modèles ML

Objectif

Comparer deux versions d’un modèle en conditions réelles, en mesurant leur impact sur des métriques métiers et techniques.

Implémentation

  • StratĂ©gies de dĂ©ploiement :

    • Canary release : petit pourcentage de trafic vers la nouvelle version.
    • Shadow deployment : double prĂ©diction silencieuse, sans retour utilisateur.
  • Suivi des performances comparĂ©es :

    • Collecte des mĂ©triques mĂ©tier (taux de conversion, satisfaction).
    • Suivi des erreurs, latence, robustesse.
    • Analyse statistique : test de Student, bootstrap, Bayes factor.
  • Infrastructure :

    • Istio pour le routage du trafic.
    • MLflow pour le suivi des versions.

3. Multi-tenancy et scaling MLOps en entreprise

Objectif

Concevoir une architecture capable de servir plusieurs équipes ou clients avec une infrastructure partagée, tout en garantissant l’isolation, la sécurité et la scalabilité.

Approches

  • SĂ©paration logique ou physique :

    • Par namespace Kubernetes, projet GCP, ou cluster distinct.
  • Gestion des identitĂ©s et droits :

    • RBAC, OAuth, scopes personnalisĂ©s sur les APIs.
  • DĂ©ploiement de modèles multi-instances :

    • Serveur de modèles (Seldon, KFServing, TorchServe) avec dynamique d’allocation.
  • Suivi individualisĂ© :

    • Dashboards par client ou Ă©quipe.
    • Logs et mĂ©triques isolĂ©s.

4. Comparaison de stacks MLOps (open-source vs cloud providers)

Objectif

Aider au choix technologique en comparant les stacks open-source aux solutions cloud managées, selon les besoins du projet.

Critères comparés

CritèreOpen-source (ex : MLflow + DVC + Airflow)Cloud (ex : Vertex AI, SageMaker, Azure ML)
CoûtFaible à modéré, dépend de l’infraÉlevé, coût à l’usage
Courbe d’apprentissagePlus raide, nécessite DevOpsInterface guidée, abstractions élevées
FlexibilitéTotale, personnalisableRestreinte, dépend du provider
MaintenanceÀ charge de l’équipeGérée par le cloud
Intégration CI/CDÀ construire soi-mêmeIntégrée à l’écosystème
Gouvernance & sécuritéPersonnalisable, effort manuelStandards cloud, IAM intégrés
ScalabilitéExige expertise techniqueNative, autoscaling intégré

Recommandations

  • Favoriser l’open-source pour les startups tech, Ă©quipes R&D ou cas spĂ©cifiques très personnalisĂ©s.
  • Favoriser les cloud providers pour les projets Ă  fort volume, Ă©quipes rĂ©duites ou besoin de time-to-market rapide.