Diffusers documentation
CogVideoX
CogVideoX
CogVideoX es un modelo de generación de video a partir de texto centrado en la creación de videos más coherentes y alineados con un prompt. Lo logra mediante varios métodos.
un autoencoder variacional 3D que comprime videos espacial y temporalmente, mejorando la tasa de compresión y la precisión del video.
un bloque transformer experto para ayudar a alinear texto y video, y un módulo de atención completa 3D para capturar y crear videos espacial y temporalmente precisos.
La prueba real de la dimensión de instrucciones de video reveló que CogVideoX tiene buenos resultados en tema coherente, información dinámica, fondo coherente, información de objetos, movimiento fluido, color, escena, estilo de apariencia y estilo temporal, pero no logra buenos resultados con la acción humana, la relación espacial y múltiples objetos.
El ajuste fino con Diffusers puede ayudar a compensar estos resultados deficientes.
Preparación de datos
Los scripts de entrenamiento aceptan datos en dos formatos.
El primer formato es adecuado para el entrenamiento a pequeña escala, y el segundo formato utiliza un formato CSV, que es más apropiado para el procesamiento de datos en streaming para el entrenamiento a gran escala. En el futuro, Diffusers admitirá la etiqueta <Video>.
Formato pequeño
Dos archivos, donde uno contiene prompts separados por líneas y el otro contiene rutas separadas por líneas hacia los datos de video (la ruta a los archivos de video debe ser relativa a la ruta que se pasa al especificar --instance_data_root). ¡Echemos un vistazo a un ejemplo para entenderlo mejor!
Supongamos que has especificado --instance_data_root como /dataset y que este directorio contiene los archivos: prompts.txt y videos.txt.
El archivo prompts.txt debe contener prompts separados por líneas:
A black and white animated sequence featuring a rabbit, named Rabbity Ribfried, and an anthropomorphic goat in a musical, playful environment, showcasing their evolving interaction.
A black and white animated sequence on a ship's deck features a bulldog character, named Bully Bulldoger, showcasing exaggerated facial expressions and body language. The character progresses from confident to focused, then to strained and distressed, displaying a range of emotions as it navigates challenges. The ship's interior remains static in the background, with minimalistic details such as a bell and open door. The character's dynamic movements and changing expressions drive the narrative, with no camera movement to distract from its evolving reactions and physical gestures.
...El archivo videos.txt debe contener rutas a archivos de video separadas por líneas. Tenga en cuenta que la ruta debe ser relativa al directorio --instance_data_root.
videos/00000.mp4
videos/00001.mp4
...En general, así se vería tu conjunto de datos si ejecutaras el comando tree en el directorio raíz del conjunto de datos:
/dataset
├── prompts.txt
├── videos.txt
├── videos
├── videos/00000.mp4
├── videos/00001.mp4
├── ...Al usar este formato, --caption_column debe ser prompts.txt y --video_column debe ser videos.txt.
Formato de transmisión
Podrías usar un único archivo CSV. Por el bien de este ejemplo, asume que tienes un archivo metadata.csv. El formato esperado es:
<CAPTION_COLUMN>,<PATH_TO_VIDEO_COLUMN>
"""A black and white animated sequence featuring a rabbit, named Rabbity Ribfried, and an anthropomorphic goat in a musical, playful environment, showcasing their evolving interaction.""","""00000.mp4"""
"""A black and white animated sequence on a ship's deck features a bulldog character, named Bully Bulldoger, showcasing exaggerated facial expressions and body language. The character progresses from confident to focused, then to strained and distressed, displaying a range of emotions as it navigates challenges. The ship's interior remains static in the background, with minimalistic details such as a bell and open door. The character's dynamic movements and changing expressions drive the narrative, with no camera movement to distract from its evolving reactions and physical gestures.""","""00001.mp4"""
...En este caso, --instance_data_root debe ser la ubicación donde se almacenan los videos y --dataset_name debe ser una ruta a una carpeta local o un conjunto de datos compatible con load_dataset alojado en el Hub. Si tienes videos de partidas de Minecraft en https://huggingface.co/datasets/my-awesome-username/minecraft-videos, debes especificar my-awesome-username/minecraft-videos.
Al usar este formato, --caption_column debe ser <CAPTION_COLUMN> y --video_column debe ser <PATH_TO_VIDEO_COLUMN>.
No se limita estrictamente al formato CSV. Cualquier formato es válido siempre que el método load_dataset admita el formato de archivo para cargar una columna básica <PATH_TO_VIDEO_COLUMN> y <CAPTION_COLUMN>. La razón para realizar estas acrobacias de organización de datos al cargar datos de video es que load_dataset no admite por completo todos los tipos de formatos de video.
CogVideoX funciona mejor con prompts largos y descriptivos, aumentados con LLM, para la generación de video. Recomendamos preprocesar los videos generando primero un resumen con un VLM y luego aumentando los prompts con un LLM. Para generar las descripciones anteriores, utilizamos MiniCPM-V-26 y Llama-3.1-8B-Instruct. Un ejemplo muy básico y sin adornos de este proceso está disponible aquí. La recomendación oficial para aumentar los prompts es ChatGLM y se considera adecuado un largo de 50 a 100 palabras.
![NOTE] Se espera que su conjunto de datos ya esté preprocesado. De lo contrario, se puede realizar un preprocesamiento básico manipulando los siguientes parámetros:
--height,--width,--fps,--max_num_frames,--skip_frames_starty--skip_frames_end. Actualmente, todos los videos de su conjunto de datos deben contener el mismo número de fotogramas de video al usar un tamaño de lote de entrenamiento > 1.
Entrenamiento
Debes configurar tu entorno de desarrollo instalando los requisitos necesarios. Los siguientes paquetes son obligatorios:
- Torch 2.0 o superior, según las funciones de entrenamiento que estés utilizando (es posible que se requieran las versiones más recientes o nocturnas para el entrenamiento cuantizado/deepspeed)
pip install diffusers transformers accelerate peft huggingface_hubpara todo lo relacionado con modelado y entrenamientopip install datasets decordpara cargar datos de entrenamiento de videopip install bitsandbytespara usar los optimizadores Adam o AdamW de 8 bits para un entrenamiento optimizado en memoriapip install wandbopcionalmente para supervisar los registros de entrenamientopip install deepspeedopcionalmente para el entrenamiento con DeepSpeedpip install prodigyoptopcionalmente, si deseas usar el optimizador Prodigy para el entrenamiento
Para asegurarse de que puede ejecutar correctamente las últimas versiones de los scripts de ejemplo, le recomendamos encarecidamente instalar desde el código fuente y mantener la instalación actualizada, ya que actualizamos los scripts de ejemplo con frecuencia e instalamos algunos requisitos específicos de cada ejemplo. Para hacer esto, ejecute los siguientes pasos en un nuevo entorno virtual:
Antes de ejecutar el script, asegúrate de instalar la biblioteca desde el código fuente:
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install -e .Luego, navegue a la carpeta de ejemplo que contiene el script de entrenamiento e instale las dependencias requeridas para el script que esté utilizando:
- PyTorch
cd examples/cogvideo
pip install -r requirements.txtY inicializa un entorno de 🤗 Accelerate con:
accelerate config
O para una configuración predeterminada de accelerate sin responder preguntas sobre su entorno
accelerate config default
O si tu entorno no admite una shell interactiva (p. ej., un notebook)
from accelerate.utils import write_basic_config
write_basic_config()Al ejecutar accelerate config, si usas torch.compile, es posible obtener mejoras de velocidad significativas. La biblioteca PEFT se utiliza como backend para el entrenamiento con LoRA, así que asegúrate de tener peft>=0.6.0 instalado en tu entorno.
Si deseas subir tu modelo al Hub después de completar el entrenamiento, con una tarjeta de modelo bien presentada, asegúrate de haber iniciado sesión:
hf auth login
# Alternatively, you could upload your model manually using:
# hf upload my-cool-account-name/my-cool-lora-name /path/to/awesome/loraAsegúrate de que tus datos estén preparados como se describe en Preparación de datos. Cuando estés listo, ¡puedes comenzar el entrenamiento!
Suponiendo que estás entrenando con 50 videos de un concepto similar, hemos encontrado que 1500-2000 pasos funcionan bien. Sin embargo, la recomendación oficial es de 100 videos con un total de 4000 pasos. Suponiendo que estás entrenando en una sola GPU con un --train_batch_size de 1:
- 1500 pasos en 50 videos corresponderían a
30épocas de entrenamiento - 4000 pasos en 100 vídeos corresponderían a
40épocas de entrenamiento
#!/bin/bash
GPU_IDS="0"
accelerate launch --gpu_ids $GPU_IDS examples/cogvideo/train_cogvideox_lora.py \
--pretrained_model_name_or_path THUDM/CogVideoX-2b \
--cache_dir <CACHE_DIR> \
--instance_data_root <PATH_TO_WHERE_VIDEO_FILES_ARE_STORED> \
--dataset_name my-awesome-name/my-awesome-dataset \
--caption_column <CAPTION_COLUMN> \
--video_column <PATH_TO_VIDEO_COLUMN> \
--id_token <ID_TOKEN> \
--validation_prompt "<ID_TOKEN> Spiderman swinging over buildings:::A panda, dressed in a small, red jacket and a tiny hat, sits on a wooden stool in a serene bamboo forest. The panda's fluffy paws strum a miniature acoustic guitar, producing soft, melodic tunes. Nearby, a few other pandas gather, watching curiously and some clapping in rhythm. Sunlight filters through the tall bamboo, casting a gentle glow on the scene. The panda's face is expressive, showing concentration and joy as it plays. The background includes a small, flowing stream and vibrant green foliage, enhancing the peaceful and magical atmosphere of this unique musical performance" \
--validation_prompt_separator ::: \
--num_validation_videos 1 \
--validation_epochs 10 \
--seed 42 \
--rank 64 \
--lora_alpha 64 \
--mixed_precision fp16 \
--output_dir /raid/aryan/cogvideox-lora \
--height 480 --width 720 --fps 8 --max_num_frames 49 --skip_frames_start 0 --skip_frames_end 0 \
--train_batch_size 1 \
--num_train_epochs 30 \
--checkpointing_steps 1000 \
--gradient_accumulation_steps 1 \
--learning_rate 1e-3 \
--lr_scheduler cosine_with_restarts \
--lr_warmup_steps 200 \
--lr_num_cycles 1 \
--enable_slicing \
--enable_tiling \
--optimizer Adam \
--adam_beta1 0.9 \
--adam_beta2 0.95 \
--max_grad_norm 1.0 \
--report_to wandbPara hacer un mejor seguimiento de nuestros experimentos de entrenamiento, estamos utilizando las siguientes banderas en el comando anterior:
--report_to wandbasegurará que las ejecuciones de entrenamiento se rastreen en Weights and Biases. Para usarlo, asegúrate de instalarwandbconpip install wandb.validation_promptyvalidation_epochspara permitir que el script realice algunas ejecuciones de inferencia de validación. Esto nos permite comprobar cualitativamente si el entrenamiento avanza como se espera.
No es necesario establecer el <ID_TOKEN>. Según algunas pruebas limitadas, hemos encontrado que funciona mejor (ya que se asemeja al entrenamiento de Dreambooth) que sin él. Cuando se proporciona, el <ID_TOKEN> se añade al principio de cada prompt. Por lo tanto, si tu <ID_TOKEN> era "DISNEY" y tu prompt era "Spiderman swinging over buildings", el prompt efectivo utilizado en el entrenamiento sería "DISNEY Spiderman swinging over buildings". Cuando no se proporciona, ya sea que entrenes sin ningún token adicional o que amplíes tu conjunto de datos para aplicar el token donde desees antes de comenzar el entrenamiento.
Puedes pasar
--use_8bit_adampara reducir los requisitos de memoria del entrenamiento.
Los siguientes ajustes se probaron en el momento de añadir el soporte para el entrenamiento de LoRA de CogVideoX:
- Nuestras pruebas se realizaron principalmente en CogVideoX-2b. Pronto trabajaremos en CogVideoX-5b y CogVideoX-5b-I2V
- Un conjunto de datos compuesto por 70 videos de entrenamiento con resoluciones de
200 x 480 x 720(F x H x W). A partir de este, mediante el uso de salto de fotogramas en la preprocesación de datos, creamos dos conjuntos de datos más pequeños de 49 y 16 fotogramas para una experimentación más rápida y porque el límite máximo recomendado por el equipo de CogVideoX es de 49 fotogramas. De los 70 videos, creamos tres grupos de 10, 25 y 50 videos. Todos los videos eran similares en cuanto a la naturaleza del concepto que se estaba entrenando.- Más de 25 videos funcionaron mejor para entrenar nuevos conceptos y estilos.
- Hemos encontrado que es mejor entrenar con un token de identificador que se puede especificar como
--id_token. Esto es similar al entrenamiento tipo Dreambooth, pero el ajuste fino normal sin dicho token también funciona.- El concepto entrenado parecía funcionar bastante bien cuando se combinaba con prompts completamente no relacionados. Esperamos obtener resultados aún mejores si se realiza un ajuste fino de CogVideoX-5B.
- El repositorio original utiliza un
lora_alphade1. Encontramos que esto no era adecuado en muchas ejecuciones, posiblemente debido a las diferencias en los backends de modelado y en la configuración de entrenamiento. Nuestra recomendación es establecer ellora_alphaenranko enrank // 2.- Si estás entrenando con datos cuyas descripciones generan malos resultados con el modelo original, un
rankde 64 o superior es adecuado y también es la recomendación del equipo detrás de CogVideoX. Si las generaciones ya son moderadamente buenas con tus descripciones de entrenamiento, unrankde 16/32 debería funcionar. Encontramos que establecer el rank demasiado bajo, por ejemplo4, no es ideal y no produce resultados prometedores.- Los autores de CogVideoX recomiendan 4000 pasos de entrenamiento y 100 videos de entrenamiento en total para lograr el mejor resultado. Si bien eso podría producir los mejores resultados, según nuestra experimentación limitada, 2000 pasos y 25 videos también podrían ser suficientes.
- Al usar el optimizador Prodigy para el entrenamiento, se pueden seguir las recomendaciones de este blog. Prodigy tiende a sobreajustarse rápidamente. En mis pruebas muy limitadas, encontré que una tasa de aprendizaje de
0.5es adecuada, además de--prodigy_use_bias_correction,prodigy_safeguard_warmupy--prodigy_decouple.- La tasa de aprendizaje recomendada por los autores de CogVideoX y según nuestra experimentación con Adam/AdamW está entre
1e-3y1e-4para un conjunto de datos de 25 o más videos.Tenga en cuenta que nuestras pruebas no son exhaustivas debido al tiempo limitado para la exploración. Nuestra recomendación sería experimentar con las distintas opciones y parámetros para encontrar la mejor configuración para sus datos.
Inferencia
Una vez que hayas entrenado un modelo lora, la inferencia se puede realizar simplemente cargando los pesos lora en el CogVideoXPipeline.
import torch
from diffusers import CogVideoXPipeline
from diffusers.utils import export_to_video
pipe = CogVideoXPipeline.from_pretrained("THUDM/CogVideoX-2b", dtype=torch.float16)
# pipe.load_lora_weights("/path/to/lora/weights", adapter_name="cogvideox-lora") # Or,
pipe.load_lora_weights("my-awesome-hf-username/my-awesome-lora-name", adapter_name="cogvideox-lora") # If loading from the HF Hub
pipe.to("cuda") # or "mps", "xpu", "cpu"
# Assuming lora_alpha=32 and rank=64 for training. If different, set accordingly
pipe.set_adapters(["cogvideox-lora"], [32 / 64])
prompt = "A vast, shimmering ocean flows gracefully under a twilight sky, its waves undulating in a mesmerizing dance of blues and greens. The surface glints with the last rays of the setting sun, casting golden highlights that ripple across the water. Seagulls soar above, their cries blending with the gentle roar of the waves. The horizon stretches infinitely, where the ocean meets the sky in a seamless blend of hues. Close-ups reveal the intricate patterns of the waves, capturing the fluidity and dynamic beauty of the sea in motion."
frames = pipe(prompt, guidance_scale=6, use_dynamic_cfg=True).frames[0]
export_to_video(frames, "output.mp4", fps=8)Reducir el uso de memoria
Durante las pruebas con la biblioteca diffusers, se habilitaron todas las optimizaciones incluidas en la biblioteca diffusers. Este esquema no se ha probado en cuanto al uso real de memoria en dispositivos fuera de las arquitecturas NVIDIA A100 / H100. En general, este esquema se puede adaptar a todos los dispositivos de la arquitectura NVIDIA Ampere y superiores. Si se deshabilitan las optimizaciones, el consumo de memoria se multiplicará, con un uso de memoria pico de aproximadamente 3 veces el valor de la tabla. Sin embargo, la velocidad aumentará aproximadamente 3-4 veces. Puede deshabilitar selectivamente algunas optimizaciones, entre ellas:
pipe.enable_sequential_cpu_offload()
pipe.vae.enable_slicing()
pipe.vae.enable_tiling()- Para la inferencia con múltiples GPU, la optimización
enable_sequential_cpu_offload()debe desactivarse. - El uso de modelos INT8 ralentizará la inferencia, lo cual se hace para adaptarse a GPUs con menos memoria manteniendo una pérdida mínima de calidad de video, aunque la velocidad de inferencia disminuirá significativamente.
- El modelo CogVideoX-2B se entrenó con precisión
FP16y todos los modelos CogVideoX-5B se entrenaron con precisiónBF16. Recomendamos usar la precisión con la que se entrenó el modelo para la inferencia. - PytorchAO y Optimum-quanto se pueden
utilizar para cuantizar los módulos del codificador de texto, el transformer y el VAE, reduciendo así los requisitos de memoria de CogVideoX. Esto
permite ejecutar el modelo en Colabs T4 gratuitos o en GPUs con menos memoria. Además, ten en cuenta que la cuantización de TorchAO es totalmente
compatible con
torch.compile, lo que puede mejorar significativamente la velocidad de inferencia. La precisión FP8 debe usarse en dispositivos con NVIDIA H100 o superior, lo que requiere la instalación desde el código fuente de los paquetes Pythontorch,torchao,diffusersyaccelerate. Se recomienda CUDA 12.4. - Las pruebas de velocidad de inferencia también utilizaron el esquema de optimización de memoria anterior. Sin la optimización de memoria, la velocidad de inferencia aumenta aproximadamente un 10%. Solo la versión del modelo de
diffusersadmite la cuantización. - El modelo solo admite entradas en inglés; otros idiomas pueden traducirse al inglés para su uso mediante refinamiento con un modelo de gran escala.
- El uso de memoria del ajuste fino del modelo se prueba en un entorno de
8 * H100y el programa utiliza automáticamente la optimizaciónZero 2. Si en la tabla se indica un número específico de GPUs, se deben usar ese número o más GPUs para el ajuste fino.
| Atributo | CogVideoX-2B | CogVideoX-5B |
|---|---|---|
| Nombre del modelo | CogVideoX-2B | CogVideoX-5B |
| Precisión de inferencia | FP16(Recomendado), BF16, FP32, FP8, INT8, INT4 no compatible | BF16 (recomendado), FP16, FP32, FP8*, INT8, INT4 no compatible |
| VRAM para inferencia en una sola GPU | FP16: Usando diffusers 12.5GBINT8: Usando diffusers con torchao 7.8GB | BF16: Usando diffusers 20.7GBINT8: Usando diffusers con torchao 11.4GB |
| VRAM para inferencia con múltiples GPU | FP16: Usando diffusers 10GB* | BF16: Uso de 15 GB con diffusers* |
| Velocidad de inferencia | Un solo A100: ~90 segundos, Un solo H100: ~45 segundos | Un solo A100: ~180 segundos, Un solo H100: ~90 segundos |
| Precisión del ajuste fino | FP16 | BF16 |
| Consumo de VRAM durante el ajuste fino | 47 GB (bs=1, LORA) 61 GB (bs=2, LORA) 62GB (bs=1, SFT) | 63 GB (bs=1, LORA) 80 GB (bs=2, LORA) 75GB (bs=1, SFT) |