perf(tech-steps): corrige la largeur du textcat — démarrage ~5× plus rapide #25
Loading…
Reference in a new issue
No description provided.
Delete branch "perf/nlp-textcat-width"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Phase 1/5 du remaniement du pipeline NLP. Indépendante des PR #23/#24 (aucun fichier en commun).
Le diagnostic était faux
Le service mettait ~930 s (15-16 min) à devenir
healthy. Le README présentait ça comme « un compromis assumé, pas un défaut de configuration à corriger » — moins d'itérations entraînerait plus vite mais dégraderait la confiance.C'est faux. Le coût ne venait ni des itérations, ni du nombre d'exemples, ni de la taille du corpus : il venait du paramètre
lengthdespacy.TextCatBOW.v3, laissé à son défaut spaCy de 262144 faute d'être passé explicitement danslocale_pipeline.py.Avec
no_output_layer: Falseet 74 techniques, la couche de sortie fait 19 398 730 paramètres, que l'optimiseur Adam met à jour à chaque pas de gradient. Or le corpus ne contient que ~920 tokens distincts : 99,99 % de cette table de hachage n'est jamais peuplée. On payait un temps de calcul proportionnel à une table vide.Mesures (balayage
ngram=1)Corpus réel (74 techniques,
fr, 25 itérations), jeu de dev = la dernièreutterancede chaque technique tenue hors entraînement ; collisions = tokens distincts du corpus partageant un bucket, sur 920 :length65536: confiance identique au bit près au défaut, 1 % de collisions, mêmes verdicts sur les probes difficiles (bake/blindBake,boil/poach…) — aucun changement de comportement mesurable, ~5× plus rapide, 15× moins de paramètres.2048a été livré puis reculé : 33 % des tokens y entrent en collision, la confiance se décale (0,816), et ça pourrait décaler le F1 par classe — invérifiable hors CI. Descendre plus bas est du travail pour la phase où le jeu d'évaluation sera élargi.ngram_size2 → 1 (reculé aussi) : les bigrammes rendent le classifieur nettement plus confiant (0,809 → 0,919), ce qui — contre-intuitivement — dégrade la justesse bout-en-bout._classifyClausene retombe sur l'ancre NER que sousCONFIDENCE_THRESHOLD; une classification confiante mais fausse sur une technique voisine (blindBakeau lieu debake) passe alors le seuil et écrase l'ancre correcte. Seule cause de la chutetech-step-eval0,815 → 0,753.Contenu
locale_pipeline.py—_TEXTCAT_MODEL_LENGTH = 65536/_TEXTCAT_NGRAM_SIZE = 1, commentés avec le balayage et l'explication du recul._TRAINING_ITERATIONS,_TRAINING_DROPOUTet les synonymes-comme-exemples inchangés.README.md— « Temps de démarrage » et « Limitations connues » réécrites. La limitation bloquante devient la couverture d'évaluation :TECH_STEP_EVAL_DATASETne couvre que 26/74 techniques → aucun F1 par classe, aucune matrice de confusion, donc aucun changement plus agressif n'est vérifiable aujourd'hui. C'est la phase 3.docker-compose.yml/ci.yml— commentaires citant ~930 s corrigés ;start_period/timeout1200s → 600s (plafond runner lent, pas cible).Vérification
PipelineRegistry.initialize()(fr+en, chargement + entraînement — ce qui gate/health) : 208,9 s contre ~930 s.uv run pytest: 46 passed en 219,8 s (dominé par la fixture qui entraîne le vrai corpus des deux locales).pnpm lintvert.tech-step-eval.test.ts(Postgres + service requis, pas de Docker) → CI. Les probes locales et la distribution de confiance identiques au défaut sont le meilleur proxy disponible.Le job
testest déjà rouge surmainLes 6 autres échecs de la run CI (
resetDatabase/seedReferenceData:Unique constraint failed on key, timeouts debefore each) sont pré-existants surmain@81f7cb9(CI / testy échoue en 25m8s ; il était vert en 23m48s à29a5b30, avant le merge de #22). Sans rapport avec ce changement — maismainne repassera pas au vert avant qu'ils soient traités (PR séparée).Trouvailles annexes, non corrigées ici
spacy.ml.extract_ngramshacheattr=LOWER, pasNORM. Lediacritics_normalizerne bénéficie donc qu'auPhraseMatcher.blindBake/bake,poach/boil,sweat/brown. Un plafond que nulle architecture ne lève ; à instruire avec la matrice de confusion de la phase 3.🤖 Generated with Claude Code
Le service mettait ~930 s (15-16 min) a devenir `healthy`, ce que le README presentait comme "un compromis assume, pas un defaut de configuration a corriger". Mauvais diagnostic : le cout ne venait ni des iterations ni de la taille du corpus, mais du parametre `length` de `spacy.TextCatBOW.v3`, laisse a son defaut spaCy de 262144 faute d'etre passe explicitement. Avec `no_output_layer: False` et 74 techniques, la couche de sortie faisait 19 398 730 parametres mis a jour par Adam a chaque pas de gradient, pour une table de hachage vide a 99 % (le corpus tient dans quelques milliers de tokens distincts). Mesure contre le vrai corpus (fr, 25 iterations, jeu de dev = derniere utterance de chaque technique tenue hors entrainement) : length=262144 ngram=1 dev 97.3% conf 0.809 394.7 s <- avant length=2048 ngram=2 dev 97.3% conf 0.919 12.3 s <- apres Meme accuracy, meilleure confiance, 32x plus rapide. Les bigrammes profitent des locutions du corpus ("faire fondre", "laisser mijoter") qu'un sac d'unigrammes ne distingue pas de leurs constituants isoles. PipelineRegistry.initialize() (fr+en, chargement + entrainement) mesure a 28,5 s contre ~930 s. Suite pytest complete : 46 passed en 40,6 s. - locale_pipeline.py : `_TEXTCAT_MODEL_LENGTH` / `_TEXTCAT_NGRAM_SIZE` explicites et commentes avec les mesures ; historique de calibration de `_TRAINING_ITERATIONS` corrige (il attribuait le cout aux iterations) - README : sections "Temps de demarrage" et "Limitations connues" reecrites (la couverture d'evaluation, 26/74 techniques, y devient la limitation bloquante ; ajout des collisions de classes observees) - docker-compose.yml / ci.yml : commentaires citant ~930 s corriges, start_period et timeout 1200s -> 300s (plafond pour runner lent, pas cible) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>perf(tech-steps): corrige la largeur du textcat — entraînement 32× plus rapideto perf(tech-steps): corrige la largeur du textcat — démarrage ~5× plus rapide