---
from: claude
to: dom
date: 2026-06-08T00:00:00+02:00
topic: perf-mvp-h1-torch-threads-complete
status: open
priority: high
references:
  - decision: docs/coordination/decisions/2026-06-05_dom_d19-performance-mvp-p1.md
  - report: docs/coordination/inbox/for-dom/2026-06-05_claude_diagnostic-perf-mvp.md
  - handoff: docs/coordination/inbox/for-claude/2026-06-05_20-55_dom-via-codex_handoff-fin-journee.md
---

# Perf MVP (D-19) — H1 torch threads COMPLÉTÉ

Reprise sur GO Dom ("tu peux reprendre si tu as des tâches à finir"). Aucune
diffusion, aucun build, aucun commit : modifs en working tree uniquement.

## Constat à la reprise

H1 était **partiellement** fait (ajouté après le handoff Codex du 05/06) :
`_configure_torch_threads()` existait mais (a) ne posait **pas** les variables
d'environnement `OMP/MKL` prévues par la spec H1, et (b) n'était appelée que
par l'OCR → un **PDF natif** (texte riche, OCR sauté) laissait le NER torch
(EDS-Pseudo, GLiNER) en mono-thread.

## Ce que j'ai ajouté (anonymizer_core_refactored_onnx.py)

1. **Variables d'env multi-cœur** posées en tête de module via `os.environ.setdefault`,
   AVANT l'import de pdfplumber/PIL (donc avant numpy/torch/onnxruntime) :
   `OMP_NUM_THREADS`, `MKL_NUM_THREADS`, `OPENBLAS_NUM_THREADS`,
   `NUMEXPR_NUM_THREADS`, `VECLIB_MAXIMUM_THREADS` = `os.cpu_count()`.
   `setdefault` : n'écrase jamais un réglage explicite (utilisateur/admin).
   → c'est ce que torch/onnxruntime lisent à l'init en EXE frozen.
2. `_configure_torch_threads()` rendue **idempotente** (flag global) : appelable
   depuis l'OCR comme depuis le NER sans risque sur `set_num_interop_threads`
   (qui ne peut être posé qu'une fois).
3. Appel ajouté dans `_run_ner_on_original_text()` → couvre le **PDF natif**
   (NER torch multi-cœur même sans OCR).

## Vérifications (Linux, ce jour)

- `python3 -m py_compile` : OK.
- `.venv/bin/python -m pytest tests/unit -q` : **98 passed** (non-régression).
- Exécution réelle : `torch.get_num_threads() = 32` après config (CPUs=32),
  idempotence confirmée (2e appel = no-op).
- **Aucun changement de détection / rectangles / texte produit** : H1 ne touche
  que le nombre de cœurs. Sortie identique, seul le temps change → leak score
  inchangé par construction.

## Ce que JE NE PEUX PAS faire (bloqué sur toi / Windows)

- Rebuild EXE Windows (H1+H2+H4) — machine de build + GO Dom requis.
- Mesurer le gain réel : il faut **ton PDF lent** + les lignes `PERF` du log.
- H3 (batch OCR) : à décider **seulement** si le log prouve que l'OCR scanné
  domine. Je ne l'ai pas touché.

## Questions pour orienter la suite

1. Ton PDF de test lent était **scanné** (OCR) ou **natif** (texte) ? + nb pages / taille.
2. Veux-tu que je **commite** H1+H2+H4 sur `feature/q1-quarantine-mvp` (ou une
   branche `fix/perf-mvp` dédiée) avant le rebuild, ou je laisse en working tree ?

— Claude
