Phase 08 - Lesson 10

Geração de Vídeo

Un video es un tensor 3-D, mientras que una imagen es 2-D. La teoría es la misma; la computación es entre 10 y 100 veces más difícil. Sora de OpenAI (febrero de 2024) demostró que era posible. Para 2026, Veo 2, Kling 1.5, Runway Gen-3, Pika 2.0 y WAN 2.2 entregan video en producción a partir de texto a 1080p, y la pila de pesos abiertos (CogVideoX, HunyuanVideo, Mochi-1, WAN 2.2) está 12 meses por detrás.

Tipo: Build Lenguajes: Python Prerrequisitos: Phase 8 · 07 (Latent Diffusion), Phase 7 · 09 (ViT), Phase 8 · 06 (DDPM) Tiempo: ~45 minutos

El Problema

Un video de 10 segundos a 1080p y 24 fps consta de 240 fotogramas de 1920×1080×3 píxeles. Eso representa aproximadamente 1.5 GB de datos brutos por clip. La difusión en el espacio de píxeles es inviable. Necesitas:

  1. Compresión espacio-temporal. Un VAE que codifique videos (no fotogramas individuales) en una secuencia de parches (patches) espacio-temporales.
  2. Coherencia temporal. Los fotogramas deben compartir contenido, iluminación e identidad de objetos a lo largo de los segundos. La red tiene que modelar el movimiento.
  3. Presupuesto de computación. El entrenamiento de video es de 10 a 100 veces más costoso que el de imágenes para el mismo tamaño de modelo.
  4. Condicionamiento. Texto, imagen (primer fotograma), audio u otro video. La mayoría de los modelos de producción aceptan los cuatro.

La arquitectura que resolvió esto es el Diffusion Transformer (DiT) aplicado a parches espacio-temporales, entrenado en conjuntos de dados gigantescos (prompt, descripción, video). Misma pérdida de difusión que en la Lição 06.

El Concepto

Video diffusion: patchify, DiT, decode

Patchify

Codifica el video con un VAE 3D (compresión espacio-temporal aprendida). El latente tiene la forma [T_latent, H_latent, W_latent, C_latent]. Divídelo en parches (patches) de tamaño [t_p, h_p, w_p]. Para modelos tipo Sora, t_p = 1 (parches por fotograma) o t_p = 2 (cada dos fotogramas). Un video de 10 segundos a 1080p se comprime a unos 20,000-100,000 parches.

DiT Espacio-Temporal

Un transformer procesa la secuencia aplanada de parches. Cada parche tiene una incrustación posicional (positional embedding) 3D (tiempo + y + x). La atención suele estar factorizada:

  • Atención espacial dentro de los parches de cada fotograma.
  • Atención temporal a través de fotogramas en la misma ubicación espacial.
  • Atención 3D completa es entre 16 y 100 veces más costosa; se usa solo en resoluciones bajas o en investigación.

Condicionamiento de texto

Atención cruzada (cross-attention) con un codificador de texto grande (T5-XXL para Sora, CogVideoX-5B usa T5-XXL). Los prompts largos importan: el conjunto de entrenamiento de Sora tenía re-etiquetados densos generados por GPT que promediaban 200 tokens por clip.

Entrenamiento

Pérdida de difusión estándar (predicción de ε o v) sobre latentes espacio-temporales. Datos: video de la web + ~100 millones de clips seleccionados + descripciones de texto sintéticas. Computación: más de 10,000 horas de GPU incluso para una ejecución pequeña de investigación; a la escala de Sora son más de 100,000 horas.

El panorama de producción en 2026

Modelo Fecha Duración máxima Res. máxima ¿Pesos abiertos? Destacado
Sora (OpenAI) 2024-02 60s 1080p No Primer modelo en mostrar propiedades de simulador de mundo a escala
Sora Turbo 2024-12 20s 1080p No Sora de producción con inferencia 5 veces más rápida
Veo 2 (Google) 2024-12 8s 4K No Máxima calidad + física en 2025
Veo 3 2025 Q3 15s 4K No Audio nativo y control de cámara más sólido
Kling 1.5 / 2.1 (Kuaishou) 2024-2025 10s 1080p No Mejor movimiento humano en el primer trimestre de 2025
Runway Gen-3 Alpha 2024-06 10s 768p No Herramientas profesionales de video integradas
Pika 2.0 2024-10 5s 1080p No Mayor consistencia de personajes
CogVideoX (THUDM) 2024 10s 720p Sí (2B, 5B) Primer modelo abierto a escala de 5B
HunyuanVideo (Tencent) 2024-12 5s 720p Sí (13B) SOTA abierto a finales de 2024
Mochi-1 (Genmo) 2024-10 5.4s 480p Sí (10B) Términos más permisivos
WAN 2.2 (Alibaba) 2025-07 5s 720p Modelo abierto más sólido a mediados de 2025

Los pesos abiertos están cerrando la brecha más rápido que en el espacio de imágenes: las LoRAs de HunyuanVideo + WAN 2.2 ya impulsan la mayoría de los flujos de trabajo de código abierto para mediados de 2026.

Implementación

El archivo code/main.py simula la idea central de DiT espacio-temporal: dividir en parches un pequeño video sintético, agregar una incrustación de posición (position embedding) por parche y eliminar el ruido de toda la secuencia con una atención estilo transformer sobre los parches. Sin numpy; Python puro. Demostramos que la coherencia temporal surge incluso en 1-D cuando los parches de fotogramas adyacentes comparten un eliminador de ruido (denoiser) y las incrustaciones de posición.

Paso 1: dividir en parches un "video" sintético 1-D

def make_video(T_frames=8, rng=None):
    # a "video" is a sequence of 1-D values following a smooth trajectory
    base = rng.gauss(0, 1)
    return [base + 0.3 * t + rng.gauss(0, 0.1) for t in range(T_frames)]

Paso 2: incrustación de posición por fotograma

def pos_embed(t, dim):
    return sinusoidal(t, dim)

Paso 3: el eliminador de ruido ve toda la secuencia

En lugar de eliminar el ruido de cada fotograma de manera independiente, nuestra pequeña red concatena todos los valores de los fotogramas + sus incrustaciones de posición y predice el ruido para todos los fotogramas de forma conjunta.

Paso 4: prueba de coherencia temporal

Después del entrenamiento, genera una muestra de video. Mide la variación (delta) fotograma a fotograma. Si el modelo ha aprendido la estructura temporal, las variaciones se mantendrán más pequeñas que si se muestreara cada fotograma de forma independiente.

Errores comunes

  • Muestreo independiente por fotograma = parpadeo (flicker). Si ejecutas la difusión de imágenes en cada fotograma por separado, la salida parpadeará porque el ruido de cada fotograma es independiente. La difusión de video soluciona esto acoplando los fotogramas mediante atención o ruido compartido.
  • Atención 3D ingenua = OOM (Falta de Memoria). La atención 3D completa en un latente de 10 segundos a 1080p requiere cientos de miles de millones de operaciones. Factorízala en atención espacial + temporal.
  • El etiquetado de los datos importa más que el tamaño. La principal mejora de Sora sobre los trabajos anteriores fue el entrenamiento con descripciones unas 10 veces más detalladas (clips re-etiquetados con GPT-4). El informe técnico de OpenAI es explícito en este punto.
  • Condicionamiento del primer fotograma. La mayoría de los modelos de producción también aceptan una imagen como primer fotograma. Este es el modo "imagen a video" (image-to-video); el entrenamiento incluye esta variante.
  • Desviación de la física (physics drift). Los clips largos (>10s) acumulan inconsistencias sutiles. La generación con ventana deslizante (sliding-window) + el anclaje de fotogramas clave (keyframes) ayudan a solucionarlo.

Cómo usarlo

Caso de uso Elección para 2026
Texto a video de mayor calidad, alojado Veo 3 o Sora
Cinematográfico controlado por cámara Runway Gen-3 con pinceles de movimiento (motion brushes)
Consistência de personajes en diferentes clips Pika 2.0 o Kling 2.1
Pesos abiertos, ajuste fino (fine-tune) rápido WAN 2.2 + LoRA
Imagen a video WAN 2.2-I2V, Kling 2.1 I2V o Runway
Sincronización labial (lip sync) de audio a video Veo 3 (audio nativo) o un modelo dedicado de sincronización labial
Edición de video Runway Act-Two, Kling Motion Brush, Flux-Kontext (fotograma estático)

El costo por segundo de video en paridad de calidad ha disminuido 20 veces entre 2024 y 2026.

Producción

Guarda outputs/skill-video-brief.md. La habilidad recibe un informe de video (duración, relación de aspecto, estilo, plano de cámara, consistencia del sujeto, audio) y genera: modelo + alojamiento, estructura de prompts (lenguaje de cámara, descripción del sujeto, descriptores de movimiento), semilla (seed) + protocolo de reproducibilidad y una lista de verificación de garantía de calidad (QA checklist) a nivel de fotograma.

Ejercicios

  1. Fácil. En code/main.py, compara la variación (delta) fotograma a fotograma para (a) el muestreo independiente por fotograma y (b) el muestreo conjunto de la secuencia. Reporta la media y la varianza de las variaciones.
  2. Medio. Agrega una condición de primer fotograma: fija el fotograma 0 a un valor determinado y genera muestras para el resto. Mide cómo se prorroga o propaga el valor fijado.
  3. Difícil. Utiliza la biblioteca diffusers de HuggingFace para ejecutar CogVideoX-2B en una GPU local. Cronometra 20 pasos de inferencia en 720p para un clip de 6 segundos. Realiza un perfil de la atención espacio-temporal para identificar el cuello de botella.

Términos clave

Término Lo que la gente dice Lo que realmente significa
VAE de video "VAE 3D" Codificador que comprime (T, H, W, C) → latente espacio-temporal.
Patches "Los tokens" Bloques 3D de tamaño fijo del latente; entrada para el DiT.
Atención factorizada "Espacial + temporal" Ejecutar atención sobre el espacio, luego sobre el tiempo; omitir la atención 3D completa.
Imagen a video (I2V) "Animar esta foto" El modelo recibe una imagen + texto y genera un video que comienza a partir de ella.
Condicionamiento de fotogramas clave "Fotogramas de anclaje" Fijar fotogramas específicos para controlar el arco del video.
Pincel de movimiento (Motion brush) "Pista direccional" Entrada de interfaz de usuario donde el usuario dibuja vectores de movimiento sobre la imagen.
Re-etiquetado "Descripciones densas" Usar un LLM para volver a etiquetar clips de entrenamiento con prompts detallados.
Parpadeo (Flicker) "Artefacto temporal" Inconsistencia fotograma a fotograma; corregida con eliminación de ruido acoplada.

Nota de producción: los latentes de video son un problema de ancho de banda de memoria

Un clip de 10 segundos en 1080p a 24 fps equivale a 240 fotogramas × 1920 × 1080 × 3 ≈ 1.5 GB de píxeles brutos. Después de una compresión VAE de video de 4× (2 × espacial × 2 × temporal), el latente es de ~100 MB por solicitud. Al procesar esto a través de un DiT espacio-temporal durante 30 pasos con tamaño de lote (batch) 1, se mueven ~3 GB/paso a través de HBM; el cuello de botella es el ancho de banda de memoria, no los FLOPs.

Tres ajustes de producción, todos tomados directamente de la literatura de inferencia en producción (capítulo de inferencia):

  • TP a lo largo del DiT. Los modelos de texto a video suelen tener ≥10B de parámetros. TP=4 en 4 H100s es el estándar; PP=2 × TP=2 para modelos de la clase 405B. La la tencia por paso disminuye de forma casi lineal con el TP hasta alcanzar el límite del all-reduce.
  • Lote de fotogramas = lote continuo (continuous batching). En el momento de la generación, un video es conceptualmente un lote de fotogramas vinculados por atención. Se aplica el procesamiento de lotes continuo (in-flight scheduling): comienza a renderizar el fotograma t+1 mientras se devuelve o procesa el fotograma t-1, si la arquitectura del modelo permite la generación con ventana deslizante.
  • Caché de prefill a nivel de clip. Para imagen a video, el condicionamiento del primer fotograma es análogo al pre-llenado (prefill) de prompt de un LLM: calcúlalo una vez y reutilízalo en las pasadas del decodificador temporal. Esto es, en la práctica, un KV-cache para video.

Lecturas recomendadas

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