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:
- Compresión espacio-temporal. Un VAE que codifique videos (no fotogramas individuales) en una secuencia de parches (patches) espacio-temporales.
- 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.
- 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.
- 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
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 | Sí | 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
- 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. - 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.
- 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+1mientras se devuelve o procesa el fotogramat-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
- Brooks et al. (2024). Video generation models as world simulators — Sora technical report.
- Yang et al. (2024). CogVideoX: Text-to-Video Diffusion Models with An Expert Transformer — CogVideoX.
- Kong et al. (2024). HunyuanVideo: A Systematic Framework for Large Video Generative Models — HunyuanVideo.
- Genmo (2024). Mochi-1 Technical Report — Mochi-1.
- Alibaba (2025). WAN 2.2 — open SOTA mid-2025.
- Ho, Salimans, Gritsenko et al. (2022). Video Diffusion Models — the seminal video diffusion paper.
- Blattmann et al. (2023). Align your Latents (Video LDM) — Stable Video Diffusion's ancestor.