Traitement incrémental : Mises à jour rapides du pipeline
Cet article explique comment le pipeline SEO utilise le traitement incrémental pour s'exécuter en quelques secondes au lieu de plusieurs heures.
Le problème : Le retraitement complet est lent
Exécuter l'intégralité du pipeline depuis le début prend des heures :
-
Étape 0 (Intégration des sources) : 15 minutes (65 000 produits)
-
Étape 1 (Récupération des requêtes) : 10 minutes (appels API)
-
Étape 2 (Regroupement des requêtes) : 30 minutes (similarité 65K×65K)
-
Étape 3 (Correspondance des expressions) : 20 minutes (intégration + appariement)
-
Étape 4 (Appariement des produits) : 45 minutes (requêtes × produits)
-
Étape 5 (Recherches associées) : 25 minutes (similarité requête × requête)
Total : ~2,5 heures pour le pipeline complet
Problème : Des mises à jour quotidiennes gaspilleraient 2,5 heures à recalculer des données inchangées.
La solution : Une stratégie incrémentale à trois niveaux
Nous utilisons trois techniques pour éviter le travail inutile :
1. Saut d'étape (Granularité grossière)
Sauter des étapes entières si la sortie est récente et le script inchangé.
2. Intégration incrémentale (Granularité moyenne)
Intégrer uniquement les éléments nouveaux/modifiés, réutiliser les intégrations en cache.
3. Points de contrôle (Granularité fine)
Sauvegarder la progression pendant les opérations longues, reprendre depuis le point de contrôle en cas d'échec.
Stratégie de saut d'étape
Fonctionnement
Avant chaque étape, vérifier :
La sortie existe-t-elle ? Si non, exécuter l'étape.
Âge de la sortie : Si plus ancienne que 7 jours, exécuter l'étape.
Script modifié ? Si le script a été modifié depuis la génération de la sortie, exécuter l'étape.
Toutes les vérifications passent ? Sauter l'étape.
Implémentation
def should_skip_step(output_path, script_path, days=7):
# Vérifier si la sortie existe
if not os.path.exists(output_path):
# ... (détails d'implémentation omis)
Utilisation
Chaque script vérifie au démarrage :
from seo_common import should_skip_step
if should_skip_step(SEO_SOURCE_EMBEDDINGS_PATH, __file__):
print("✓ Saut : La sortie est récente et le script inchangé")
return
Avantages
Exécutions quotidiennes rapides : La plupart des étapes sont sautées si les données sont inchangées
Invalidation automatique : Les modifications du script déclenchent une ré-exécution
Fraîcheur configurable : Ajuster le paramètre days par étape
Stratégie d'intégration incrémentale
Fonctionnement
Lors de l'intégration d'éléments (produits, requêtes, expressions) :
Charger le cache : Lire les éléments précédemment intégrés et leurs clés
Comparer les clés : Identifier les éléments nouveaux, modifiés et supprimés
Intégrer uniquement les nouveaux : N'intégrer que les éléments absents du cache
Fusionner : Combiner les intégrations en cache avec les nouvelles intégrations dans le bon ordre
Sauvegarder : Écrire le cache mis à jour
Implémentation
La fonction incremental_embed_with_keys gère cela :
def incremental_embed_with_keys(
items, # Éléments actuels à intégrer
keys, # Clés uniques pour les éléments
# ... (détails d'implémentation omis)
Taux de succès du cache
Taux de succès typiques du cache après la première exécution :
Données sources (produits, pièces, articles) :
-
Première exécution : 0% (intégrer tous les 65 000 éléments)
-
Exécution quotidienne : 99,5% (seulement ~300 éléments nouveaux/modifiés)
Requêtes (depuis GSC, Ads, en direct) :
-
Première exécution : 0% (intégrer toutes les 65 000 requêtes)
-
Exécution quotidienne : 99,2% (seulement ~500 nouvelles requêtes)
Correspondance d'expressions :
-
Première exécution : 0% (intégrer toutes les 5 000 expressions)
-
Exécution quotidienne : 99,8% (seulement ~10 nouvelles expressions)
Impact sur les performances
Première exécution (cache froid) :
-
Intégration des sources : 15 minutes (65 000 éléments)
-
Intégration des requêtes : 10 minutes (65 000 requêtes)
-
Intégration des expressions : 2 minutes (5 000 expressions)
Exécution quotidienne (cache chaud) :
-
Intégration des sources : 10 secondes (300 éléments, taux de succès 99,5%)
-
Intégration des requêtes : 5 secondes (500 requêtes, taux de succès 99,2%)
-
Intégration des expressions : 1 seconde (10 expressions, taux de succès 99,8%)
Accélération : 90 à 180 fois plus rapide
Stratégie de points de contrôle
Fonctionnement
Pour les opérations de longue durée (intégration de 65 000 éléments) :
Traitement par lots : Traiter les éléments par lots (ex. 1 000 éléments)
Sauvegarder un point de contrôle : Après chaque lot, sauvegarder les résultats accumulés
Reprendre en cas d'échec : Si le processus plante, reprendre depuis le dernier point de contrôle
Sauvegarde finale : Après tous les lots, sauvegarder les résultats complets
Implémentation
La gestion des points de contrôle est intégrée à incremental_embed_with_keys :
checkpoint_every = 1000 # Sauvegarder tous les 1 000 éléments
embeddings_list = []
# ... (détails d'implémentation omis)
Avantages
Récupération après plantage : Reprendre depuis le dernier point de contrôle au lieu de recommencer
Visibilité de la progression : Voir la progression tous les 1 000 éléments
Efficacité mémoire : Traiter par lots, ne pas tout charger en mémoire
Intégration à travers le pipeline
Le traitement incrémental est utilisé dans plusieurs étapes :
Étape 0 : Intégration des données sources
Incrémental : Intégrer uniquement les produits, pièces, articles nouveaux/modifiés
Points de contrôle : Sauvegarder tous les 1 000 éléments
Logique de saut : Sauter si la sortie a moins de 7 jours et le script est inchangé
Voir : Intégration des données sources
Étape 1 : Récupération des requêtes
Incrémental : Les appels API récupèrent uniquement les nouvelles données (depuis la dernière exécution)
Logique de saut : Sauter si la sortie a moins de 1 jour
Voir : Récupération des requêtes
Étape 3b : Intégration des requêtes
Incrémental : Intégrer uniquement les nouvelles requêtes
Points de contrôle : Sauvegarder tous les 1 000 requêtes
Logique de saut : Sauter si la sortie a moins de 7 jours et le script est inchangé
Voir : Intégration des requêtes
Étape 4 : Expansion de la correspondance d'expressions
Incrémental : Intégrer uniquement les nouvelles expressions
Points de contrôle : Sauvegarder tous les 1 000 expressions
Logique de saut : Sauter si la sortie a moins de 7 jours et le script est inchangé
Voir : Correspondance expression-filtre
Étape 6 : Appariement des produits
Incrémental : Apparier uniquement les nouvelles requêtes
Logique de saut : Sauter si la sortie a moins de 7 jours et le script est inchangé
Voir : Appariement des produits
Configuration
Le traitement incrémental est configuré par étape :
Seuil de fraîcheur
# Sauter si la sortie a moins de 7 jours (par défaut)
should_skip_step(output_path, script_path, days=7)
# Sauter si la sortie a moins de 1 jour (pour les données changeant fréquemment)
should_skip_step(output_path, script_path, days=1)
Fréquence des points de contrôle
# Sauvegarder tous les 1 000 éléments (par défaut)
incremental_embed_with_keys(..., checkpoint_every=1000)
# Sauvegarder tous les 5 000 éléments (traitement plus rapide, moins de sécurité)
incremental_embed_with_keys(..., checkpoint_every=5000)
Taille des lots
# Intégrer 32 éléments par lot (par défaut, équilibré)
incremental_embed_with_keys(..., batch_size=32)
# Intégrer 64 éléments par lot (plus rapide sur GPU, plus de mémoire)
incremental_embed_with_keys(..., batch_size=64)
Surveillance et débogage
Statistiques du cache
Chaque étape affiche les statistiques du cache :
✓ Cache existant trouvé, vérification des changements...
Existant : 65 000 éléments
Actuel : 65 300 éléments
Réutilisation : 64 800 intégrations
Nouveaux : 500 éléments à intégrer
Messages de saut
Lorsque des étapes sont sautées :
✓ Saut de 0_embed_source_data.py : La sortie est récente et le script inchangé.
Messages de point de contrôle
Pendant les opérations longues :
Intégration de 65 000 éléments (point de contrôle tous les 1 000)...
Lot 0-1000...
✓ Point de contrôle sauvegardé (1 000 au total)
Lot 1000-2000...
✓ Point de contrôle sauvegardé (2 000 au total)
...
Références
Concepts techniques
-
Apprentissage incrémental - Wikipedia
-
Points de contrôle - Wikipedia
-
Mise en cache - Wikipedia
Articles connexes
-
Vue d'ensemble du pipeline SEO - Architecture complète du pipeline
-
Intégration des données sources - Intégration incrémentale des produits
-
Intégration des requêtes - Intégration incrémentale des requêtes
-
Correspondance expression-filtre - Intégration incrémentale des expressions
Résumé
Le traitement incrémental rend le pipeline 90 à 180 fois plus rapide :
Stratégie à trois niveaux :
-
✅ Saut d'étape (sauter des étapes entières si la sortie est récente)
-
✅ Intégration incrémentale (intégrer uniquement les éléments nouveaux/modifiés)
-
✅ Points de contrôle (sauvegarder la progression, reprendre en cas d'échec)
Performances :
-
✅ Première exécution : ~2,5 heures (pipeline complet)
-
✅ Exécution quotidienne : ~5 minutes (mises à jour incrémentales)
-
✅ Taux de succès du cache : 99%+ après la première exécution
Avantages :
-
✅ Mises à jour quotidiennes rapides (minutes au lieu d'heures)
-
✅ Invalidation automatique (les modifications du script déclenchent une ré-exécution)
-
✅ Récupération après plantage (reprise depuis le point de contrôle)
-
✅ Efficacité mémoire (traitement par lots)
Cette stratégie permet des exécutions quotidiennes du pipeline sans gaspiller de ressources de calcul sur des données inchangées.