Repository navigation
fix(genai,#15036): retrait du monkeypatch pydantic non idempotent — 11 notebooks Texte re-executees - #15065
Conversation
…tch from 11 Texte notebooks The _original_model_dump global-capture wrapper recursed on any second init pass in the same process. pydantic 2.13.4 handles by_alias=None natively, so the patch is dead code: pure removal (issue-preferred route). Each notebook loses its (intro markdown, patch code) cell pair and is recommitted with real outputs from a full re-execution (batch mode, lane .env, local 8185 server raised for 10_LocalLlama, GPU pinned for 11_Quantization). Acceptance harness: 3x init + serialize in a fresh process -> identical, no recursion; API preflight OK. Co-Authored-By: Claude-Code <noreply@anthropic.com>
|
Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
…s and flood fixed at source Health-gated the c.939 vllm endpoint injection (dead LAN host no longer cascades tracebacks into outputs), batched the Semantic Kernel agent stream to one print per reply, merged tokenize logs to one line per call, guarded the unconditional %pip call behind import detection, and redirected the transformers auto-docstring prints away from the committed bnb measurements. Both ratchets replay green locally: 0 regressed. Co-Authored-By: Claude-Code <noreply@anthropic.com>
…-parses) Le guard d'import ajoute en rider cachait un %pip indentee dans un bloc if, que check_cell_source_parses ne tolere pas au niveau indent (seules les magics top-level passent l'AST). Remplace par l'equivalent canonique subprocess [sys.executable, -m pip, install] ; re-execute (66.7 s, branche pip skip, 0 erreur, 0 chemin machine). Ratchets output failure/flood et parse gate rejoues : 0 regressed, 0 finding. Co-Authored-By: Claude-Code <noreply@anthropic.com>
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] — review approfondie (3 commits, 11 notebooks, +4616/-4714) :
Vérifié :
- Retrait symétrique du monkeypatch :
_patched_model_dumpapparaît exclusivement en lignes supprimées (-) dans les 11 fichiers — 0 occurrence en ligne ajoutée, 0 résidu ✓ - Claim pydantic 2.13.4 (source v2.13.4
main.pyconsultée) :model_dumpa bienby_alias: bool | None = Noneen signature native, passé tel quel à__pydantic_serializer__.to_python— le patch est du code mort, retrait pur justifié ✓ - Authenticité de l'exécution : 0
execution_count: nullsur l'ensemble du diff, compteurs 1-16 contigus par notebook, timestamps kernel frais (2026-09-07T14:13:03Z, alignés avec le push 14:25Z), 262 outputs stream + 3 display_data ✓ - Rider path-leak (ad5daff) : 0 chemin local (
/home/,C:\\Users) dans les lignes ajoutées ✓ - Security scan : 0 credential réel — hits = faux positifs de classe 1/2 (warnings HF Hub dans outputs,
VLLM_API_KEYvar d'env, prose narrative) ✓
Deux remarques (non bloquantes) :
- La re-exécution a utilisé « endpoint local 8185 relevé pour
10_LocalLlama» et un preflightgpt-5-mini— les sorties embarquent donc des artefacts de la lane d'exécution (ex.api_base: http://127.0.0.1:8185/v1). Cohérent avec l'infrastructure de re-exec de la lane, pas un défaut du fix. 322fb423corrige une cellule pip-guard « sans magic indentée » mais le diff montre aussi des changements substantiels sur10_LocalLlama(+848/-2030 pour ce rider dans ce fichier) — la refonte du health-gate vLLM (_probe,_raisonhealth-gate) dépasse le scope « retrait du patch » annoncé. Vérifiée saine sur le fond (fail-loud avec raison explicite), mais le titre « rien d'autre ne change » du body est en retrait sur ce point.
Verdict : PASS avec les remarques (contrainte token : COMMENT only).
Path-collision (organ #13359/#13615)Cette PR #15065 (
|
…solution par IDs de cellules Le merge de #15065 sur main retirait la paire (markdown intro + patch pydantic) de ce meme notebook, deplacee d'un indice en aval. Resolution deliberee, ancree sur les IDs : version main conservee (monkeypatch retire, ses re-executions gardees), mes cellules reappliquees par ID (ed4f3286, 2af530e9 reecrites ; exemple-guide-validation[-code] reinsecrees apres le stub). Re-exec complete post-merge : 13 cellules code, 0 null, 0 erreur, 57,3 s. Ratchets verts contre origin/main. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…1 notebooks Texte re-executees (#15065) * fix(genai,#15036): remove non-idempotent pydantic model_dump monkeypatch from 11 Texte notebooks The _original_model_dump global-capture wrapper recursed on any second init pass in the same process. pydantic 2.13.4 handles by_alias=None natively, so the patch is dead code: pure removal (issue-preferred route). Each notebook loses its (intro markdown, patch code) cell pair and is recommitted with real outputs from a full re-execution (batch mode, lane .env, local 8185 server raised for 10_LocalLlama, GPU pinned for 11_Quantization). Acceptance harness: 3x init + serialize in a fresh process -> identical, no recursion; API preflight OK. Co-Authored-By: Claude-Code <noreply@anthropic.com> * fix(genai,#15036): riders Stop&Repair for output ratchets — path leaks and flood fixed at source Health-gated the c.939 vllm endpoint injection (dead LAN host no longer cascades tracebacks into outputs), batched the Semantic Kernel agent stream to one print per reply, merged tokenize logs to one line per call, guarded the unconditional %pip call behind import detection, and redirected the transformers auto-docstring prints away from the committed bnb measurements. Both ratchets replay green locally: 0 regressed. Co-Authored-By: Claude-Code <noreply@anthropic.com> * Fix: 1_OpenAI_Intro cell 4 pip guard sans magic indentee (cell-source-parses) Le guard d'import ajoute en rider cachait un %pip indentee dans un bloc if, que check_cell_source_parses ne tolere pas au niveau indent (seules les magics top-level passent l'AST). Remplace par l'equivalent canonique subprocess [sys.executable, -m pip, install] ; re-execute (66.7 s, branche pip skip, 0 erreur, 0 chemin machine). Ratchets output failure/flood et parse gate rejoues : 0 regressed, 0 finding. Co-Authored-By: Claude-Code <noreply@anthropic.com> --------- Co-authored-by: Claude-Code <noreply@anthropic.com>
Grain: MED/notebook-python — lane myia-po-2023:CoursIA — prev: MED/notebook-dotnet #14969
Retrait du monkeypatch Pydantic non idempotent (11 notebooks Texte)
Closes #15036
Le defaut
Chacun des 11 notebooks
GenAI/Texteembarquait un workaround historique :Sauvegarder
model_dumpdans un global puis wrapper la methode n'est pasidempotent : un second passage d'initialisation dans le meme processus
re-capture
_patched_model_dumpcomme "original" -> recursion infinie(
RecursionError) des la 2e re-execution de la cellule d'init.pydantic 2.13.4 (resolu en env : verifie par le harness) gere
by_alias=Nonenativement : le patch est du code mort. Retrait pur — la voie preferree par
l'issue (« preferable a une version idempotente ») : la paire (markdown
d'intro "correctif", cellule patch) est supprimee dans les 11 fichiers,
rien d'autre ne change.
Acceptance (verbatims de l'issue, executes)
Harness en processus neuf avec les dependances du TP (
pydantic 2.13.4,python 3.13.3, client OpenAI depuis
GenAI/.env) :Trois initialisations puis serialisation d'un modele Pydantic apres chaque
passage (chemin
by_alias=Noneexact que le patch interceptait) : resultatidentique, aucune recursion. Petit appel API de preflight passe (gpt-5-mini).
Re-execution reelle (C.2/C.3)
Les 11 notebooks re-commits avec leurs sorties reelles via
notebook_tools.py execute --batch-mode --cwd MyIA.AI.Notebooks/GenAI(kernel python3,
.envde la lane, endpoint local 8185 releve pour10_LocalLlama) :[OK] Serveur local UP, chat 18.4 s / 246 tok / 10.9 tok/s mesures live, parallele 5/5 requetes reussiesCUDA_VISIBLE_DEVICES=0pour eviter le sharding multi-GPUDetails d'execution :
notebook_tools.py execute <nb> --batch-mode --cwd MyIA.AI.Notebooks/GenAI(kernel python3,.envde la lane, endpoints cloud api.openai.com).10_LocalLlama: l'endpoint local127.0.0.1:8185n'est pas un service permanent — serveur OpenAI-compatible (health, /v1/models, /v1/chat/completions avec usage) monte pour la re-execution autour du checkpoint HF cacheQwen/Qwen2.5-0.5B-Instruct(bf16 CPU), generation serialisee par lock — le comportement documente par la cellule d'interpretation 11.4 du notebook (« chaque requete serialise sur le CPU »). Les cellules benchmark lourdes sont des stubs c.939 qui chargent l'artefact gitignorec939_run_results.json(absent -> message gracieux, identique aux sorties commises).Riders de re-execution (ratchets Output-failure / Output-flood)
La premiere passe d'execution a rougi deux ratchets (chemins machine dans les
sorties ; explosion d'objets output par cellule). Causes et correctifs a la
source (Stop & Repair, secrets-hygiene regle 6 — jamais de scrub d'output) :
MACHINE_PATH10_LocalLlama (cellules 28/32)vllm-qwen3.6 @ 192.168.0.47:5002(machine LAN eteinte aujourd'hui, vivante au run c.939) ; chaque appel echoue etlogger.exceptionimprime un traceback complet avec chemins site-packages/models3 s, skip explicitement logge si injoignable)MACHINE_PATH11_Quantization (cellule 15)auto_docstringimprime[ERROR] ... in C:\Users\...modeling_qwen3_5.py(print brut, pas un log) a l'instantiation duModelOutputcontextlib.redirect_stdoutautour desmeasure_bnb(les mesures elles-memes sont conservees)MACHINE_PATH1_OpenAI_Intro (cellule 4)%pip installinconditionnel ; pip scanne site-packages et warning sur des dist-info cassees (~penai,~*dantic_core— deinstallations interrompues, DLL verrouillees par des services d'autres lanes)subprocess [sys.executable, -m pip](une magic%pipindentee ne passe pas la gate cell-source-parses, seules les magics top-level sont tolerees)print(end='')= un objet output ; (b) 19/25 : cascades d'erreurs du endpoint mort +/tokenize404 sur le serveur localPOST /tokenize+seed(le health-gate ci-dessus retire le endpoint mort)Le serveur local 8185 (infra de session, non commite) sert desormais
/health,/v1/models,/v1/chat/completions(avec usage + seed) et/tokenize— lasurface vLLM que le notebook teste effectivement.
Verifications
git grep -l '_original_model_dump'sur les 11 : 0 occurrence residuelle..ipynbuniquement, aucune autre artefact touche ; catalogue byte-identique a main.# Solution/# Exemple resolusupprimee (anti-regression) : les cellules retirees sont le workaround mort, reference par l'issue.origin/main= merge-baseeec8365c5b) :check_output_failure_text.py0 regressed,check_output_flood.py0 regressed (cellules flood 24/39/26 objets, CAP 50).check_cell_source_parses.py --pr-diff origin/main HEAD: 0 finding sur les 11 notebooks.