Exécutez Cette Évaluation Demain: Un Guide Étape par Étape pour des Comparaisons VLM Équitables
Même de petites incohérences—32 pixels ici, une séquence d’arrêt différente là—peuvent faire varier les scores des modèles vision-langage (VLM) de plusieurs points sur les principaux benchmarks. Avec les APIs introduisant également de la variabilité côté serveur, de nombreuses affirmations de “l’état de l’art” ne se reproduisent pas lors d’un second passage. Si vous avez besoin de résultats crédibles et audités pour demain, vous devez verrouiller les versions des modèles, normaliser les entrées, fixer le décodage, et exécuter le même cadre sur tous les modèles.
Cet article est un guide pratique et complet pour exécuter une évaluation VLM équitable en utilisant des outils communautaires et des artefacts reproductibles. Nous allons épingler les ID et points de terminaison des modèles (par exemple, GLM-Image via l’API de ZhipuAI aux côtés de GPT‑4o, Claude, et Gemini ), standardiser les prompts et les graines, et nous appuyer sur VLMEvalKit et LMMS‑Eval pour l’orchestration et le score officiel. Vous apprendrez exactement comment configurer de manière déterministe des conteneurs et des GPU, mettre en œuvre un régime neutre de promotion/décodage, prétraiter les images et vidéos de manière cohérente, et exécuter une suite de benchmarks équilibrée (MMBench, MM‑Vet, MMMU, VQA/GQA, COCO, RefCOCO, TextVQA/TextCaps/DocVQA/ChartQA, NLVR2/ScienceQA, et MSRVTT‑QA/NExT‑QA) avec des statistiques solides et des examens clairs [18–38]. Nous couvrirons également l’application du schéma JSON, les ablations Vision–RAG, le suivi de la latence/des coûts, et les pièges courants.
Détails de l’Architecture/Implémentation
Liste de vérification de préparation
- Verrouillez les ID exacts des modèles et des points de terminaison API avant tout score; re-validez juste avant la course complète. Par exemple: ZhipuAI GLM‑Image sur la plateforme ouverte Zhipu, la famille OpenAI GPT‑4o, Anthropic Claude 3.5 Vision, et les modèles Google Gemini Vision. Enregistrez les limites de jetons de contexte/vision et tous les modes d’appel JSON/outils [2–4][8–9].
- Geler les ensembles de données et les divisions de leurs sources officielles: MMBench, MM‑Vet, MMMU, VQA v2, GQA, COCO avec l’outil de légende COCO, la famille RefCOCO, TextVQA/TextCaps, DocVQA/InfographicVQA, ChartQA, NLVR2, ScienceQA, MSRVTT‑QA, NExT‑QA, POPE/CHAIR/ImageNet‑C pour la robustesse [36–38].
- Publier les digests d’images de conteneurs et les basculements de déterminisme; tester le prétraitement pour attraper les dérives.
Configuration de l’environnement
- OS de base: image Ubuntu LTS avec CUDA/cuDNN épinglée. Enregistrez les versions du pilote/toolkit CUDA pour la reproductibilité.
- GPU: Single A100 80GB ou H100 80GB, MIG désactivé, limites de puissance enregistrées.
- Conteneurs: Tirez par digest et enregistrez-le dans votre manifeste d’exécution. Préférez les références immuables de Docker et désactivez les mises à jour automatiques des couches.
Exemple de tirage/exécution Docker par digest:
docker pull nvcr.io/nvidia/pytorch@sha256:<digest>
docker run --gpus all --rm \
-e CUDA_VISIBLE_DEVICES=0 \
-e CUBLAS_WORKSPACE_CONFIG=:4096:8 \
-e CUDNN_DETERMINISTIC=1 \
-v $PWD:/workspace \
nvcr.io/nvidia/pytorch@sha256:<digest> bash
Interrupteurs de déterminisme
- Graines: définies dans Python, NumPy et PyTorch; contrôler le déterminisme CUDA/cuDNN là où disponible.
- cuDNN: activer les algorithmes de convolution déterministes; accepter les compromis de vitesse potentiels.
- cuBLAS: définir CUBLAS_WORKSPACE_CONFIG à un espace de travail fixe et réduit pour stabiliser la sélection GEMM.
import os, random, numpy as np, torch
os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":4096:8"
os.environ["CUDNN_DETERMINISTIC"] = "1"
random.seed(1337)
np.random.seed(1337)
torch.manual_seed(1337)
torch.cuda.manual_seed_all(1337)
torch.use_deterministic_algorithms(True)
Modèles de prompt et de décodage
- Prompt système neutre (identique sur tous les modèles): “Vous êtes un assistant vision-langage utile et précis. Suivez les instructions exactement. Si incertain, dites ‘pas sûr’. Évitez les affirmations non prises en charge.”
- Paramètres de décodage par défaut: température=0.2, top_p=0.9 (top_k désactivé sauf si requis), et séquences d’arrêt fixes. Conservez les jetons de sortie maximum par tâche constants.
- Mode JSON ou appel de fonction/outils si proposé par le fournisseur pour réduire les violations de schéma [8–9].
Détails de la pipeline d’entrée
- Politique de redimensionnement: limiter le côté long à 2048 px, conserver le format avec letterboxing; journalisez tous les paramètres de prétraitement. Si un modèle a des plafonds internes inférieurs, utilisez un découpage déterministe avec chevauchement et assemblage pour que aucun modèle ne soit pénalisé par sa limite native.
- Prompts multi-images: énumérez les indices fixes et conservez l’ordre.
- Vidéo courte: échantillonner K=8 ou 16 images espacées uniformément pour les modèles qui acceptent plusieurs images; consigner les indices de trame pour que les entrées soient identiques sur tous les modèles.
Opérations API robustes
- Journalisez chaque charge de demande/réponse, en-têtes, point de terminaison régional choisi, horodatages et ID du modèle/version.
- Utilisez des clés d’idempotence, un backoff exponentiel et du jitter; randomisez l’ordre des demandes pour réduire les artefacts de l’heure de la journée.
Exécution du benchmark
- Utilisez des cadres communautaires pour éviter les bogues sur mesure: VLMEvalKit et LMMS‑Eval couvrent de nombreux ensembles de données, scripts officiels et modèles standardisés. Vérifiez les rangs relatifs avec les tableaux de classement OpenCompass pour vérifier la gestion et les divisions.
- Pour chaque ensemble de données, respectez l’évaluation officielle: outil de légende COCO (CIDEr, SPICE, BLEU‑4, METEOR, ROUGE‑L); précision pour les tâches de classification/QA selon les définitions officielles (par exemple, MMBench/MMMU/VQA/GQA/NLVR2/ScienceQA) [20–22]. La famille RefCOCO rapporte IoU≥0.5 pour la localisation; restreignez les comparaisons aux modèles qui produisent des boîtes et marquez les autres “non pris en charge”.
Fonctionnalités non prises en charge et formatage des réponses
- Si un modèle ne peut pas produire de boîtes de délimitation ou d’appels d’outils, marquez cette tâche comme “non prise en charge” plutôt que la pénaliser.
- Évitez le raisonnement à étapes multiples, sauf s’il est uniformément autorisé. Limitez-vous à des réponses courtes lorsque les benchmarks nécessitent de l’exactitude.
Planification multi-grain et stockage
- Répétez les éléments génératifs pour plusieurs graines (par exemple, 5×) pour estimer la variance tout en gardant les paramètres de décodage fixes.
- Conventions de dossier: datasets/
/<modèle>/ / pour les sorties brutes; logs/ pour requête/réponse/latence; coûts/ pour comptabilité des jetons; télémétrie/ pour les mesures matérielles.
Évaluation et statistiques
- Utilisez des scripts officiels là où ils sont fournis.
- Reportez des IC à 95% via bootstrap non paramétrique (percentile ou BCa).
- Utilisez des tests appariés: McNemar pour la précision; permutation appariée pour les métriques continues. Appliquez Benjamini–Hochberg pour les comparaisons multiples.
Sorties structurées et application du schéma
- Fournissez un schéma JSON strict pour les tâches nécessitant de la structure (extraction, localisation, appels d’outils). Si l’API prend en charge le mode JSON ou l’appel de fonction, activez-le. Suivre les taux de JSON invalide et implémenter une nouvelle tentative avec backoff.
Outils et localisation
- Testez la réussite des appels de fonction avec des utilitaires simples (calculatrice, post-traitement OCR) pour mesurer la fiabilité de l’intégration.
- Pour la détection/localisation, Florence-2 est une forte ligne de base ouverte; normalisez le JSON des boîtes à un format commun pour l’évaluation IoU.
Évaluation Vision–RAG
- Fixer les embeddings et l’index de récupération sur tous les modèles. Effectuez une ablation: récupération OFF versus ON pour mesurer les gains incrémentaux attribuables à RAG plutôt qu’au VLM de base.
Profilage de l’efficacité et comptabilité des coûts
- Mesurer le temps jusqu’au premier jeton (TTFT) et le temps jusqu’au dernier jeton (TLTT); rapporter la latence p50/p90/p99 sous une concurrence de 1/8/32, en modes streaming et non streaming. Enregistrez la RAM VRAM/CPU et la puissance moyenne pour les exécutions sur site.
- Calculer les coûts par ensemble de données en utilisant les prix officiels des fournisseurs et la comptabilité des jetons de vision; vérifier avec les factures ou tableaux de bord.
Rapport et archivage
- Publier les résultats par catégorie avec intervalles de confiance, deltas statistiquement significatifs (par exemple, par rapport à GLM‑Image comme référence), visualisations de latence/débit, et coût par ensemble de données.
- Archivage de tous les artefacts: prompts, graines, configurations, digests de conteneurs, versions de harnais, journaux des requêtes, et prédictions brutes.
Tableaux de Comparaison
Harnais communautaires et portée
| Harnais | Ensembles de données couverts (exemples) | Intégration de score officiel | Support vidéo | Sorties structurées | Remarques |
|---|---|---|---|---|---|
| VLMEvalKit | MMBench, VQA/GQA, COCO, RefCOCO, TextVQA, ChartQA | Oui (par exemple, outil de légende COCO) | Partiel via multi-images | Peut imposer des formats via des prompts | Activement maintenu; adaptateurs de modèle larges |
| LMMS‑Eval | MMMU, ScienceQA, NLVR2, Text tasks | Oui | Limité | Schéma via des modèles | Fort pour les suites de raisonnement/alignement |
| OpenCompass LB | Résultats agrégés sur les suites | N/A | N/A | N/A | À utiliser pour vérifier les rangs relatifs |
Interrupteurs de déterminisme (sur site/modèles ouverts)
| Couche | Réglage | Comment |
|---|---|---|
| Python/NumPy | Graines aléatoires | random.seed, np.random.seed |
| PyTorch | torch.manual_seed; algorithmes déterministes | torch.use_deterministic_algorithms(True) |
| cuDNN | Convs déterministes | CUDNN_DETERMINISTIC=1 |
| cuBLAS | Espace de travail fixe | CUBLAS_WORKSPACE_CONFIG=:4096:8 |
| Conteneurs | Environnement immuable | Pull/run par digest; enregistrer SHA image |
Suite de benchmarks et métriques
| Catégorie | Ensembles de données | Métriques principales |
|---|---|---|
| Perception/raisonnement principal | MMBench, MM‑Vet, MMMU, VQA v2, GQA | Précision; score guidon (MM‑Vet) [18–22] |
| Légendage | COCO Captions | CIDEr, SPICE, BLEU‑4, METEOR, ROUGE‑L |
| Localisation | RefCOCO/+/g | Précision IoU≥0.5 |
| OCR/doc/graphique | TextVQA, TextCaps, DocVQA, InfographicVQA, ChartQA | Précision/EM/F1 selon tâche [25–30] |
| Multi-images/vidéo | NLVR2, ScienceQA, MSRVTT‑QA, NExT‑QA | Précision [32–35] |
| Robustesse | POPE, CHAIR, ImageNet‑C | Taux de hallucination; courbes de dégradation [36–38] |
Meilleures Pratiques
- Épingler tout, publier tout. ID modèles/points de terminaison, digests de conteneurs, versions de CUDA/cuDNN, SHAs de harnais, graines, et prompts devraient tous figurer dans un manifeste d’exécution.
- Gardez les entrées identiques. Limitez le côté long à 2048 px avec letterboxing; si les plafonds diffèrent, découpez déterministiquement et assemblez de manière cohérente.
- Standardiser le décodage. température=0.2, top_p=0.9, séquences d’arrêt fixes et max de jetons; évitez le raisonnement à étapes multiples sauf s’il est uniformément autorisé.
- Traiter les fonctionnalités non prises en charge de manière équitable. Marquez RefCOCO comme “non supporté” pour les modèles texte uniquement; ne forcez pas les boîtes de texte dans l’IoU.
- Mesurer l’incertitude. Exécutions multi-graines pour les tâches génératives; bootstrap IC 95% avec SciPy. Utilisez des tests appariés et correction BH.
- Imposer la structure. Utilisez le mode JSON ou l’appel de fonction lorsque disponible; mesurer le taux de JSON non valide et réessayer avec backoff.
- Tout instrumenter. Journalisez TTFT/TLTT, p50/p90/p99, concurrence 1/8/32, streaming vs non‑streaming, VRAM/CPU/puissance. Pour les APIs, capturez la région et les horodatages pour diagnostiquer la variance.
- Coût avec reçus. Calculez $ attendu en utilisant les pages de tarification des fournisseurs, puis vérifiez avec les factures/tableaux de bord.
- Ligne de base de localisation. Inclure Florence-2 pour la détection à vocabulaire ouvert et normaliser le JSON de boîte.
- Vérification de la rationalité des classements. Comparez vos classements relatifs à OpenCompass pour signaler les erreurs de gestion d’ensemble de données.
- Sécurité dans l’évaluation. Suivre la toxicité via un classificateur tiers et enregistrer le comportement de refus sur les prompts sensibles. Préservez et rapportez les champs de provenance d’image là où présents (C2PA).
Exemples Pratiques
1) VLMEvalKit pour COCO Captions et VQA v2
# Exemple: évaluer un adaptateur de modèle sur COCO Captions et VQA v2
vlmeval \
--model openai:gpt-4o \
--datasets coco_caption,vqa_v2 \
--temperature 0.2 --top_p 0.9 --max_tokens 64 \
--image_long_side 2048 --letterbox true \
--seeds 1337,1338,1339,1340,1341 \
--json_mode true \
--out_dir runs/2026-01-15/coco_vqa_gpt4o
2) Application strict du schéma JSON (Python)
from jsonschema import validate, ValidationError
schema = {
"type": "object",
"properties": {
"answer": {"type": "string"},
"confidence": {"type": "number", "minimum": 0, "maximum": 1}
},
"required": ["answer"]
}
def call_with_retries(client, prompt, schema, retries=2):
for attempt in range(retries+1):
resp = client.generate(prompt, json_mode=True) # Mode JSON si supporté
try:
validate(resp, schema)
return resp
except ValidationError:
if attempt == retries:
raise
3) Échantillonnage cohérent de trames pour QA vidéo
def sample_frames(total_frames, K=8):
# espacement uniforme inclus des points de terminaison
return [round(i*(total_frames-1)/(K-1)) for i in range(K)]
Utilisez le même K et indices pour tous les modèles acceptant des entrées multi-images; journalisez-les avec les prédictions.
4) cURL avec idempotence et journalisation
curl https://api.openai.com/v1/chat/completions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d @payload.json \
-o logs/$(date +%s)-resp.json
Enregistrez la région (si sélectionnable), les horodatages, et l’ID de modèle retourné. Répétez de manière similaire pour ZhipuAI, Anthropic, et Google.
5) Scoring COCO avec l’outil officiel
python eval_coco.py \
--annotations annotations/captions_val2017.json \
--results runs/.../coco_predictions.json \
--metrics CIDEr SPICE BLEU METEOR ROUGE \
--bootstrap 10000 # IC percentile
6) Ligne de base de localisation avec Florence‑2
python florence2_infer.py \
--images data/refcoco/val/*.jpg \
--task grounding \
--out runs/florence2/refcoco_boxes.json # normalisé [x0,y0,x1,y1]
Comparer la précision IoU≥0.5 avec les sorties VLM (seulement là où le VLM émet des boîtes).
Conclusion
Les comparaisons VLM reproductibles ne concernent pas des prompts astucieux; elles concernent les contrôles. Verrouillez les ID et environnements des modèles, unifiez le prétraitement à un letterbox de 2048 px avec découpage déterministe, fixez le décodage et les graines, et laissez les harnais établis exécuter les métriques officielles. Mesurez l’incertitude avec des IC bootstrap, suivez la latence et le coût sous concurrence contrôlée, et archivez chaque artefact pour que d’autres puissent reproduire vos chiffres. Si vous suivez ce guide, vous produirez des résultats qui résistent à l’examen par les pairs et se traduisent par des décisions de déploiement fiables.
Points clés:
- Geler les modèles, ensembles de données, conteneurs, graines, et prompts; journaliser chaque interaction API et détail de l’environnement.
- Appliquer des pipelines d’entrée identiques, des paramètres de décodage, et des schémas de sortie structurés sur tous les modèles.
- Utiliser VLMEvalKit/LMMS‑Eval avec score officiel et exécutions multi-graines; rapporter des IC à 95% et des tests appariés.
- Profiler TTFT/TLTT et concurrence; calculer les coûts à partir des pages fournisseurs et vérifier les factures.
- Publier tout: prédictions brutes, journaux, configurations, et digests de conteneurs.
Prochaines étapes:
- Créer un modèle de manifeste d’exécution et engager votre première configuration épinglée dès aujourd’hui.
- Testez à sec 100 échantillons sur deux modèles pour valider les prompts, schémas, et journalisation.
- Échelle complète avec une planification multi-graines, puis rapportez des IC et des deltas significatifs.
En regardant vers l’avenir, attendez-vous à ce que les harnais ajoutent une utilisation plus profonde des outils, des suites vidéo plus riches, et des contrôles de provenance par défaut; jusqu’à ce moment, ce guide est votre chemin le plus court vers des évaluations VLM équitables que les autres peuvent réellement reproduire. ✅