Animaciones con IA usando ComfyUI y AnimateDiff en GPUs de 6GB
Esta guía detalla cómo configurar un pipeline completo para generar animaciones de personajes con IA, utilizando ComfyUI, AnimateDiff y LoRA entrenados con Kohya_ss, todo ejecutable en tarjetas gráficas con solo 6GB de VRAM bajo un entorno WSL/Ubuntu. Se cubren desde las instalaciones iniciales hasta la resolución de problemas comunes como distorsiones visuales y falta de coherencia entre fotogramas.
Preparación del entorno
Se requiere Ubuntu en WSL con Python 3.10 o superior. Con 6GB de memoria de video, la arquitectura SDXL queda fuera de alcance; Stable Diffusion 1.5 es la única opción viable.
Instalación de ComfyUI
cd ~
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI
pip install -r requirements.txt --break-system-packages
El flag --break-system-packages es necesario en WSL donde no se utiliza un entorno virtual aislado, permitiendo sortear la restricción PEP 668.
Complemento ComfyUI Manager
Este gestor de extensiones es imprescindible para administrar plugins:
cd ~/ComfyUI/custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Manager.git
Extensiones de AnimateDiff
Tres complementos son obligatorios para el funcionamiento completo:
cd ~/ComfyUI/custom_nodes
# Motor principal de animación
git clone https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved.git
# Manejo de entrada y salida de vídeo
git clone https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite.git
# Nodos de preprocesamiento para ControlNet (pose, profundidad)
git clone https://github.com/Fannovel16/comfyui_controlnet_aux.git
pip install -r comfyui_controlnet_aux/requirements.txt --break-system-packages
Descarga de modelos
Modelo base SD 1.5
La versión recortada (pruned-emaonly) ocupa aproximadamente 4GB, la mitad que la versión completa, sin pérdida apreciable de calidad:
cd ~/ComfyUI/models/checkpoints
wget https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors
Modelo de movimiento AnimateDiff
⚠️ Advertencia importante: al descargar desde hf-mirror, el archivo puede fragmentarse en dos: uno incompleto de ~142MB y otro completo de ~1.7GB con extensión .ckpt.1.
cd ~/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved/models
wget https://hf-mirror.com/guoyww/animatediff/resolve/main/mm_sd_v15_v2.ckpt
Para verificar y corregir:
ls -lh mm_sd_v15_v2.ckpt*
# Si el archivo .ckpt pesa solo 142MB, reemplazarlo:
mv mm_sd_v15_v2.ckpt mm_sd_v15_v2.ckpt.bak
mv mm_sd_v15_v2.ckpt.1 mm_sd_v15_v2.ckpt
Entrenamiento de LoRA con Kohya_ss
Un LoRA personalizado garantiza que el personaje mantenga consistencia visual a lo largo de todos los fotogramas.
Configuración de Kohya_ss
cd ~
git clone https://github.com/bmaltais/kohya_ss.git
cd kohya_ss
./setup.sh
Acceder a la interfaz web en http://127.0.0.1:7860.
Parámetros de entrenamiento
| Sección | Parámetro | Valor recomendado |
|---|---|---|
| Dreambooth/LoRA | Tipo de entrenamiento | LoRA |
| Carpetas | Directorio de imágenes | Tu carpeta de datos de entrenamiento |
| Carpetas | Directorio de salida | ~/mis_loras_output/ |
| Carpetas | Directorio de modelos base | ~/ComfyUI/models/checkpoints/ |
| Parámetros básicos | Tipo de LoRA | Standard |
| Parámetros básicos | Épocas | 10 |
| Parámetros avanzados | Rango de red | 32 |
Prepara entre 10 y 15 fotografías del personaje con distintos ángulos e iluminaciones. El archivo resultante (mi_personaje.safetensors) debe colocarse en ~/ComfyUI/models/loras/.
Construcción del flujo de trabajo en ComfyUI
Ejecutar ComfyUI:
cd ~/ComfyUI
python main.py --listen 0.0.0.0 --port 8188
En el navegador, abrir http://localhost:8188 y construir el grafo nodal paso a paso.
Fase 1: Carga del checkpoint y LoRA
- Añadir nodo
loaders → Load Checkpointy seleccionarv1-5-pruned-emaonly.safetensors - Añadir nodo
loaders → Load LoRA:- Conectar la salida MODEL del Checkpoint a la entrada model del LoRA
- Conectar la salida CLIP del Checkpoint a la entrada clip del LoRA
- Seleccionar
mi_personaje.safetensorsy fijarstrength_modelen0.8
Fase 2: Codificación de texto CLIP
Insertar dos nodos conditioning → CLIP Text Encode, ambos alimentados desde la salida CLIP del LoRA.
Prompt positivo:
1girl, a girl sitting at desk in dark office at night, computer screen light on face, short black hair, white shirt, tired expression, cinematic lighting, solo
Prompt negativo:
long hair, blonde, curly hair, 2girls, multiple people, ugly, deformed, blurry, low quality
Fase 3: Espacio latente
Usar AnimateDiff → ADE_EmptyLatentImageLarge:
width: 512height: 512batch_size: 24 (equivalente a 3 segundos a 8fps)
Fase 4: Carga del modelo de movimiento
Conectar AnimateDiff → ADE_AnimateDiffLoaderGen1:
- model procede de la salida del nodo LoRA
model_name:mm_sd_v15_v2.safetensorsbeta_schedule:autoselect
Fase 5: Muestreador
El nodo sampling → KSampler actúa como eje central del pipeline:
| Origen de conexión | Entrada del KSampler |
|---|---|
| AnimateDiff Loader → MODEL | model |
| CLIP positivo → CONDITIONING | positive |
| CLIP negativo → CONDITIONING | negative |
| Latente vacío → LATENT | latent_image |
Valores: seed=randomize, steps=20, cfg=7, sampler=euler, scheduler=simple, denoise=1
Fase 6: Decodificación y exportación
vae → VAE Decode: conectar la salida LATENT del KSampler a samples y la salida VAE del checkpoint a vaeVideoHelperSuite → VHS VideoCombine: conectar IMAGE del VAE Decode a imagesframe_rate: 8format:image/gifovideo/h264-mp4loop_count: 0save_output: activado
image → Preview Image: conectar la salida IMAGE del VideoCombine para vista previa
Pulsar Ctrl + Enter para iniciar la generación. Los archivos se guardan en ~/ComfyUI/output/.
Para enviar la salida directamente al escritorio de Windows desde WSL:
mkdir -p /mnt/c/Users/Usuario/Desktop/SalidaComfyUI
rm -rf ~/ComfyUI/output
ln -s /mnt/c/Users/Usuario/Desktop/SalidaComfyUI ~/ComfyUI/output
Resolución de problemas frecuentes
Archivo del modelo de movimiento incompleto
Síntoma: error al cargar el modelo o generación de fotogramas totalmente negros/ruidosos.
Causa: descarga interrumpida que deja un archivo parcial de ~142MB. El archivo completo se guarda con extensión .ckpt.1.
Solución: inspeccionar el tamaño con ls -lh; si pesa menos de 1GB, eliminarlo y renombrar el archivo .ckpt.1 a .ckpt.
Transiciones bruscas entre fotogramas
Síntoma: deformaciones del personaje y efectos de "derrretimiento" entre frames.
Causa: la ventana de contexto por defecto es demasiado reducida para mantener continuidad de movimiento.
Solución: añadir el nodo AnimateDiff → ADE_ContextOptions:
context_length:16context_stride:1context_overlap:4
Conectar su salida CONTEXT_OPTIONS a la entrada correspondiente del AnimateDiff Loader. Esto fuerza al modelo a procesar ventanas de 16 frames con 4 fotogramas de traslape, incrementando notablemente la coherencia temporal.
Personaje inestable a pesar del LoRA
Síntoma: el rostro varía entre fotogramas, especialmente en movimientos amplios.
Causa: solo se configuró strength_model pero no strength_clip. El parámetro CLIP controla cuánto enfluye el LoRA sobre la interpretación del texto; si es bajo, el prompt genérico ahoga las características del personaje.
Solución: igualar ambos valores en el nodo Load LoRA:
strength_model: 0.8
strength_clip: 0.8
Si persiste, reducir la intensidad del movimiento añadiendo AnimateDiff → ADE_AnimateDiffSettings con motion_scale: 0.7 (conectar a la entrada ad_settings del Loader). Valores entre 0.5 y 1.0 permiten equilibrar dinamismo y estabilidad.