chore(dgx): snapshot consolidation WIP pour transfert poc DGX
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

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>
This commit is contained in:
Dom
2026-06-08 16:33:58 +02:00
parent f18de016d7
commit 6d34b3cb68
204 changed files with 15744 additions and 47 deletions

View File

@@ -0,0 +1,107 @@
# Benchmark grounding — UI-TARS-1.5-7B (`0000/ui-tars-1.5-7b-q8_0:7b`) vs gemma4
**Date :** 2026-06-08
**Modèle évalué :** `0000/ui-tars-1.5-7b-q8_0:7b` (UI-TARS-1.5-7B, grounder GUI spécialisé, q8_0)
**Backend :** Ollama `http://localhost:11434` (tunnel DGX)
**Harness réutilisé :** identique aux benchs gemma4 du 2026-06-08 — mêmes 16 cas LeaBench (`benchmarks/computer_use/cases/leabench_extended_2026-05-24.jsonl`), mêmes images, même scoreur (`core.evaluation.computer_use_bench`).
---
## Résumé exécutif (verdict)
1. **UI-TARS ne peut PAS être benché : l'import Ollama sur le DGX est cassé.** Le GGUF re-téléchargé est **text-only, sans son projecteur de vision (mmproj/CLIP)**. Toute requête avec image est rejetée par Ollama.
2. **Preuve dure et reproductible** : `/api/chat``HTTP 500 "image input is not supported - hint: ... you may need to provide the mmproj"` ; `/api/generate``HTTP 400 "Multimodal data provided, but model does not support multimodal request"`. Sur les 16 cas, **0 appel image abouti**.
3. **Confirmé par les métadonnées du modèle** : `capabilities = ['tools', 'completion']`**pas de `vision`** ; `projector_info = {}` ; un seul blob `FROM`, aucun `ADAPTER`/mmproj. À comparer à `gemma4:26b` (`vision` présent) et `qwen2.5vl:7b-rpa` (`vision` présent).
4. **UI-TARS ne bat donc PAS gemma4:26b en grounding aujourd'hui : il ne tourne pas du tout en multimodal.** Accuracy non mesurable (modèle aveugle aux images). Le text-only répond (0,5 s) mais part en hallucination culinaire (« a quick, easy and healthy recipe ») — le template Ollama de cet import n'est même pas le format UI-TARS attendu.
5. **Impact production à signaler** : `core/execution/input_handler.py` appelle **exactement ce modèle** au niveau 2 de la cascade (`_grounding_ui_tars`, ligne 591) et il figure dans `FALLBACK_VLM_MODELS` (`core/detection/vlm_config.py:41`). En l'état, **le grounding niveau 2 retourne HTTP 500 en silence** sur le DGX. **gemma4:26b reste l'acteur grounding de référence.**
---
## Tableau comparatif (LeaBench 16 cas — comparaison directe, même harness)
| Modèle | Accuracy | Correct/16 | Clics dangereux | Cible démo « Enregistrer » | Latence/appel |
|---|---|---|---|---|---|
| **UI-TARS-1.5-7B** (`0000/...q8_0`) | **N/A — modèle aveugle** | 0/16 (aucun appel image abouti) | N/A | **Échec dur (HTTP 500/400)** | image rejetée ; text-only ~0,5 s |
| gemma4:26b | 0,6875 | 11/16 | **0** | 1/2 (b2090514 ✅ ~centre, b2de7a6a abstain) | ~mesuré le 2026-06-08 |
| gemma4:31b | 0,7500 | 12/16 | 1 | (cf. rapport 31b) | ~plus lent |
| qwen2.5vl:7b-rpa | 0,5625 | 9/16 | **6** | (cf. rapport qwen) | ~rapide |
> Chiffres gemma4/qwen re-vérifiés via le scoreur sur les prédictions existantes (`accuracy 0.6875 dangerous 0` pour 26b, `0.75 dangerous 1` pour 31b, `0.5625 dangerous 6` pour qwen2.5vl). La ligne UI-TARS est vide **non par choix méthodo mais par impossibilité technique** : pas d'inférence vision possible.
---
## Détail technique du blocage (mesures réelles)
### Appel image — `/api/chat`
```
HTTP 500
{"error":{"code":500,"message":"image input is not supported -
hint: if this is unexpected, you may need to provide the mmproj"}}
```
### Appel image — `/api/generate`
```
HTTP 400
{"error":{"code":400,"message":"Multimodal data provided, but model
does not support multimodal request"}}
```
### Métadonnées Ollama (`/api/show`)
| Champ | UI-TARS (`0000/...`) | gemma4:26b | qwen2.5vl:7b-rpa |
|---|---|---|---|
| `capabilities` | `['tools','completion']` | `['completion','vision','tools','thinking']` | `['completion','vision']` |
| `projector_info` | `{}` (vide) | présent | présent |
| blobs `FROM` | 1 seul, pas d'`ADAPTER`/mmproj | — | — |
| `family` | `qwen2vl` | — | — |
### Test text-only (sanity)
- Sans image : `HTTP 200` en **0,5 s**, le modèle charge bien sur le DGX.
- Réponse au prompt `"Click on 'Enregistrer'"` (text-only, sans écran) : `" to a quick, easy and healthy recipe"` → le template Ollama de cet import ne correspond pas au format de sortie UI-TARS (`click(start_box='(x,y)')`). L'import est doublement défaillant : pas de vision **et** template inadéquat.
---
## Ce qui était prévu (et reste valide quand le modèle sera réparé)
Le harness UI-TARS-natif était prêt :
- **Entrée** : screenshot + instruction courte `Click on '<target>'`.
- **Sortie attendue** : `click(start_box='(576,312)')`, coordonnées **normalisées 0-1000**`x_frac = 576/1000`, parsing regex sur `start_box` (déjà implémenté en prod : `core/execution/input_handler.py:_parse_ui_tars_coordinates`).
- **Pas de mode thinking**, prompt direct.
Dès que le modèle est réimporté **avec son mmproj**, ce harness peut produire la ligne manquante du tableau sans autre changement (mêmes 16 cas, même scoreur → comparaison directe valide).
---
## Limites sur écrans santé FR
Non évaluables ce jour : le modèle ne voit aucune image. **Aucune conclusion ne peut être tirée** sur la robustesse d'UI-TARS face aux écrans Easily Assure / Windows FR, ni sur la cible démo « Enregistrer ». Toute affirmation contraire serait infondée.
---
## Cause racine & remédiation
**Cause :** le pull `0000/ui-tars-1.5-7b-q8_0:7b` (upload communautaire Hub) ne package que le GGUF du LLM, **sans le fichier mmproj** (projecteur vision CLIP). UI-TARS étant intrinsèquement un VLM, sans projecteur il est aveugle.
**Remédiation (à valider avec Dom) :**
1. Réimporter via un Modelfile incluant le mmproj : `FROM ui-tars-1.5-7b.gguf` **+** `FROM ui-tars-1.5-7b-mmproj.gguf` (récupérer le mmproj depuis la même source GGUF).
2. Vérifier après import : `capabilities` doit contenir `vision`, `projector_info` non vide.
3. Sanity image avant de relancer le bench : un appel `/api/chat` avec image doit renvoyer `HTTP 200`.
---
## Recommandation — acteur grounding
**Garder `gemma4:26b` comme acteur grounding de référence sur le DGX.** Justification chiffrée :
- gemma4:26b : **0 clic dangereux** sur 16 cas, accuracy 0,6875, vise correctement la cible démo b2090514 (~centre de la zone attendue) — c'est le compromis sûreté/précision le plus défendable face à une audience clinique.
- gemma4:31b : meilleure accuracy (0,75) mais **1 clic dangereux** → arbitrage sûreté à trancher.
- qwen2.5vl:7b-rpa : rapide mais **6 clics dangereux** → écarté pour le runtime santé.
- **UI-TARS** : indisponible (import cassé). Tant que le mmproj n'est pas réintégré, **ne pas compter dessus au niveau 2** ; pire, l'appel niveau 2 en prod échoue actuellement en `HTTP 500` silencieux.
**Action prioritaire indépendante du bench :** comme `input_handler.py:591` et `vlm_config.py:41` pointent ce modèle cassé, le niveau 2 de la cascade et le fallback VLM sont **inopérants sur le DGX** jusqu'à réimport correct. À signaler à Dom (impact runtime, pas seulement bench).
---
## Garanties méthodo
- Aucun token, secret ni identité patient dans ce rapport.
- Mesures réelles, échec rapporté honnêtement (UI-TARS n'a pas pu être benché — c'est le résultat, pas une approximation).
- Aucun code de production modifié ; tous les scripts de test sont jetables (`/tmp/vlm_bench/`).