Ejecuta esta Evaluación Mañana: Un Manual Paso a Paso para Comparaciones de VLM Exactas
Incluso pequeñas inconsistencias—32 píxeles aquí, una secuencia de paradas diferente allá—pueden alterar las puntuaciones de los modelos de visión-lenguaje (VLM) por varios puntos en los principales benchmarks. Con las APIs también introduciendo variabilidad del lado del servidor, muchas afirmaciones de “estado del arte” no se replican en una segunda pasada. Si necesitas resultados creíbles y listos para auditorías mañana, debes bloquear las versiones de modelos, normalizar entradas, fijar la decodificación y ejecutar el mismo arnés en todos los modelos.
Este artículo es un manual práctico y completo para ejecutar una evaluación de VLM exacta usando herramientas comunitarias y artefactos reproducibles. Fijaremos IDs de modelo y puntos finales (por ejemplo, GLM-Image a través de la API de ZhipuAI junto con GPT-4o, Claude y Gemini ), estandarizaremos las indicaciones y semillas, y utilizaremos VLMEvalKit y LMMS-Eval para la orquestación y la puntuación oficial. Aprenderás exactamente cómo configurar contenedores deterministas y GPUs, implementar un régimen de indicaciones y decodificación neutrales, preprocesar imágenes y vídeos de manera consistente, y ejecutar un conjunto de benchmarks equilibrado (MMBench, MM-Vet, MMMU, VQA/GQA, COCO, RefCOCO, TextVQA/TextCaps/DocVQA/ChartQA, NLVR2/ScienceQA, y MSRVTT-QA/NExT-QA) con estadísticas robustas y archivo limpio [18–38]. También cubriremos la aplicación de esquemas JSON, ablaciones Vision‑RAG, seguimiento de latencia/costo, y errores comunes.
Detalles de Arquitectura/Implementación
Lista de verificación de preparación
- Bloquear IDs de modelos exactos y puntos finales de API antes de cualquier puntuación; volver a validar justo antes de la corrida completa. Por ejemplo: ZhipuAI GLM-Image en la Plataforma Abierta de Zhipu, la familia GPT-4o de OpenAI, Anthropic Claude 3.5 Vision, y los modelos de Google Gemini Vision. Registrar los límites de tokens contexto/visión y cualquier modo de llamada de JSON/herramienta [2–4][8–9].
- Congelar conjuntos de datos y divisiones desde sus fuentes oficiales: MMBench, MM-Vet, MMMU, VQA v2, GQA, COCO con las herramientas de subtítulos COCO, la familia RefCOCO, TextVQA/TextCaps, DocVQA/InfographicVQA, ChartQA, NLVR2, ScienceQA, MSRVTT-QA, NExT-QA, POPE/CHAIR/ImageNet-C para robustez [36–38].
- Publicar digests de imágenes de contenedores y activaciones de determinismo; pruebas unitarias de preprocesamiento para detectar desvíos.
Configuración del entorno
- SO base: imagen de Ubuntu LTS con CUDA/cuDNN fijados. Registrar las versiones del controlador/toolkit de CUDA para reproducibilidad.
- GPU: Una A100 80GB o H100 80GB, MIG deshabilitado, límites de potencia registrados.
- Contenedores: Descarga por digest y registra en tu manifiesto de ejecución. Prefiere referencias inmutables de Docker y desactiva actualizaciones automáticas de capas.
Ejemplo de descarga/ejecución de Docker por 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
Cambios de determinismo
- Semillas: establecer en Python, NumPy y PyTorch; controlar el determinismo de CUDA/cuDNN donde esté disponible.
- cuDNN: habilitar algoritmos de convolución deterministas; aceptar posibles compensaciones de velocidad.
- cuBLAS: establecer CUBLAS_WORKSPACE_CONFIG a un espacio de trabajo pequeño y fijo para estabilizar la selección de 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)
Plantillas de indicaciones y decodificación
- Indicación del sistema neutral (idéntica en todos los modelos): “Eres un asistente de visión-lenguaje útil y preciso. Sigue las instrucciones exactamente. Si no estás seguro, di ‘no estoy seguro’. Evita afirmaciones no soportadas.”
- Configuraciones de decodificación por defecto: temperatura=0.2, top_p=0.9 (top_k desactivado a menos que sea necesario), y secuencias de parada fijas. Mantener un máximo de tokens de salida por tarea constante.
- Modo JSON o llamadas a funciones/herramientas si el proveedor lo ofrece para reducir violaciones de esquema [8–9].
Detalles del flujo de entrada
- Política de cambio de tamaño: limitar el lado largo a 2048 px, preservar el aspecto con encuadre; registrar todos los parámetros de preprocesamiento. Si un modelo tiene límites internos más bajos, usar mosaico determinista con superposición y unión para que ningún modelo sea penalizado por su límite nativo.
- Indicaciones de múltiples imágenes: enumerar índices fijos y preservar el orden.
- Vídeo corto: muestrear K=8 o 16 cuadros espaciados uniformemente para modelos que aceptan múltiples imágenes; registrar índices de cuadros para que las entradas sean idénticas en todos los modelos.
Operaciones robustas de API
- Registrar todas las cargas de solicitud/respuesta, encabezados, el punto final regional elegido, marcas de tiempo e ID de modelo/versión.
- Usar claves de idempotencia, retroceso exponencial y jitter; aleatorizar el orden de las solicitudes para reducir artefactos de tiempo del día.
Ejecución del benchmark
- Usar arneses comunitarios para evitar errores propios: VLMEvalKit y LMMS-Eval cubren muchos conjuntos de datos, scripts oficiales y plantillas estandarizadas. Verificar rangos relativos con las tablas de clasificación de OpenCompass para verificar el manejo y las divisiones.
- Para cada conjunto de datos, cumplir con la evaluación oficial: herramientas de subtítulos COCO (CIDEr, SPICE, BLEU-4, METEOR, ROUGE-L); precisión para tareas de clasificación/QA según definiciones oficiales (por ejemplo, MMBench/MMMU/VQA/GQA/NLVR2/ScienceQA) [20–22]. La familia RefCOCO reporta IoU≥0.5 para la localización; restringir comparaciones a modelos que produzcan cuadros y marcar otros como “no soportado”.
Funciones no soportadas y formato de respuestas
- Si un modelo no puede generar cuadros delimitadores o llamadas a herramientas, marca esa tarea como “no soportada” en lugar de penalizarla.
- Evitar cadenas de pensamiento a menos que se permita de manera uniforme. Limitarse a respuestas cortas donde los benchmarks requieran exactitud.
Programación de múltiples semillas y almacenamiento
- Repetir ítems generativos para múltiples semillas (por ejemplo, 5×) para estimar la varianza manteniendo fijas las configuraciones de decodificación.
- Convenciones de carpetas: datasets/
/ / / para salidas brutas; logs/ para solicitudes/respuestas/latencia; costs/ para contabilidad de tokens; telemetry/ para métricas de hardware.
Puntuación y estadísticas
- Usar scripts oficiales donde se proporcionen.
- Reportar CIs al 95% a través de bootstrap no paramétrico (percentil o BCa).
- Usar pruebas pareadas: McNemar para precisión; pruebas de permutación pareadas para métricas continuas. Aplicar Benjamini-Hochberg para comparaciones múltiples.
Salidas estructuradas y aplicación de esquemas
- Proporcionar un esquema JSON estricto para tareas que requieran estructura (extracción, localización, llamadas a herramientas). Si la API soporta el modo JSON o llamadas a funciones, habilitarlo. Rastrear tasas de JSON inválido e implementar reintentos con retroceso.
Herramientas y localización
- Probar el éxito de las llamadas a funciones con utilidades simples (calculadora, post-procesamiento OCR) para medir la fiabilidad de la integración.
- Para detección/localización, Florence-2 es una fuerte referencia abierta, normalizar el JSON de cuadros a un formato común para evaluación de IoU.
Evaluación Vision-RAG
- Fijar embeddings y el índice de recuperación en todos los modelos. Ejecutar una ablación: recuperación APAGADA vs ENCENDIDA para medir ganancias incrementales atribuibles a RAG en lugar del VLM base.
Perfilado de eficiencia y contabilidad de costos
- Medir tiempo-al-primer-token (TTFT) y tiempo-al-último-token (TLTT); reportar p50/p90/p99 de latencia bajo concurrencia 1/8/32, en modos de streaming y no streaming. Registrar VRAM/CPU RAM y potencia promedio para ejecuciones en premisas.
- Calcular costos por conjunto de datos usando precios oficiales del proveedor y contabilidad de tokens de visión; verificar con facturas o paneles de control.
Reporte y archivo
- Publicar resultados por categoría con intervalos de confianza, deltas estadísticamente significativos (por ejemplo, vs GLM-Image como referencia), visualizaciones de latencia/rendimiento y costo por conjunto de datos.
- Archivar todos los artefactos: indicaciones, semillas, configuraciones, digests de contenedores, versiones de arneses, registros de solicitudes y predicciones brutas.
Tablas de Comparación
Arneses comunitarios y alcance
| Arnés | Conjuntos de datos cubiertos (ejemplos) | Integración de puntuación oficial | Soporte de video | Salidas estructuradas | Notas |
|---|---|---|---|---|---|
| VLMEvalKit | MMBench, VQA/GQA, COCO, RefCOCO, TextVQA, ChartQA | Sí (por ejemplo, herramientas de subtítulos COCO) | Parcial vía cuadros múltiples de imagen | Puede aplicar formatos a través de indicaciones | Mantenido activamente; adaptadores amplios de modelo |
| LMMS-Eval | MMMU, ScienceQA, NLVR2, Tareas de texto | Sí | Limitado | Esquema vía plantillas | Fuerte para suites de razonamiento/alineamiento |
| OpenCompass LB | Resultados agregados por suites | N/A | N/A | N/A | Usar para verificar rangos relativos |
Cambios de determinismo (en-premisa/modelos abiertos)
| Capa | Configuración | Cómo |
|---|---|---|
| Python/NumPy | Semillas aleatorias | random.seed, np.random.seed |
| PyTorch | torch.manual_seed; algoritmos deterministas | torch.use_deterministic_algorithms(True) |
| cuDNN | Convoluciones deterministas | CUDNN_DETERMINISTIC=1 |
| cuBLAS | Espacio de trabajo fijo | CUBLAS_WORKSPACE_CONFIG=:4096:8 |
| Contenedores | Entorno inmutable | Descargar/ejecutar por digest; registrar imagen SHA |
Conjunto de benchmarks y métricas
| Categoría | Conjuntos de datos | Métricas principales |
|---|---|---|
| Percepción/razonamiento central | MMBench, MM-Vet, MMMU, VQA v2, GQA | Precisión; puntuación de rúbrica (MM-Vet) [18–22] |
| Subtitulación | Subtítulos COCO | CIDEr, SPICE, BLEU-4, METEOR, ROUGE-L |
| Localización | RefCOCO/+/g | Precisión IoU≥0.5 |
| OCR/doc/gráfico | TextVQA, TextCaps, DocVQA, InfographicVQA, ChartQA | Precisión/EM/F1 dependiendo de la tarea [25–30] |
| Múltiples imágenes/vídeo | NLVR2, ScienceQA, MSRVTT-QA, NExT-QA | Precisión [32–35] |
| Robustez | POPE, CHAIR, ImageNet-C | Tasas de alucinación; curvas de degradación [36–38] |
Mejores Prácticas
- Fijar todo, publicar todo. IDs de modelos/puntos finales, digests de contenedores, versiones de CUDA/cuDNN, SHAs de arneses, semillas e indicaciones deben vivir en un manifiesto de ejecución.
- Mantener idénticas las entradas. Limitar el lado largo a 2048 px con encuadre; si los límites difieren, hacer mosaico de manera determinista y unir consistentemente.
- Estandarizar la decodificación. temperatura=0.2, top_p=0.9, secuencias de parada fijas y tokens máximos; evitar la cadena de pensamiento a menos que se permita de manera uniforme.
- Tratar características no compatibles con justicia. Marcar RefCOCO como “no soportado” para modelos solo de texto; no encajar cuadros de texto en IoU.
- Medir incertidumbre. Ejecuciones con múltiples semillas para tareas generativas; bootstrap de CIs al 95% con SciPy. Usar pruebas pareadas y corrección BH.
- Aplicar estructura. Usar modo JSON o llamadas a funciones cuando esté disponible; medir la tasa de JSON inválido y reintentar con retroceso.
- Instrumentar todo. Registrar TTFT/TLTT, p50/p90/p99, concurrencia 1/8/32, streaming versus no streaming, VRAM/CPU/potencia. Para APIs, capturar región y marcas de tiempo para diagnosticar variabilidad.
- Costear con recibos. Calcular $ esperado usando páginas de precios del proveedor, luego verificar facturas/paneles de control.
- Línea base de localización. Incluir Florence-2 para detección de vocabulario abierto y normalizar JSON de cuadros.
- Verificación de rangos. Comparar tus ordenamientos relativos con OpenCompass para detectar errores en el manejo de conjuntos de datos.
- Seguridad en evaluación. Rastrear toxicidad a través de un clasificador de terceros y registrar comportamiento de rechazo en indicaciones sensibles. Mantener y reportar campos de procedencia de imagen donde estén presentes (C2PA).
Ejemplos Prácticos
1) VLMEvalKit en una línea para Subtítulos COCO y VQA v2
# Ejemplo: evaluar un adaptador de modelo en Subtítulos COCO y 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) Aplicación estricta de esquema 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) # Modo JSON si se soporta
try:
validate(resp, schema)
return resp
except ValidationError:
if attempt == retries:
raise
3) Muestreo consistente de cuadros para QA de vídeo
def sample_frames(total_frames, K=8):
# espacio uniforme inclusivo de los puntos finales
return [round(i*(total_frames-1)/(K-1)) for i in range(K)]
Usar el mismo K e índices para todos los modelos que aceptan entradas de múltiples imágenes; registrarlos junto con las predicciones.
4) cURL con idempotencia y registro
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
Registrar región (si es seleccionable), marcas de tiempo y el ID de modelo devuelto. Repetir de manera similar para ZhipuAI, Anthropic y Google endpoints.
5) Puntuación de COCO con herramientas oficiales
python eval_coco.py \
--annotations annotations/captions_val2017.json \
--results runs/.../coco_predictions.json \
--metrics CIDEr SPICE BLEU METEOR ROUGE \
--bootstrap 10000 # CI percentil
6) Línea base Florence-2 para localización
python florence2_infer.py \
--images data/refcoco/val/*.jpg \
--task grounding \
--out runs/florence2/refcoco_boxes.json # normalizado [x0,y0,x1,y1]
Comparar precisión IoU≥0.5 con las salidas VLM (solo donde el VLM emite cuadros).
Conclusión
Las comparaciones replicables de VLM no se tratan de indicaciones ingeniosas; se tratan de controles. Bloquea los IDs de modelos y ambientes, unifica el preprocesamiento a
una caja de 2048 px con mosaico determinista, fija la decodificación y las semillas, y deja que los arneses establecidos ejecuten las métricas oficiales. Mide la incertidumbre con CIs de bootstrap, rastrea la latencia y el costo bajo concurrencia controlada, y archiva cada artefacto para que otros puedan reproducir tus números. Si sigues este manual, producirás resultados que aguantarán el escrutinio de pares y se traducirán en decisiones de despliegue confiables.
Puntos clave:
- Congela modelos, conjuntos de datos, contenedores, semillas e indicaciones; registra cada interacción de API y detalle del entorno.
- Aplica pipelines de entrada idénticos, parámetros de decodificación y esquemas de salidas estructuradas en todos los modelos.
- Usa VLMEvalKit/LMMS‑Eval con puntuación oficial y ejecuciones de múltiples semillas; reporta CIs al 95% y pruebas pareadas.
- Perfile TTFT/TLTT y concurrencia; calcula costos desde páginas del proveedor y verifica con facturas.
- Publica todo: predicciones brutas, registros, configuraciones y digests de contenedores.
Próximos pasos:
- Crea una plantilla de manifiesto de ejecución y compromete tu primera configuración fijada hoy.
- Ejecuta una prueba con 100 muestras en dos modelos para validar indicaciones, esquemas y registros.
- Escala al conjunto completo con programación de múltiples semillas, luego reporta CIs y deltas significativos.
Mirando hacia adelante, espera que los arneses añadan un uso más profundo de herramientas, suites de vídeo más ricas, y verificaciones de procedencia por defecto; hasta entonces, este manual es tu camino más corto hacia evaluaciones de VLM exactas que otros realmente puedan reproducir. ✅