Phase 12 - Lesson 09

Familia Qwen-VL y Video con FPS Dinámico

La familia Qwen-VL — Qwen-VL (2023), Qwen2-VL (2024), Qwen2.5-VL (2025), Qwen3-VL (2025) — es el linaje de modelos de lenguaje y visión abiertos más influyente en 2026. Cada generación tomó una única decisión de diseño arquitectónico decisiva que el resto del ecosistema abierto copió en un plazo de doce meses: resolución dinámica nativa a través de M-RoPE, muestreo de FPS dinámico con alineación temporal absoluta, atención de ventana en el ViT y formatos de salida de agente estructurados. Con Qwen3-VL, la receta se había estabilizado: un codificador ViT con RoPE 2D con entradas de relación de aspecto nativa, un proyector MLP hacia una base grande de lenguaje Qwen3, y etapas de entrenamiento que enfatizaban OCR, grounding y comportamiento de agentes como objetivos de primera clase. Esta lección analiza la familia cronológicamente para que comprendas por qué cada control está en su lugar.

Tipo: Learn Lenguajes: Python (stdlib, codificador M-RoPE + muestreador de FPS dinámico) Prerrequisitos: Fase 12 · 06 (patch-n'-pack) Tiempo: ~120 minutos

Objetivos de Aprendizaje

  • Calcular las rotaciones de tres ejes de M-RoPE (temporal, altura, ancho) y explicar por qué se necesitan las tres.
  • Elegir una estrategia de muestreo de FPS dinámico para un video y razonar sobre tokens por segundo versus precisión de detección de eventos.
  • Nombrar las cuatro actualizaciones generacionales de Qwen-VL en orden y qué habilitó cada una.
  • Configurar un formato de salida de agente JSON al estilo de Qwen2.5-VL y analizar llamadas a herramientas estructuradas a partir de una respuesta de VLM.

El Problema

Qwen-VL se lanzó en agosto de 2023 como respuesta directa a LLaVA-1.5 y BLIP-2. La brecha a la que apuntaba el equipo de Qwen era triple: resolución, video y salida estructurada.

Resolución: LLaVA-1.5 funcionaba a 336x336. Útil para fotos, inútil para una factura en chino o una captura de pantalla densa de una hoja de cálculo. La primera innovación de Qwen-VL fue 448x448 y una salida de caja delimitadora (bounding-box) con grounding, lo que permitía al modelo señalar cosas.

Video: Video-LLaMA apilaba codificadores por fotograma y los enviaba al LLM. Funcionaba para clips cortos, pero no para videos de varios minutos donde el eje temporal es la señal clave. El equipo de Qwen quería un único codificador que entendiera el tiempo.

Salida estructurada: LLaVA emitía texto libre. Un agente necesita JSON. Qwen-VL se entrenó con formatos de salida JSON explícitos que incluían coordenadas de cajas delimitadoras como texto.

Cada generación de Qwen-VL extiende uno de estos tres ejes.

El Concepto

Qwen-VL (Agosto de 2023)

La primera generación: OpenCLIP ViT-bigG/14 como codificador (2.5B de parámetros), Q-Former compatible con LLaMA (1 paso con 256 consultas), base Qwen-7B. Contribuciones:

  • Resolución de 448x448 (entonces SOTA para un VLM abierto).
  • Grounding: entrenado en pares de imagen-texto con salida explícita de tokens de coordenadas. "The cat is at (112, 204), (280, 344)".
  • Entrenamiento multilingüe en chino + inglés desde el principio.

Benchmarks en ese momento: competitivo con GPT-4V en inglés, dominante en chino. La supervisión de grounding fue la verdadera novedad.

Qwen2-VL (Septiembre de 2024) — M-RoPE y resolución nativa

Qwen2-VL reemplazó la pila de resolución fija + Q-Former con un codificador ViT de resolución dinámicamente nativa. Cambios clave:

  • Resolución dinámica nativa. El ViT acepta cualquier HxW divisible por 28 (patch 14 con fusión espacial de 2x). Una imagen de 1120x672 (40x24 parches fusionados) produce 960 tokens visuales. Sin cambios de tamaño, sin división en bloques (tiling), sin miniatura (thumbnail).
  • M-RoPE (RoPE Multimodal). Cada token lleva una posición 3D (t, h, w) en lugar de 1D. Para imágenes, t=0; para video, t = frame_index. RoPE rota los vectores de consulta/clave mediante una frecuencia por eje. Sin tabla de embedding posicional.
  • Proyector MLP. Eliminación de Q-Former; se utiliza un MLP de 2 capas en los tokens de parches fusionados.
  • Video con FPS dinámico. Video muestreado a 1-2 FPS por defecto, pero el modelo acepta recuentos de fotogramas arbitrarios.

Resultado: Qwen2-VL-7B igualó a GPT-4o en varios benchmarks multimodales y lo superó en DocVQA (94.5 vs 88.4). El cambio de arquitectura fue el movimiento decisivo.

Qwen2.5-VL (Febrero de 2025) — FPS dinámico + tiempo absoluto

El gran cambio de Qwen2.5-VL fue el video. El FPS dinámico no es solo "muestrear más fotogramas cuando sea necesario". El artículo formalizó:

  • Tokens de tiempo absoluto. En lugar de índices posicionales (fotograma 0, 1, 2...), se utilizan marcas de tiempo (timestamps) reales. "At 0:04, the cat jumps." El modelo ve tokens <time>0.04</time> intercalados con tokens de fotograma.
  • FPS dinámico. Muestreo a 1 FPS para tomas lentas, 4+ FPS para acción. El usuario o el entrenador eligen; M-RoPE se adapta.
  • Atención de ventana en ViT. La atención espacial está en ventanas (local dentro de los bloques) para aumentar el rendimiento (throughput); atención global cada pocas capas.
  • Formato de salida JSON explícito. Entrenado en datos de llamadas a herramientas: "{"tool": "click", "coords": [380, 220]}". Listo para agentes directamente de fábrica.
  • Escalamiento de MRoPE-v2. Las posiciones se escalan con el tamaño máximo de entrada para que un video de 10 minutos no se salga del rango de frecuencia.

Benchmarks: Qwen2.5-VL-72B supera a GPT-4o en la mayoría de los benchmarks de video, iguala a Gemini 2.0 en documentos y establece el SOTA para modelos abiertos en grounding de GUI (ScreenSpot: 84% de precisión frente al 38% de GPT-4o).

Qwen3-VL (Noviembre de 2025)

Qwen3-VL es una actualización incremental que consolida en lugar de reinventar: base de LLM más grande (Qwen3-72B), datos de entrenamiento ampliados, OCR mejorado, razonamiento más sólido a través del "thinking mode" de Qwen3. El ViT y M-RoPE se mantienen. El artículo se centra en mejoras de datos y entrenamiento más que en la arquitectura.

La conclusión de la saga: para 2025, la arquitectura de Qwen-VL se había estabilizado. Las generaciones adicionales escalan cómputo y datos, no las primitivas.

M-RoPE matemáticamente

El RoPE clásico rota una consulta q de dimensión d por la posición m utilizando coordenadas emparejadas:

q_rot[2i]   = q[2i]   * cos(m * theta_i) - q[2i+1] * sin(m * theta_i)
q_rot[2i+1] = q[2i]   * sin(m * theta_i) + q[2i+1] * cos(m * theta_i)
theta_i     = 10000^(-2i/d)

M-RoPE divide la dimensión oculta en tres bandas. Digamos d = 96. Asigna 32 dimensiones a lo temporal, 32 a la altura y 32 al ancho. Cada banda rota según la posición de su propio eje. Un parche en (t=5, h=10, w=20) recibe las rotaciones R_t(5), R_h(10), R_w(20) aplicadas a sus tres bandas.

Los tokens de texto utilizan t = text_index, h = 0, w = 0 (o una elección normalizada), manteniendo la compatibilidad. Los fotogramas de video utilizan t = frame_time, h = row, w = col. Las imágenes individuales utilizan t = 0.

El beneficio: una única codificación de posición maneja texto, imagen y video sin ramificaciones de código ni diferentes tablas de posiciones.

Lógica de muestreo de FPS dinámico

Dado un video de duración de T segundos y un presupuesto de tokens objetivo B:

  1. Calcula el FPS máximo admisible: fps_max = B / (T * tokens_per_frame).
  2. Elige un FPS objetivo de {1, 2, 4, 8} que satisfaga fps <= fps_max.
  3. Si el movimiento es alto (heurística de flujo óptico o solicitud explícita del usuario), elige un FPS más alto. Si el movimiento es bajo, elige uno más bajo.
  4. Muestrea uniformemente a los FPS elegidos; inserta tokens <time>t</time> entre fotogramas.

Qwen2.5-VL entrena esta lógica implícitamente; en la inferencia, el usuario controla mediante el parámetro fps. Una secuencia de acción de 60 segundos a 4 FPS con 81 tokens por fotograma = 19440 tokens, manejable en un contexto de 32k.

Salida estructurada de agentes

El entrenamiento del agente de Qwen2.5-VL se enfoca explícitamente en llamadas a herramientas estructuradas:

{
  "tool": "mouse_click",
  "coords": [1024, 512],
  "button": "left",
  "modifier": null
}

El análisis (parsing) es determinista: JSON.parse sobre la salida del modelo. Compáralo con el formato libre "click at (1024, 512)", que requería regex y manejo de ambigüedades. El cambio es la razón por la cual las puntuaciones de ScreenSpot de Qwen2.5-VL saltaron del 55% de Qwen2-VL al 84%.

Úsalo

El archivo code/main.py implementa:

  • Cálculo de posición M-RoPE para una secuencia empaquetada que mezcla texto, parches de imágenes y fotogramas de video.
  • Muestreador de FPS dinámico: dados (duración, presupuesto, nivel de movimiento), elige los FPS y emite las marcas de tiempo (timestamps) de los fotogramas.
  • Un analizador (parser) de juguete de salida JSON de Qwen2.5-VL que maneja respuestas de llamadas a herramientas con campos de coordenadas.

Ejecútalo y siente la diferencia al cambiar FPS fijo por FPS dinámico en un video de 5 minutos.

Envíalo

Esta lección produce outputs/skill-qwen-vl-pipeline-designer.md. Dada una tarea de video (monitoreo, agente, reconocimiento de acción, accesibilidad), emite la configuración de Qwen2.5-VL (presupuesto de fotogramas, estrategia de FPS, flag de atención de ventana, modo de salida de agente) y una estimación de latencia. Utiliza esto cada vez que implementes un modelo de la familia Qwen-VL para un producto de video.

Ejercicios

  1. Calcular las rotaciones de M-RoPE para un parche en (t=3, h=5, w=7) con dimensión oculta de 48 (16 por banda, theta base de 10000). Mostrar los ángulos de rotación para los primeros tres pares en cada banda.

  2. ¿Cuántos fotogramas produce una grabación de cámara de seguridad de 10 minutos a 1 FPS? A una resolución de 384 con pool de 3x, ¿cuántos tokens en total? ¿El contexto predeterminado de 32k de Qwen2.5-VL lo maneja?

  3. Elegir FPS para un rally de tenis de 30 segundos frente a una demostración de receta de 30 segundos frente a una grabación de un agente de interfaz de usuario de 30 segundos. Justificar cada uno con la lógica de FPS dinámico.

  4. Qwen2.5-VL elmina el Q-Former por completo. ¿Por qué funciona un MLP simple en 2025 pero no en 2023? (Pista: escala de datos y calidad del codificador).

  5. Analizar tres salidas de llamadas a herramientas JSON de Qwen2.5-VL en diccionarios Python. ¿Qué falla para un JSON mal formado y qué estrategia de recuperación recomienda el cookbook de Qwen?

Términos Clave

Término Qué dice la gente Qué significa realmente
M-RoPE "RoPE Multimodular" Embedding de posición rotativo 3D con bandas temporales, de altura y de ancho en la dimensión oculta
Dynamic FPS "Muestreo inteligente" Tasa de muestreo de fotogramas seleccionada por video según el movimiento, la duración y el presupuesto de tokens
Absolute time token "Token de marca de tiempo" <time>t</time> intercalado en la secuencia para que el modelo vea segundos reales y no el índice del fotograma
Window attention "Atención local" Autoatención espacial restringida a ventanas pequeñas para mayor velocidad; se agrega atención global periódicamente
Structured agent output "Modo JSON" Supervisión de datos de entrenamiento que enseña al VLM a emitir JSON procesable con coordenadas y nombres de herramientas
min_pixels / max_pixels "Límites de resolución" Controles de Qwen2.5-VL por solicitud que limitan el recuento total de píxeles y, por lo tanto, el recuento de tokens
Grounding "Señalar objetos" Emisión de coordenadas de caja delimitadora como tokens de texto; utilizado desde Qwen-VL v1

Lecturas Adicionales

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).