CI2 : Monitoring
Ce travail pratique a pour objectif de familiariser les étudiants avec la mise en production d'un système de Machine Learning en continu. Ils mettront en place un pipeline complet, de la prédiction en ligne à la surveillance des performances du modèle et à la détection des changements de distribution des données.
Objectifs du TP :
- Déployer une API de prédiction en ligne avec FastAPI
- Mettre en place un système de streaming de données avec Kafka
- Effectuer des transformations de features en temps réel
- Détecter des changements dans la distribution des données
- Mettre en place un système de monitoring avec Prometheus
- Visualiser les métriques et configurer des alertes avec Grafana
Prédiction en ligne avec un modèle de Machine Learning
Dans cet exercice, vous allez mettre en place une API de prédiction en ligne en utilisant FastAPI. Cette API recevra des données en entrée, effectuera des prédictions à l'aide d'un modèle de machine learning pré-entrainé, et renverra les résultats au client. Vous allez également envoyer ces données dans un système Kafka pour permettre un traitement en flux (streaming).
L'objectif est de comprendre comment créer une API simple qui intègre un modèle de prédiction et comment déployer cette API pour un usage en production.
- fastapi
- uvicorn
- numpy
- kafka-python
Ensuite, testez que le serveur fonctionne en accédant à http://localhost:8000/docs dans votre navigateur.if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000)
Transformation de features avec Kafka Streams
Dans cet exercice, vous allez mettre en place un pipeline de transformation de features en utilisant Kafka Streams. L'objectif est de traiter les messages entrants, appliquer des transformations en temps réel, et envoyer les résultats vers un nouveau topic Kafka. Cela vous permettra de comprendre comment enrichir ou transformer les données en streaming avant qu'elles ne soient utilisées pour la prédiction.
from kafka import KafkaConsumer import json consumer = KafkaConsumer( 'prediction_requests', bootstrap_servers='localhost:9092', value_deserializer=lambda x: json.loads(x.decode('utf-8')) ) if __name__ == '__main__': for message in consumer: print("Reçu :", message.value)
from kafka import KafkaProducer producer = KafkaProducer( bootstrap_servers='localhost:9092', value_serializer=lambda x: json.dumps(x).encode('utf-8') ) def transform_features(features): # Exemple : ajout de nouvelles features features_sum = sum(features) features_mean = features_sum / len(features) features.append(features_sum) features.append(features_mean) return features if __name__ == '__main__': for message in consumer: transformed_features = transform_features(message.value['features']) producer.send('transformed_features', {"features": transformed_features})
import json from kafka import KafkaConsumer transformed_consumer = KafkaConsumer( 'transformed_features', bootstrap_servers='localhost:9092', value_deserializer=lambda x: json.loads(x.decode('utf-8')) ) if __name__ == '__main__': for message in transformed_consumer: print("Transformé :", message.value)
Détection des changements de distribution des données
Dans cet exercice, vous allez mettre en place un système pour détecter les changements de distribution dans les données entrantes. L'objectif est d'analyser le flux de données en continu, de comparer les distributions passées et présentes, et d'alerter en cas de dérive significative.
Surveillance des prédictions et des métriques avec Prometheus
Dans cet exercice, vous allez mettre en place un système de surveillance pour suivre les performances des prédictions et des données en utilisant Prometheus. Vous apprendrez à exposer des métriques via une API FastAPI et à configurer Prometheus pour collecter ces informations.
docker run \ -p 9090:9090 \ -v /home/julien/Documents/programmation/datashift/prometheus.yml:/etc/prometheus/prometheus.yml --network host \ prom/prometheusEnsuite, accédez à http://localhost:9090 pour voir les métriques collectées.
- Affichez l'évolution du nombre de prédictions :
prediction_count
- Affichez un histogramme de la latence des prédictions :
histogram_quantile(0.95, rate(prediction_latency_seconds_bucket[5m]))
Visualisation des métriques avec Grafana
Dans cet exercice, vous allez configurer Grafana pour visualiser les métriques collectées par Prometheus. Vous allez apprendre à ajouter une source de données Prometheus et à créer des tableaux de bord pour surveiller l'évolution des prédictions et de la latence.
docker run -d -p 3000:3000 --name=grafana --network host grafana/grafanaEnsuite, ouvrez Grafana dans votre navigateur à l’adresse http://localhost:3000. Les identifiants par défaut sont admin, admin.
- Dans l’interface Grafana, allez dans Connections > Data sources.
- Cliquez sur Add data source, choisissez Prometheus.
- Dans le champ URL, entrez http://localhost:9090.
- Enregistrez la configuration et testez la connexion.
- Créez un nouveau dashboard
- Ajoutez une visualisation
- Sélectionnez Prometheus comme source de données
- En bas, sélectionnez la métrique prediction_count_total
- Ajoutez une opération rate (vous pouvez jouer sur le range)
- Appuyez sur Run queries pour obtenir la visualisation
- Une fois satisfait, cliquez sur Back to dashboard