Diffusers documentation
Stable Video Diffusion
Stable Video Diffusion
Stable Video Diffusion fue propuesto en Stable Video Diffusion: Scaling Latent Video Diffusion Models to Large Datasets por Andreas Blattmann, Tim Dockhorn, Sumith Kulal, Daniel Mendelevitch, Maciej Kilian, Dominik Lorenz, Yam Levi, Zion English, Vikram Voleti, Adam Letts, Varun Jampani, Robin Rombach.
El resumen del artículo es:
Presentamos Stable Video Diffusion, un modelo de difusión latente para video, orientado a la generación de texto a video e imagen a video en alta resolución y con resultados de última generación. Recientemente, los modelos de difusión latente entrenados para la síntesis de imágenes 2D se han convertido en modelos generativos de video mediante la inserción de capas temporales y su ajuste fino en conjuntos de datos de video pequeños y de alta calidad. Sin embargo, los métodos de entrenamiento en la literatura varían ampliamente y el campo aún no ha llegado a un acuerdo sobre una estrategia unificada para la curaduría de datos de video. En este artículo, identificamos y evaluamos tres etapas distintas para el entrenamiento exitoso de LDMs de video: preentrenamiento de texto a imagen, preentrenamiento de video y ajuste fino en video de alta calidad. Además, demostramos la necesidad de un conjunto de datos de preentrenamiento bien curado para generar videos de alta calidad y presentamos un proceso sistemático de curaduría para entrenar un modelo base sólido, que incluye estrategias de etiquetado y filtrado. A continuación, exploramos el impacto de ajustar nuestro modelo base con datos de alta calidad y entrenamos un modelo de texto a video que es competitivo con la generación de video de código cerrado. También mostramos que nuestro modelo base proporciona una representación de movimiento potente para tareas posteriores, como la generación de imagen a video, y una adaptabilidad a módulos LoRA específicos de movimiento de cámara. Finalmente, demostramos que nuestro modelo proporciona un fuerte prior 3D multivista y puede servir como base para ajustar un modelo de difusión multivista que genera conjuntamente múltiples vistas de objetos de manera feedforward, superando a los métodos basados en imágenes con una fracción de su presupuesto de cómputo. Publicamos el código y los pesos del modelo en esta https URL.
Echa un vistazo a la organización de Stability AI en el Hub para los puntos de control de base y extended frame!
Asegúrate de tener instaladas las siguientes bibliotecas.
# Uncomment to install the necessary libraries in Colab
!pip install -q -U diffusers transformers accelerateHay dos variantes de este modelo, SVD y SVD-XT. El checkpoint SVD está entrenado para generar 14 fotogramas y el checkpoint SVD-XT se ha afinado adicionalmente para generar 25 fotogramas.
Utilizarás el checkpoint SVD-XT para esta guía.
import torch
from diffusers import StableVideoDiffusionPipeline
from diffusers.utils import load_image, export_to_video
pipe = StableVideoDiffusionPipeline.from_pretrained(
"stabilityai/stable-video-diffusion-img2vid-xt", dtype=torch.float16, variant="fp16"
)
pipe.enable_model_cpu_offload()
# Load the conditioning image
image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/svd/rocket.png")
image = image.resize((1024, 576))
generator = torch.manual_seed(42)
frames = pipe(image, decode_chunk_size=8, generator=generator).frames[0]
export_to_video(frames, "generated.mp4", fps=7)
torch.compile
Puede obtener una aceleración del 20-25% a costa de un ligero aumento de memoria compilando el UNet.
- pipe.enable_model_cpu_offload()
+ pipe.to("cuda") # or "mps", "xpu", "cpu"
+ pipe.unet = torch.compile(pipe.unet, mode="reduce-overhead", fullgraph=True)Reducir el uso de memoria
La generación de vídeo consume mucha memoria porque, en esencia, se generan num_frames a la vez, de forma similar a la generación de imagen a partir de texto con un tamaño de lote alto. Para reducir el requisito de memoria, hay varias opciones que sacrifican la velocidad de inferencia a cambio de un menor consumo de memoria:
- habilitar el descargado del modelo: cada componente de la tubería se descarga a la CPU cuando ya no se necesita.
- habilitar el procesamiento por bloques de la capa feed-forward: la capa feed-forward se ejecuta en un bucle en lugar de realizar una única operación feed-forward con un tamaño de lote enorme.
- reduce
decode_chunk_size: el VAE decodifica los fotogramas en bloques en lugar de decodificarlos todos a la vez. Establecerdecode_chunk_size=1decodifica un fotograma a la vez y utiliza la menor cantidad de memoria (recomendamos ajustar este valor según la memoria de tu GPU), pero el video podría presentar algún parpadeo.
- pipe.enable_model_cpu_offload()
- frames = pipe(image, decode_chunk_size=8, generator=generator).frames[0]
+ pipe.enable_model_cpu_offload()
+ pipe.unet.enable_forward_chunking()
+ frames = pipe(image, decode_chunk_size=2, generator=generator, num_frames=25).frames[0]Usar todos estos trucos juntos debería reducir el requisito de memoria a menos de 8 GB de VRAM.
Micro-condicionamiento
Stable Diffusion Video también acepta micro-condicionamiento, además de la imagen de condicionamiento, lo que permite un mayor control sobre el video generado:
fps: los fotogramas por segundo del video generado.motion_bucket_id: el identificador de cubo de movimiento a utilizar para el video generado. Esto se puede usar para controlar el movimiento del video generado. Aumentar el identificador de cubo de movimiento aumenta el movimiento del video generado.noise_aug_strength: la cantidad de ruido que se añade a la imagen de condicionamiento. A mayor valor, menos se parecerá el video a la imagen de condicionamiento. Aumentar este valor también incrementa el movimiento del video generado.
Por ejemplo, para generar un video con más movimiento, utiliza los parámetros de microcondicionamiento motion_bucket_id y noise_aug_strength:
import torch
from diffusers import StableVideoDiffusionPipeline
from diffusers.utils import load_image, export_to_video
pipe = StableVideoDiffusionPipeline.from_pretrained(
"stabilityai/stable-video-diffusion-img2vid-xt", dtype=torch.float16, variant="fp16"
)
pipe.enable_model_cpu_offload()
# Load the conditioning image
image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/svd/rocket.png")
image = image.resize((1024, 576))
generator = torch.manual_seed(42)
frames = pipe(image, decode_chunk_size=8, generator=generator, motion_bucket_id=180, noise_aug_strength=0.1).frames[0]
export_to_video(frames, "generated.mp4", fps=7)
StableVideoDiffusionPipeline
clase diffusers.StableVideoDiffusionPipeline
< source >( vae: AutoencoderKLTemporalDecoderimage_encoder: CLIPVisionModelWithProjectionunet: UNetSpatioTemporalConditionModelscheduler: EulerDiscreteSchedulerfeature_extractor: CLIPImageProcessorPil )
Parámetros
- vae (
AutoencoderKLTemporalDecoder) — Modelo de Variational Auto-Encoder (VAE) para codificar y decodificar imágenes a partir de representaciones latentes. - image_encoder (CLIPVisionModelWithProjection) — Codificador de imágenes CLIP congelado (laion/CLIP-ViT-H-14-laion2B-s32B-b79K).
- unet (
UNetSpatioTemporalConditionModel) — UnUNetSpatioTemporalConditionModelpara desruidar los latentes de imagen codificados. - scheduler (EulerDiscreteScheduler) —
Un scheduler para usar en combinación con
unetpara desruidar los latentes de la imagen codificada. - feature_extractor (CLIPImageProcessor) —
Un
CLIPImageProcessorpara extraer características de las imágenes generadas.
Pipeline para generar video a partir de una imagen de entrada usando Stable Video Diffusion.
Este modelo hereda de DiffusionPipeline. Consulta la documentación de la clase superior para los métodos genéricos implementados en todas las tuberías (descarga, guardado, ejecución en un dispositivo específico, etc.).
StableVideoDiffusionPipelineOutput
clase diffusers.pipelines.stable_video_diffusion.StableVideoDiffusionPipelineOutput
< source >( frames: typing.Union[list[list[PIL.Image.Image]], numpy.ndarray, torch.Tensor] )
Clase de salida para el pipeline de Stable Video Diffusion.