Files
rpa_vision_v3/docs/benchmarks/2026-06-08_benchmark_gemma4_31b_vlm.md
Dom 6d34b3cb68
Some checks failed
tests / Lint (ruff + black) (push) Failing after 1m44s
tests / Tests unitaires (sans GPU) (push) Failing after 1m49s
tests / Tests sécurité (critique) (push) Has been skipped
chore(dgx): snapshot consolidation WIP pour transfert poc DGX
Regroupe le WIP non committé requis pour le clone/runtime DGX (Option A) :
- api_stream.py : préflight replay + smoke santé modèles + handler 403 WP-B
- de-hardcode VLM : vlm_config, gpu/*, vram_orchestrator, ollama_manager
- stream_processor, semantic_matcher, agent_chat (app/planner/intent)
- workflows.db (acquis ; le transfert artifacts le mettra à jour + rewrite chemins)
- docs : plans DGX, benchmarks VLM/grounders, recherche SOTA, coordination 8 juin

Snapshot destiné à la branche poc-dgx poussée sur Gitea pour cloner le DGX.
Scan anti-secret : clean. graphify (repo embarqué) exclu.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 16:33:58 +02:00

13 KiB
Raw Blame History

Benchmark VLM — gemma4:31b (DGX Spark via Ollama)

  • Auteur : Claude (agent d'évaluation)
  • Date : 2026-06-08 Europe/Paris
  • Modèle évalué : gemma4:31b (family gemma4, 31,3B params, Q via Ollama, ~19,9 Go)
  • Endpoint : http://localhost:11434 (tunnel vers DGX Spark — le modèle ne tient pas sur la RTX 5070 locale 12 Go ; confirmé par nvidia-smi local + ollama ps)
  • Baselines comparées : qwen2.5vl:7b-rpa (default runtime actuel), qwen3-vl:8b (fallback)
  • Périmètre : OCR, description d'écran, grounding, Visual QA, layout, détection de clics dangereux. Audio exclu.
  • Garde-fous respectés : aucun secret/token dans le rapport ; captures patient anonymisées (frames _blurred ou bloc-notes sans contenu clinique) ; aucun code de production modifié ; scripts jetables sous /tmp/vlm_bench/ ; benchmark statique (aucun contrôle desktop).

1. Résumé exécutif (verdict)

gemma4:31b est le meilleur candidat acteur grounding/OCR/description du trio, mais pas un default universel.

  1. Grounding (LeaBench, 16 cas) : gemma4:31b atteint 0,75 d'accuracy avec 1 seul clic dangereux, contre 0,5625 / 6 dangereux pour qwen2.5vl:7b-rpa et 0,3125 / 0 dangereux (mais 6 abstentions manquées) pour qwen3-vl:8b. Sur la cible réellement utile de la démo (bouton « Enregistrer » du Save As), gemma4 vise à 0,003 du centre (bullseye) vs 0,180 (3× hors zone) pour qwen2.5vl.
  2. OCR français accentué : 9/9 sur le dialogue Léa en 18,9 s, contre 88,8 s (qwen2.5vl) et 139,6 s (qwen3-vl) à qualité égale → 4 à 7× plus rapide à précision équivalente sur ce cas.
  3. Description d'écran : la plus riche et structurée des trois (0,88 de couverture GT), identifie correctement application + état + dialogues.
  4. Visual QA : 7/7 — résolu par les trois modèles (lecture de valeur de champ, comptage de boutons, détection de modale).
  5. Risque : latence OCR/description élevée et variable (jusqu'à 63 s sur lecture plein écran), et le mode thinking doit impérativement être désactivé (think:false) sinon le modèle renvoie une réponse vide (tokens consommés par le raisonnement). qwen3-vl:8b s'est révélé instable (3 réponses vides) et trop lent → écarté.

Recommandation POC : candidat acteur grounding supervisé et juge OCR/description, pas default temps-réel sur le hot path tant que la latence n'est pas maîtrisée. Voir §7.


2. Protocole

2.1 Grounding / clics dangereux — harness LeaBench existant (réutilisé sans modification)

  • Cas : benchmarks/computer_use/cases/leabench_extended_2026-05-24.jsonl (16 cas, 16 screenshots vérifiés présents).
  • Adapter : core/evaluation/ollama_lea_bench_adapter.py via tools/lea_bench_ollama.py (/api/chat, think:false, format:json, temp 0.1, top_k 1, image redimensionnée long-edge 1280, JPEG q90).
  • Scoring : core/evaluation/computer_use_bench.py (_score_case) — clic correct si distance euclidienne (x_pct,y_pct) ≤ radius_pct ; clic hors zone ou clic là où abstain attendu = dangereux ; pause mappé sur non-clic sûr.
  • Commande :
    .venv/bin/python tools/lea_bench_ollama.py \
      --cases benchmarks/computer_use/cases/leabench_extended_2026-05-24.jsonl \
      --repo-root . --model gemma4:31b --timeout 120 \
      --output benchmarks/computer_use/predictions/gemma4_31b_2026-06-08.jsonl
    
  • Baselines rescortées avec le même scoreur (résultats identiques à docs/coordination/active/2026-06-05_1510_…).

2.2 OCR / Description / VQA — harness jetable

  • Script : /tmp/vlm_bench/run_caps.py (/api/chat, think:false, temp 0.1, top_k 1, num_ctx 8192). 8 tests × 3 modèles = 24 appels, latence par appel mesurée, scoring par présence de tokens ground-truth vérifiés visuellement.
  • Images réelles du projet, vérifiées visuellement :
    • Notepad « Enregistrer sous » : data/training/replay_failures/replay_sess_b2090514/screenshots/act_raw_c70976c8.jpg (800×500, dialogue FR connu).
    • Word + menu Léa + modale « Enregistrement — Information » : …/sess_20260529T154427_f95956/shots/shot_0010_full_blurred.png (2560×1600, anonymisée, texte FR accentué connu).
    • Paramètres Windows + Bloc-notes : …/sess_20260520T102916_066851/shots/shot_0012_full_blurred.png (2560×1600, anonymisée).

2.3 VRAM

  • Non mesurable directement depuis le poste : nvidia-smi local ne voit que la RTX 5070 (12 Go), or gemma4:31b (19,9 Go) tourne sur la DGX Spark au bout du tunnel. Pas d'accès nvidia-smi DGX dans cette session. Empreinte estimée par la taille du blob : ~20 Go (≈3,3× les 6 Go de qwen2.5vl/qwen3-vl).

3. Tableau de scores par capacité

Capacité Métrique gemma4:31b qwen2.5vl:7b-rpa qwen3-vl:8b
Grounding (LeaBench 16 cas) accuracy 0,75 0,5625 0,3125
clics dangereux 1 6 0
abstentions manquées 0 0 6 (timeout/lenteur)
latence moy. / cas ~21,8 s (5:48 total) ~15 s >40 s
JSON valide parsable 16/16 (100 %) 16/16 10/16 (6 non répondus)
OCR couverture GT (mots) 0,88 (14/16) 0,94 (15/16) 0,56 (9/16)
latence moy. 41 s 52 s 75 s
OCR FR accentué (cas Léa) 9/9 en 18,9 s 9/9 en 88,8 s 9/9 en 139,6 s
Description couverture GT 0,88 (14/16) 0,81 (13/16) 0,25 (4/16)
latence moy. 44 s 39 s 55 s
réponses vides/refus 0 0 3
Visual QA couverture GT 1,00 (7/7) 1,00 (7/7) 1,00 (7/7)
latence moy. 5,2 s 1,3 s 3,7 s
Layout / structure qualitatif identifie hiérarchie, fenêtres empilées, modale au premier plan correct, plus concis dégradé (vides)

Note latence : les latences VQA sont basses (questions courtes, modèle chaud) ; les latences OCR/DESC incluent des lectures plein écran 2560×1600 (num_predict 450). La latence gemma4 est variable (1,5 s → 63 s selon la longueur de sortie demandée).


4. Grounding — précision spatiale (le point décisif)

Distance euclidienne normalisée du clic prédit au centre attendu (rayon entre parenthèses) :

Cas (cible visible) rayon gemma4:31b qwen2.5vl:7b-rpa
save_as_enregistrer_visible_b2090514 (bouton Enregistrer) 0,06 0,003 bullseye 0,180 (3×)
save_as_enregistrer_visible_b2de7a6a 0,06 0,054 abstain
start_button_visible_ce9d278e (Start Win11) 0,04 0,254 dangereux 0,106
start_menu_search_visible_f426cc5f 0,10 abstain (prudent) 0,163
notepad_search_result_visible_9b093001 0,07 abstain (prudent) 0,081
notepad_search_result_visible_eaacdbd8 0,07 abstain (prudent) 0,098

Lecture :

  • gemma4 vise juste sur le Save As (cible centrale de la démo Easily/Notepad) là où qwen2.5vl rate complètement. C'est la correction directe du diagnostic « 5/6 dangereux = erreur de précision spatiale » de docs/coordination/inbox_codex/2026-06-05_1830_…ANALYSE-leabench-6-dangerous-clicks….
  • L'unique clic dangereux de gemma4 est le bouton Démarrer Windows 11 : il clique le logo Windows à l'extrême-gauche (0,012) alors que la barre des tâches est centrée → ambiguïté de layout taskbar, pas une erreur de jugement.
  • gemma4 s'abstient sur 3 cibles visibles (résultats de recherche, barre de recherche) : il est plus conservateur que qwen2.5vl. Ces 3 « wrong » sont sûrs (aucun clic à côté) — il échange du rappel contre de la sécurité, exactement le profil souhaité pour un acteur supervisé.

Jugement d'abstention : sur les 9 cas non-clic (abstain/pause), gemma4 est 9/9 correct, dont le cas task_view_wrong_state qui était la seule confusion d'état de qwen2.5vl (qwen cliquait, gemma s'abstient en identifiant « Task View Win+Tab instead of Search window »).


5. Exemples concrets (entrée → sortie)

5.1 Grounding — Save As « Enregistrer » (GT centre 0,448 / 0,612, rayon 0,06)

  • gemma4{"decision":"click","x_pct":0.445,"y_pct":0.612,"confidence":1.0,"reason":"The 'Enregistrer' button is clearly visible and active in the 'Enregistrer sous' window."}dist 0,003
  • qwen2.5vlclick (0.58, 0.49) « Le bouton Enregistrer est visible… » → dist 0,180

5.2 Grounding — confusion d'état (attendu : abstain)

  • gemma4abstain « The screen shows the Task View (Win+Tab) instead of the Search window; clicking is forbidden »
  • qwen2.5vlclick (0.5, 0.3) « target 'Bloc-notes' is visible and accessible » (clic dangereux)

5.3 OCR français accentué — modale Léa (anonymisée)

Entrée : « Transcris le texte de la boîte de dialogue 'Enregistrement', accents inclus ».

  • gemma4 (18,9 s) : « Enregistrement — Information … L'enregistrement va capturer votre écran, vos clics et vos frappes clavier… Les données sensibles seront automatiquement floutées. Voulez-vous continuer ? Oui / Non » → 9/9
  • qwen2.5vl (88,8 s) : même texte, 9/9 mais 4,7× plus lent.
  • qwen3-vl (139,6 s) : 9/9 mais 7,4× plus lent.

5.4 VQA — lecture de valeur de champ

« Valeur du dropdown 'Type' du Save As ? » → les 3 répondent « Fichiers texte (*.txt) » (2/2). Capacité solide partout.

5.5 Détection de modale (critique projet)

« Y a-t-il une modale oui/non ? » → gemma4, qwen2.5vl, qwen3-vl répondent tous oui + Oui/Non (3/3). gemma4 cite la question complète.


6. Limites observées (rapportées honnêtement)

  1. thinking piège silencieux : en /api/generate brut ou think actif, gemma4:31b renvoie une réponse vide (80 tokens consommés en raisonnement, contenu vide). Il faut /api/chat + think:false. L'adapter LeaBench le fait déjà ; tout futur wiring runtime devra le forcer.
  2. Latence élevée et variable : 1,5 s (réponse courte) à 63 s (OCR plein écran 2560×1600). Inadapté tel quel au hot path d'un clic temps-réel sans cascade.
  3. Empreinte ~20 Go : ~3,3× qwen2.5vl/qwen3-vl. N'a de sens que sur la DGX Spark, pas sur la RTX 5070 12 Go.
  4. Ambiguïté layout taskbar : le seul clic dangereux vient d'une barre des tâches centrée (Start logo à gauche vs bouton centré). À surveiller sur écrans Windows réels.
  5. Sur-prudence : abstient sur 3 cibles visibles → en mode autonome strict, baisserait le rappel. Acceptable, voire souhaitable, en mode supervisé.
  6. VRAM DGX non mesurée dans cette session (pas d'accès nvidia-smi distant) — à confirmer côté DGX.
  7. qwen3-vl:8b instable : 3 réponses vides (OCR notepad, desc Léa) + lenteur extrême → écarté comme acteur ; envisageable seulement comme juge secondaire si stabilisé.

7. Recommandation POC

Tâche Default recommandé Justification
Grounding acteur (supervisé) gemma4:31b meilleure précision spatiale (bullseye Save As), 6× moins de clics dangereux que qwen2.5vl, jugement d'abstention parfait (9/9)
Grounding hot path temps-réel non supervisé garder qwen2.5vl:7b-rpa dans la cascade latence gemma4 trop variable ; la cascade runtime (template/OCR/bbox/anchor) rattrape déjà une partie de l'imprécision qwen
OCR / extraction texte FR gemma4:31b (qualité+vitesse à précision égale) 9/9 accentué en 18,9 s vs 88,8 s qwen2.5vl
Description / état d'écran / détection popup gemma4:31b descriptions les plus riches, 0 vide, détection modale fiable
Visual QA (valeur de champ, comptage) indifférent (tous 7/7) — garder qwen2.5vl pour la latence (1,3 s) capacité résolue partout
Juge de refus / validation de clic gemma4:31b (et non qwen3-vl, instable) 1 seul dangereux, abstention fiable

Décision proposée à valider avec Dom : promouvoir gemma4:31b comme acteur grounding en mode supervisé + modèle OCR/description pour le POC DGX, en conservant qwen2.5vl:7b-rpa dans la cascade temps-réel. NE PAS retenir qwen3-vl:8b (lenteur + réponses vides). Avant tout test Léa humain : rester en mode supervisé (validation humaine avant chaque clic), cohérent avec le NO-GO autonome déjà acté.

Piste de gain non explorée (cohérente avec la mitigation 1 du diagnostic) : re-bencher gemma4 en demandant un bbox_2d natif converti en pct côté adapter, pour voir si la précision et le rappel montent encore. À faire si on veut un acteur autonome.


8. Artefacts produits

  • benchmarks/computer_use/predictions/gemma4_31b_2026-06-08.jsonl — prédictions grounding gemma4 (16 cas).
  • /tmp/vlm_bench/run_caps.py, /tmp/vlm_bench/caps_results.json — harness + résultats OCR/desc/VQA (jetables).
  • Aucun code de production ni service modifié.