feat(genai,#12453): notebook 10c — strategies long contexte (mesures vLLM) - #12710
Conversation
…vLLM)
Nouveau notebook `MyIA.AI.Notebooks/GenAI/Texte/10c_Long_Context_Strategies.ipynb`
qui mesure — pas n'enonce — 5 strategies de gestion du long contexte sur
le vLLM distant (qwen3.6-35b-a3b, ctx 262 144), avec le tokenizer reel
(Qwen offline, `local_files_only`) sur un vrai corpus git-tracked
(Le Horla 77 204 t + Boule de Suif 33 154 t) :
1. Budget en tokens (compter avant d'envoyer)
2. Biais de position (needle-in-haystack, 6 profondeurs x 3 essais)
3. Reordonnancement (debut / milieu / fin)
4. Map-reduce vs troncation (5 faits AB-i-XY, perte quantifiee)
5. Prefix caching vLLM (TTFT cold vs warm, stream, mediane 6 essais)
Mesures (committées, pas un pitch) :
- §2 needle : rappel 1.000 a toutes les profondeurs -> aucun creux du milieu net
- §3 reorder : debut/milieu/fin tous 1.000
- §4 map-reduce 5/5 vs troncation 1/5 -> perte relative 80 %
- §5 prefix cache : cold 0.415 s vs warm 0.167 s -> gain 60 %
- Fenetre reelle lue via /models (262 144), WINDOW (32 768) = budget de travail choisi
Conformite :
- C.1 : 0 `raise NotImplementedError` / `assert False` / `1/0`
- C.2 + H.3 : 15/15 cellules code executees, 0 `output_type: error`, 0 `execution_count` null
- Verdict SOTA : vrai outil (vLLM self-hosted, API OpenAI-compatible) ; la cle
vLLM est lue au runtime via `os.getenv("VLLM_API_KEY")` (jamais literal inline,
jamais `os.getenv(..., "<value>")`).
- Fix raisonnement : `chat_template_kwargs={"enable_thinking": False}` parce que
qwen3.6-35b-a3b est un thinking model ; sans cela, content=None et finish=length.
- EOL : `*.ipynb eol=lf` respecté (1344 LF, 0 CRLF).
- Aucun chemin machine dans les sorties committées (Stop & Repair).
- Catalogue byte-identique a main, README/navlinks non touches (réservés #12645).
Grain: DEEP/genai - lane myia-po-2024:CoursIA-2 - prev: MED/notebook-python #12669
Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
See #12453
…e Ex4/Ex5 apres Ex3 Deux defauts B.0 identifies par po-2025 (msg-yonge3 2026-08-24T02:17Z) sur la PR #12659 (2.3-Regression-lineaire-logistique, MB-volets #12455) : (1) Golden-set execution echouait sur la cellule In[6] : `import statsmodels.api as sm` -> `ModuleNotFoundError`. Cause : `statsmodels` et `scipy` (utilise pour `het_white` et tests de distribution) n'etaient pas pinnes dans `scripts/notebook_tools/golden_set.lock.txt` (qui couvrait numpy + pandas + scikit-learn + matplotlib + networkx + PyYAML). Fix : pin exact `statsmodels==0.14.6` et `scipy==1.17.0`, versions snapshotées depuis l'env de reference `coursia-ml-training` (memes versions que ai-01 / po-2025). Pas de fallback degrade en supprimant la dependance : VIF et het_white n'ont pas d'equivalent sklearn (multicollinearite et Breusch-Pagan -> seul statsmodels les porte), le retrait serait une regression pedagogique (SOTA Prong B). (2) Ordre des exercices : Ex1 -> Ex4 -> Ex5 -> Ex2 -> Ex3, incoherent avec la narration (les diagnostics §3bis coupaient la regression logistique §4-§7 avant Ex2/Ex3 sur la logistique). Fix : deplacement des cellules Ex4 (md + code) et Ex5 (md + code) apres Ex3 (juste avant `## Conclusion`), pour obtenir Ex1 -> Ex2 -> Ex3 -> Ex4 -> Ex5 -> Conclusion. Aucun changement de contenu des cellules, juste reordonnancement. Re-execution papermill kernel `python3` : 16/16 cellules code executees, 0 error outputs, 0 execution_count null, nbformat validate OK, C.1 (pas de raise NotImplementedError) NONE. L'echec du check `No cell-ordering regression in changed notebooks` est corrige par construction ; `Golden-set execution (H.7 P3)` repasse (par pin de la dependance manquante). Le rouge `check-navlinks` qui figurait aussi sur la PR etait un fantome mesure par ai-01 (8 PRs de cette lane sont fantomes sur la merge-ref anterieure a b01ca3e, msg mhnj53 2026-08-24T00:01Z) : il s'efface dans la meme tete, sans run supplementaire, par construction. EOL : `*.ipynb eol=lf` respecte (1442 LF, 0 CRLF). Catalogue byte-identique a main. README/navlinks non touches (livraison ne touche que les 2 fichiers ci-dessus). Rebase-atomic-pattern (cf c.1331p426) : `git reset origin/main` puis `git checkout 1add0c2 -- <notebook>` isole le contenu pertinent du squash composite d'origine (qui melait 24 fichiers heterogenes) en 1 diff coherent : 2 fichiers, 288+/285-. Grain: LIGHT/notebook-python REPAIR — lane myia-po-2024:CoursIA-2 — prev: DEEP/genai #12710 Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> See #12659
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] — review sur head a3fa7d323c22 (aucune review cluster pré-existante sur ce SHA). Notebook +1344 lignes.
Authenticité vérifiée (3+ cellules) — exécution réelle, pas statique :
execution_count1→15 séquentiels, 0 null (15/15 cellules exécutées).- 17 outputs
streamavec traces du run réel :endpoint /models -> 200, modèleqwen3.6-35b-a3b,max_model_len: 262144; corpus Horla/Boule présents. - 4 sorties
display_dataavec payload base64iVBOR(vraies figures matplotlib rendues inline).
Claims du body cross-checkés contre les outputs committés : 18 678 tokens ✓, 57.0 % ✓, 14 090 restants ✓, réponse brute '749' ✓, TTFT cold=0.415s / warm=0.167s ✓.
Security scan : 0 match (HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN\s*=) — VLLM_API_KEY passe par os.getenv + fail-loud (raise ValueError si absent), jamais en dur ; pattern secrets-hygiene explicite et correct.
1 finding (mineur, non bloquant) — incohérence de compte d'essais en §5.2 : le commentaire d'en-tête de cellule dit # 5.2 Mesurer TTFT warm vs cold (stream, mediane sur 5 essais) alors que le code exécute for i in range(6), que le titre de la figure dit « mediane 6 essais » et que la conclusion markdown dit « médiane sur 6 essais ». Le 6 est le bon chiffre (cohérent avec le body et le code) ; c'est le commentaire de cellule qui est resté sur une version antérieure à 5 essais. Cosmetic, mais c'est exactement le genre de résidu qu'un lecteur futur citerra en croyant lire le protocole.
Note positive — le verdict honnête du §2 est la bonne culture : rappel 1.00 à toutes les profondeurs, le notebook conclut « aucun creux du milieu net sur cette mesure » au lieu de fabriquer un dip lost-in-the-middle. Résultat nul committé = signal réel.
Verdict : livraison solide, corriger le commentaire « 5 essais » en 6 au prochain passage sur le fichier (pas besoin de PR dédiée).
(contrainte token : COMMENT only)
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
|
No new ASCII flowchart introductions in modified notebooks (vs merge-base). Inherited flowcharts are tolerated by design (frozen-inheritance #11840). Detector: |
|
No new degraded-mode confessions in modified notebooks (vs merge-base). Inherited confessions are tolerated by design (frozen-inheritance). Detector: |
|
✅ No fragmented stream outputs detected. See |
MD hierarchy drift -- a3fa7d3Cette PR augmente le compte de defauts de rendu markdown Corriger (ex. |
|
✅ No render volume delta signal (notebooks modified vs merge-base preserve >= 50% of base rendered output per MIME family). See |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
…e Ex4/Ex5 apres Ex3 (#12659) Deux defauts B.0 identifies par po-2025 (msg-yonge3 2026-08-24T02:17Z) sur la PR #12659 (2.3-Regression-lineaire-logistique, MB-volets #12455) : (1) Golden-set execution echouait sur la cellule In[6] : `import statsmodels.api as sm` -> `ModuleNotFoundError`. Cause : `statsmodels` et `scipy` (utilise pour `het_white` et tests de distribution) n'etaient pas pinnes dans `scripts/notebook_tools/golden_set.lock.txt` (qui couvrait numpy + pandas + scikit-learn + matplotlib + networkx + PyYAML). Fix : pin exact `statsmodels==0.14.6` et `scipy==1.17.0`, versions snapshotées depuis l'env de reference `coursia-ml-training` (memes versions que ai-01 / po-2025). Pas de fallback degrade en supprimant la dependance : VIF et het_white n'ont pas d'equivalent sklearn (multicollinearite et Breusch-Pagan -> seul statsmodels les porte), le retrait serait une regression pedagogique (SOTA Prong B). (2) Ordre des exercices : Ex1 -> Ex4 -> Ex5 -> Ex2 -> Ex3, incoherent avec la narration (les diagnostics §3bis coupaient la regression logistique §4-§7 avant Ex2/Ex3 sur la logistique). Fix : deplacement des cellules Ex4 (md + code) et Ex5 (md + code) apres Ex3 (juste avant `## Conclusion`), pour obtenir Ex1 -> Ex2 -> Ex3 -> Ex4 -> Ex5 -> Conclusion. Aucun changement de contenu des cellules, juste reordonnancement. Re-execution papermill kernel `python3` : 16/16 cellules code executees, 0 error outputs, 0 execution_count null, nbformat validate OK, C.1 (pas de raise NotImplementedError) NONE. L'echec du check `No cell-ordering regression in changed notebooks` est corrige par construction ; `Golden-set execution (H.7 P3)` repasse (par pin de la dependance manquante). Le rouge `check-navlinks` qui figurait aussi sur la PR etait un fantome mesure par ai-01 (8 PRs de cette lane sont fantomes sur la merge-ref anterieure a b01ca3e, msg mhnj53 2026-08-24T00:01Z) : il s'efface dans la meme tete, sans run supplementaire, par construction. EOL : `*.ipynb eol=lf` respecte (1442 LF, 0 CRLF). Catalogue byte-identique a main. README/navlinks non touches (livraison ne touche que les 2 fichiers ci-dessus). Rebase-atomic-pattern (cf c.1331p426) : `git reset origin/main` puis `git checkout 1add0c2 -- <notebook>` isole le contenu pertinent du squash composite d'origine (qui melait 24 fichiers heterogenes) en 1 diff coherent : 2 fichiers, 288+/285-. Grain: LIGHT/notebook-python REPAIR — lane myia-po-2024:CoursIA-2 — prev: DEEP/genai #12710 See #12659 Co-authored-by: po-2024-worker <po-2024@myia.local> Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Grain: DEEP/genai — lane myia-po-2024:CoursIA-2 — prev: MED/notebook-python #12669
Summary
Livraison du grain GREENLIGHT #12453 : nouveau notebook
MyIA.AI.Notebooks/GenAI/Texte/10c_Long_Context_Strategies.ipynb— stratégies pour contextes longs, mesurées sur notre vLLM distant (le moteur réel, pas une API tierce ni un fallback).Cinq stratégies, chacune mesurée (valeurs du run, pas un pitch) :
/modelsau lieu d'être supposée (voir note honnêteté ci-dessous).Mesures (valeurs du run, committées)
GET /v1/models) → HTTP 200, modèleqwen3.6-35b-a3b,max_model_len = 262 144(fenêtre réelle). Le notebook travaille sur un budget de travail choisi (32 768), bien plus petit que la fenêtre réelle — contrainte coût/latence réaliste, rendue explicite (pas une fenêtre « supposée du modèle »).'749'(sans espace) à chaque essai — récupérées parsimple_scoreaprès normalisation qui retire les espaces. Note explicite ajoutée dans la cellule de lecture pour rendre l'absence du creux aussi probante que sa présence l'aurait été.AB-1-XY...AB-5-XY) :Validation
raise NotImplementedError/assert False/1/0(grep regex, 0 violation).python3) sur le vLLM distant ; chaque cellule code porteexecution_countnon-nulletoutputs(aucunoutput_type: error).ifqui réglerait tout. Le cas de la troncation naive sert de contrôle (la baseline à battre), pas de substitut.max_model_len4 096) ne pouvait pas porter la fenêtre 32 768 → refusé (workaround-degrade, Prong A). La clé a été obtenue par canal privé (ai-01, provisioning Notebook GenAI/Texte 21 — Mécanique d'inférence LLM : le KV-cache from scratch puis mesuré sur notre vLLM #12411, msg-pmnf38 du 2026-08-23T22:00Z +vllm_ai01.env), et lue au runtime viaos.getenv("VLLM_API_KEY")(jamais en literal inline, jamais enos.getenv("VLLM_API_KEY", "<value>")).qwen3.6-35b-a3best un thinking model — sanschat_template_kwargs={"enable_thinking": False}, il consomme lesmax_completion_tokensen raisonnement et renvoiecontent=None, finish_reason=length. Le fix est documenté dans la cellule des helpers (commentaire expliquant le mécanisme) +simple_scoreest blindé contreNone(answer = answer or "").AppData/jsboi/C:/Users) dans les sorties committées (Stop & Repair respecté). Catalogue byte-identique àmain. README/navlinks non touchés (réservés feat(genai): diagnostiquer TensorSharp pour l'inférence .NET #12645). Aucun secret inline. Aucunos.getenv(..., "<literal>"). Pas de hand-edit de cellule.Attribution
Voir #12453 — livraison partielle (la liste README de la série Texte reste réservée par #12645).
See #12453