Entraîner un modèle est facile. Le maintenir en production pendant 2 ans sans régression est difficile. En entretien ML Engineer, on évalue la capacité à industrialiser tout le cycle.
Comment packagéz-vous un modèle sklearn pour qu il soit reproductible en production ?
import joblib
import json
from datetime import datetime
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import GradientBoostingClassifier
# Pipeline complet : preprocessing inclus
pipeline = Pipeline([
('scaler', StandardScaler()),
('model', GradientBoostingClassifier(n_estimators=100))
])
pipeline.fit(X_train, y_train)
# Sauvegarder avec métadonnées
model_package = {
'model': pipeline,
'metadata': {
'version': '2.1.0',
'trained_at': datetime.now().isoformat(),
'features': list(X_train.columns),
'target': 'churn',
'auc_test': 0.87,
'python_version': '3.11',
'sklearn_version': '1.3.0'
}
}
joblib.dump(model_package, 'model_v2.1.0.pkl')
# Signature : valider les inputs en production
from mlflow.models import infer_signature
signature = infer_signature(X_train, pipeline.predict_proba(X_train))Quand utilisez-vous FastAPI, BentoML, ou Vertex AI Endpoints pour servir un modèle ?
| Option | Forces | Idéal pour |
|---|---|---|
| FastAPI custom | Contrôle total, simple | Équipes Python, modèle unique, logique custom |
| BentoML | Abstraction ML, batching, adaptive batching | Plusieurs modèles, besoin d optimisation throughput |
| MLflow Serving | Intégré MLflow Registry | Équipes Databricks, déploiement depuis Registry |
| Vertex AI Endpoints | Managé GCP, autoscaling | Stack GCP, zéro infra à gérer |
| Seldon Core | K8s natif, A/B testing intégré | Équipes K8s avancées, multi-modèles |
Quelles métriques monitorez-vous sur un modèle de classification en production ?
import pandas as pd
from evidently.report import Report
from evidently.metric_preset import ClassificationPreset, DataDriftPreset
# Rapport Evidently : data drift + performance
report = Report(metrics=[
DataDriftPreset(), # distributions des features
ClassificationPreset() # métriques de classification
])
report.run(
reference_data=training_data, # données d entrainement
current_data=production_data # dernières prédictions avec labels
)
report.save_html('monitoring_report.html')
# Métriques clés à monitorer :
# - Distribution des scores de prédiction (drift de score)
# - Distribution des features d input (data drift)
# - AUC/F1 sur les labels reçus (performance drift)
# - Taux de prédictions positives (prediction drift)Quelle est la différence entre shadow mode et canary deployment pour un modèle ML ?
Comment décidez-vous qu un modèle doit être réentrainé ? Comment automatisez-vous cela ?
# Stratégies de déclenchement du retraining
# 1. Schedule fixe (simple)
# Réentrainer chaque semaine, que le modèle soit dégradé ou non
@weekly_task
def scheduled_retraining():
train_and_evaluate()
if new_model_better_than_current():
deploy_new_model()
# 2. Basé sur le drift (intelligent)
def check_and_retrain():
drift_score = compute_psi(training_data, recent_predictions)
if drift_score > 0.2: # PSI > 0.2 = drift significatif
trigger_retraining()
auc_current = evaluate_on_labeled_data(recent_labeled)
if auc_current < baseline_auc * 0.95: # dégradation > 5%
trigger_retraining()
# PSI = Population Stability Index
# Mesure le drift de distribution d une featureComment gérez-vous les versions de modèles et les promotions Staging → Production ?
| Niveau | Maitrise | Signal GO | NO-GO |
|---|---|---|---|
| Confirmé | Pipeline sklearn, FastAPI serving, MLflow Registry | A déployé un modèle en API FastAPI, utilise MLflow Registry | Déploie un notebook en production |
| Senior | Monitoring drift, canary deployment, retraining auto | A mis en place le monitoring de drift, a fait du canary deployment | N a pas de monitoring sur ses modèles en production |
Premier entretien gratuit. Rapport GO/NO-GO sous 48h.