Cette section détaille la mise en place et l'utilisation de Kubeflow Pipelines (KFP) pour orchestrer les étapes d'analyse, de scoring et d'enrichissement LLM de notre système d'intelligence e-commerce.
Créer un pipeline reproductible et automatisable pour :
- Charger les données produits brutes depuis MongoDB.
- Calculer les scores et identifier les produits Top-N.
- Enrichir les données de ces produits Top-N avec des résumés générés par un LLM.
- Installation de l'environnement local :
- Docker est requis.
- Un cluster Kubernetes local via Minikube a été configuré.
- Kubeflow Pipelines (version standalone/platform-agnostic ciblée : [par exemple, v1.8.5 ou la version que vous avez installée]) a été déployé sur Minikube. La plupart des pods KFP sont en statut
Running. (Note: Le podproxy-agentpeut présenter des erreurs sans impacter l'exécution de base des pipelines, mais peut affecter la visualisation des logs dans l'UI).
- Scripts Python adaptés pour le pipeline :
load_from_mongo_pipeline.py: Lit les données de MongoDB, extrait les features (y comprismain_image_url), et sauvegarde en CSV. Prend ses configurations via arguments de ligne de commande.enrich_llm_pipeline.py: Lit le CSV de l'étape précédente, calcule les scores, identifie les Top-N produits, appelle l'API Hugging Face (pourHuggingFaceH4/zephyr-7b-betaou similaire) pour générer des résumés pour ces Top-N, et sauvegarde le DataFrame enrichi complet en CSV. Prend ses configurations (chemins, token HF, nombre de Top-N) via arguments de ligne de commande.
- Conteneurisation :
Dockerfilecréés pourload_from_mongo_pipeline.py(imageload-mongo-component:v1).Dockerfilecréés pourenrich_llm_pipeline.py(imageenrich-llm-component:v1).- Ces images ont été construites localement en utilisant l'environnement Docker de Minikube (
eval $(minikube docker-env)).
- Définition du Pipeline KFP :
- Le script
ecommerce_pipeline.pydéfinit deux composants KFP (load_mongo_data_opetenrich_llm_data_op) en utilisant le décorateur@container_componentet les images Docker construites. - Il définit un pipeline KFP (
product_enrichment_pipeline) qui enchaîne ces deux composants. - Le pipeline a été compilé avec succès en
product_enrichment_pipeline.yaml.
- Le script
- Exécution Initiale :
- Le fichier
product_enrichment_pipeline.yamla été uploadé dans l'UI de Kubeflow Pipelines. - Une exécution ("Run") a été lancée.
- L'étape
load-mongo-data-opa été observée en statutRunning.
- Le fichier
-
Prérequis (doivent être déjà en place) :
- Minikube démarré :
minikube start --driver=docker --cpus=X --memory=YYYYm(utiliser les mêmes paramètres que lors de l'installation de KFP). - Kubeflow Pipelines doit être déployé et accessible sur Minikube.
- Les images Docker
load-mongo-component:v1etenrich-llm-component:v1doivent exister dans l'environnement Docker de Minikube (si elles ont été construites aveceval $(minikube docker-env)et non poussées vers un registre). - MongoDB doit être accessible depuis les pods Minikube (typiquement via
host.minikube.internalsi MongoDB tourne sur la machine hôte). - Un fichier
.envà la racine du projet contenantHUGGINGFACE_API_TOKEN(bien que pour l'exécution KFP, il sera passé en paramètre).
- Minikube démarré :
-
Accéder à l'UI de Kubeflow Pipelines :
- Ouvrir un terminal et exécuter :
kubectl port-forward -n kubeflow svc/ml-pipeline-ui 8080:80
- Ouvrir
http://localhost:8080dans un navigateur.
- Ouvrir un terminal et exécuter :
-
Uploader le Pipeline (si pas déjà fait ou si modifié) :
- Dans l'UI KFP, aller à la section "Pipelines".
- Cliquer sur "+ Upload pipeline".
- Sélectionner le fichier
kubeflow_pipeline/product_enrichment_pipeline.yaml(ou le chemin où vous l'avez sauvegardé). - Donner un nom et cliquer sur "Create".
-
Créer et Lancer une Exécution ("Run") :
- Trouver le "ECommerce Product Enrichment Pipeline" dans la liste des pipelines et cliquer dessus.
- Cliquer sur "+ Create run".
- Remplir les paramètres du pipeline :
mongo_uri: Ex:mongodb://host.minikube.internal:27017/(ajuster si authentification ou base de données spécifique dans l'URI).mongo_db: Ex:ecommerce_db(le nom de votre base de données).mongo_collection: Ex:products(le nom de votre collection).hf_token: Votre token API Hugging Face (ex:hf_xxxxxxxx).num_top_to_enrich: Nombre de produits à enrichir (ex:15).
- Cliquer sur "Start".
-
Surveiller et Déboguer l'Exécution :
- Suivre la progression des étapes (
load-mongo-data-oppuisenrich-llm-data-op) dans l'UI. - Consulter les logs de chaque étape directement dans l'UI pour voir les
print()de vos scripts et identifier les erreurs. - Si les logs de l'UI sont inaccessibles (à cause du
proxy-agent), utiliserkubectl:kubectl get pods -n kubeflow(pour trouver le nom du pod de l'étape en cours d'exécution ou en erreur).kubectl logs <nom-du-pod> -n kubeflow.
- Suivre la progression des étapes (
-
Assurer la Réussite Complète du Pipeline Actuel :
- Vérifier la connexion à MongoDB depuis
load-mongo-data-op: S'assurer que l'URIhost.minikube.internalfonctionne et que lebindIpde MongoDB est correctement configuré sur la machine hôte (doit écouter sur0.0.0.0ou l'IP du réseau Docker, pas seulement127.0.0.1). - Vérifier la création et le passage de l'artefact
products_data_csventreload-mongo-data-opetenrich-llm-data-op. L'UI de KFP devrait montrer cet artefact lié. - Assurer le bon fonctionnement de
enrich-llm-data-op:- Vérifier qu'il lit correctement le CSV d'entrée.
- Vérifier que le token Hugging Face est bien reçu et utilisé pour les appels API.
- Confirmer que les appels LLM réussissent et que les résumés sont générés.
- Vérifier la création de l'artefact de sortie
enriched_data_csv.
- (Optionnel) Résoudre le problème du
proxy-agentpour faciliter la visualisation des logs dans l'UI, si cela s'avère être un bloqueur.
- Vérifier la connexion à MongoDB depuis
-
Gestion des Secrets Kubernetes pour les Identifiants :
- Objectif : Éviter de passer des secrets (comme
mongo_uriavec mot de passe, ouhf_token) en clair comme paramètres de pipeline. - Action :
- Créer des Secrets Kubernetes :
kubectl create secret generic mongo-creds --from-literal=uri='mongodb://user:pass@host.minikube.internal:27017/mydb' -n kubeflow kubectl create secret generic hf-api-token --from-literal=token='hf_YOURTOKEN' -n kubeflow
- Modifier les définitions des composants KFP (
@container_component) pour qu'ils montent ces secrets comme variables d'environnement.# Exemple pour enrich_llm_data_op # ... # hf_api_token_param: str # Ne plus le passer en argument direct du pipeline # ... # Dans la fonction product_enrichment_pipeline : # enrich_task = enrich_llm_data_op(...) # enrich_task.add_env_variable( # V1EnvVar(name="HUGGINGFACE_API_TOKEN_PIPELINE", # Le script lira cette variable d'env # value_from=V1SecretKeySelector(name="hf-api-token", key="token")) # ) # (Nécessite d'importer V1EnvVar, V1SecretKeySelector de kubernetes.client.models ou via kfp.dsl) # Alternativement, KFP SDK v2 a des manières plus directes de gérer les secrets. # Voir la documentation KFP pour "using secrets".
- Modifier les scripts Python dans les conteneurs pour lire ces variables d'environnement (ex:
os.getenv("HUGGINGFACE_API_TOKEN_PIPELINE")).
- Créer des Secrets Kubernetes :
- Objectif : Éviter de passer des secrets (comme
-
Optimisation et Robustesse du Pipeline :
- Gestion des Erreurs : Améliorer la gestion des erreurs dans les scripts Python pour qu'ils retournent des codes de sortie clairs en cas d'échec, facilitant le diagnostic dans KFP.
- Paramétrage : Rendre plus de choses configurables via les paramètres du pipeline KFP (ex:
N_TOP_PRODUCTS_TO_ENRICH). (Vous l'avez déjà fait pournum_top_to_enrich). - Image Pull Policy : Si vous ne poussez pas vos images vers un registre public/privé, assurez-vous que
imagePullPolicy: IfNotPresentouNeverest bien appliqué pour les images locales dans Minikube. Cela peut se faire en modifiant le YAML du pipeline compilé ou via des options du SDK KFP si disponibles pour@container_componentou en utilisanttask.set_image_pull_policy('Never')après l'instanciation de la tâche dans le pipeline.